mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2025-11-21 17:06:43 +00:00
Rather than incurring a division or requesting too many random bytes for
the given range, use the prandom_u32_max() function, which only takes
the minimum required bytes from the RNG and avoids divisions. This was
done mechanically with this coccinelle script:
@basic@
expression E;
type T;
identifier get_random_u32 =~ "get_random_int|prandom_u32|get_random_u32";
typedef u64;
@@
(
- ((T)get_random_u32() % (E))
+ prandom_u32_max(E)
|
- ((T)get_random_u32() & ((E) - 1))
+ prandom_u32_max(E * XXX_MAKE_SURE_E_IS_POW2)
|
- ((u64)(E) * get_random_u32() >> 32)
+ prandom_u32_max(E)
|
- ((T)get_random_u32() & ~PAGE_MASK)
+ prandom_u32_max(PAGE_SIZE)
)
@multi_line@
identifier get_random_u32 =~ "get_random_int|prandom_u32|get_random_u32";
identifier RAND;
expression E;
@@
- RAND = get_random_u32();
... when != RAND
- RAND %= (E);
+ RAND = prandom_u32_max(E);
// Find a potential literal
@literal_mask@
expression LITERAL;
type T;
identifier get_random_u32 =~ "get_random_int|prandom_u32|get_random_u32";
position p;
@@
((T)get_random_u32()@p & (LITERAL))
// Add one to the literal.
@script:python add_one@
literal << literal_mask.LITERAL;
RESULT;
@@
value = None
if literal.startswith('0x'):
value = int(literal, 16)
elif literal[0] in '123456789':
value = int(literal, 10)
if value is None:
print("I don't know how to handle %s" % (literal))
cocci.include_match(False)
elif value == 2**32 - 1 or value == 2**31 - 1 or value == 2**24 - 1 or value == 2**16 - 1 or value == 2**8 - 1:
print("Skipping 0x%x for cleanup elsewhere" % (value))
cocci.include_match(False)
elif value & (value + 1) != 0:
print("Skipping 0x%x because it's not a power of two minus one" % (value))
cocci.include_match(False)
elif literal.startswith('0x'):
coccinelle.RESULT = cocci.make_expr("0x%x" % (value + 1))
else:
coccinelle.RESULT = cocci.make_expr("%d" % (value + 1))
// Replace the literal mask with the calculated result.
@plus_one@
expression literal_mask.LITERAL;
position literal_mask.p;
expression add_one.RESULT;
identifier FUNC;
@@
- (FUNC()@p & (LITERAL))
+ prandom_u32_max(RESULT)
@collapse_ret@
type T;
identifier VAR;
expression E;
@@
{
- T VAR;
- VAR = (E);
- return VAR;
+ return E;
}
@drop_var@
type T;
identifier VAR;
@@
{
- T VAR;
... when != VAR
}
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Yury Norov <yury.norov@gmail.com>
Reviewed-by: KP Singh <kpsingh@kernel.org>
Reviewed-by: Jan Kara <jack@suse.cz> # for ext4 and sbitmap
Reviewed-by: Christoph Böhmwalder <christoph.boehmwalder@linbit.com> # for drbd
Acked-by: Jakub Kicinski <kuba@kernel.org>
Acked-by: Heiko Carstens <hca@linux.ibm.com> # for s390
Acked-by: Ulf Hansson <ulf.hansson@linaro.org> # for mmc
Acked-by: Darrick J. Wong <djwong@kernel.org> # for xfs
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
|
||
|---|---|---|
| .. | ||
| syscalls | ||
| .gitignore | ||
| access-helper.h | ||
| asm-offsets.c | ||
| bmips_5xxx_init.S | ||
| bmips_vec.S | ||
| branch.c | ||
| cacheinfo.c | ||
| cevt-bcm1480.c | ||
| cevt-ds1287.c | ||
| cevt-gt641xx.c | ||
| cevt-r4k.c | ||
| cevt-sb1250.c | ||
| cevt-txx9.c | ||
| cmpxchg.c | ||
| cps-vec-ns16550.S | ||
| cps-vec.S | ||
| cpu-probe.c | ||
| cpu-r3k-probe.c | ||
| crash_dump.c | ||
| crash.c | ||
| csrc-bcm1480.c | ||
| csrc-ioasic.c | ||
| csrc-r4k.c | ||
| csrc-sb1250.c | ||
| early_printk_8250.c | ||
| early_printk.c | ||
| elf.c | ||
| entry.S | ||
| fpu-probe.c | ||
| fpu-probe.h | ||
| ftrace.c | ||
| genex.S | ||
| gpio_txx9.c | ||
| head.S | ||
| i8253.c | ||
| idle.c | ||
| irq_txx9.c | ||
| irq-gt641xx.c | ||
| irq-msc01.c | ||
| irq.c | ||
| jump_label.c | ||
| kgdb.c | ||
| kprobes.c | ||
| linux32.c | ||
| machine_kexec.c | ||
| Makefile | ||
| mcount.S | ||
| mips-cm.c | ||
| mips-cpc.c | ||
| mips-mt-fpaff.c | ||
| mips-mt.c | ||
| mips-r2-to-r6-emul.c | ||
| module.c | ||
| octeon_switch.S | ||
| perf_event_mipsxx.c | ||
| perf_event.c | ||
| perf_regs.c | ||
| pm-cps.c | ||
| pm.c | ||
| probes-common.h | ||
| proc.c | ||
| process.c | ||
| prom.c | ||
| ptrace32.c | ||
| ptrace.c | ||
| r4k_fpu.S | ||
| r4k_switch.S | ||
| r4k-bugs64.c | ||
| r2300_fpu.S | ||
| r2300_switch.S | ||
| relocate_kernel.S | ||
| relocate.c | ||
| reset.c | ||
| rtlx-cmp.c | ||
| rtlx-mt.c | ||
| rtlx.c | ||
| scall32-o32.S | ||
| scall64-n32.S | ||
| scall64-n64.S | ||
| scall64-o32.S | ||
| segment.c | ||
| setup.c | ||
| signal32.c | ||
| signal_n32.c | ||
| signal_o32.c | ||
| signal-common.h | ||
| signal.c | ||
| smp-bmips.c | ||
| smp-cmp.c | ||
| smp-cps.c | ||
| smp-mt.c | ||
| smp-up.c | ||
| smp.c | ||
| spinlock_test.c | ||
| spram.c | ||
| stacktrace.c | ||
| sync-r4k.c | ||
| syscall.c | ||
| sysrq.c | ||
| time.c | ||
| topology.c | ||
| traps.c | ||
| unaligned.c | ||
| uprobes.c | ||
| vdso.c | ||
| vmlinux.lds.S | ||
| vpe-cmp.c | ||
| vpe-mt.c | ||
| vpe.c | ||
| watch.c | ||