Patch "fix race in drivers/char/random.c:get_reg()" has been added to the 3.18-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
fix race in drivers/char/random.c:get_reg()
to the 3.18-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
fix-race-in-drivers-char-random.c-get_reg.patch
and it can be found in the queue-3.18 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Tue Apr 10 13:58:07 CEST 2018
From: Michael Schmitz <[email protected]>
Date: Sun, 30 Apr 2017 19:49:21 +1200
Subject: fix race in drivers/char/random.c:get_reg()
From: Michael Schmitz <[email protected]>
[ Upstream commit 9dfa7bba35ac08a63565d58c454dccb7e1bb0a08 ]
get_reg() can be reentered on architectures with prioritized interrupts (m68k in this case), causing f->reg_index to be incremented after the range check. Out of bounds memory access past the pt_regs struct results. This will go mostly undetected unless access is beyond end of memory.
Prevent the race by disabling interrupts in get_reg().
Tested on m68k (Atari Falcon, and ARAnyM emulator).
Kudos to Geert Uytterhoeven for helping to trace this race.
--- drivers/char/random.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/char/random.c +5 -1
@@ -863,12 +863,16 @@ static void add_interrupt_bench(cycles_tstatic __u32 get_reg (struct fast_pool *f,struct pt_regs *regs) {__u32 *ptr = (__u32 *) regs; +unsigned long flags;if (regs ==NULL )return 0 ; +local_irq_save (flags);if (f->reg_idx >=sizeof (struct pt_regs ) /sizeof (__u32)) f->reg_idx =0 ; -return *(ptr + f->reg_idx++); + ptr += f->reg_idx++; +local_irq_restore (flags); +return *ptr; }void add_interrupt_randomness (int irq,int irq_flags)
Patches currently in stable-queue which might be from [email protected] are
queue-3.18/fix-race-in-drivers-char-random.c-get_reg.patch