aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-06-02 19:19:47 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-06-02 19:19:47 -0400
commit5a4829b564d2f69574dc55bba2ada3ee72022187 (patch)
treee27a16b2a564ef9a2263ca7cef83165664912dea
parentf219764920c3d235713566013375cc01decd3d49 (diff)
parent9dfa7bba35ac08a63565d58c454dccb7e1bb0a08 (diff)
Merge tag 'random_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/random
Pull /dev/random bug fix from Ted Ts'o: "Fix a race on architectures with prioritized interrupts (such as m68k) which can causes crashes in drivers/char/random.c:get_reg()" * tag 'random_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/random: fix race in drivers/char/random.c:get_reg()
-rw-r--r--drivers/char/random.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/char/random.c b/drivers/char/random.c
index 0ab024918907..a561f0c2f428 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -1097,12 +1097,16 @@ static void add_interrupt_bench(cycles_t start)
1097static __u32 get_reg(struct fast_pool *f, struct pt_regs *regs) 1097static __u32 get_reg(struct fast_pool *f, struct pt_regs *regs)
1098{ 1098{
1099 __u32 *ptr = (__u32 *) regs; 1099 __u32 *ptr = (__u32 *) regs;
1100 unsigned long flags;
1100 1101
1101 if (regs == NULL) 1102 if (regs == NULL)
1102 return 0; 1103 return 0;
1104 local_irq_save(flags);
1103 if (f->reg_idx >= sizeof(struct pt_regs) / sizeof(__u32)) 1105 if (f->reg_idx >= sizeof(struct pt_regs) / sizeof(__u32))
1104 f->reg_idx = 0; 1106 f->reg_idx = 0;
1105 return *(ptr + f->reg_idx++); 1107 ptr += f->reg_idx++;
1108 local_irq_restore(flags);
1109 return *ptr;
1106} 1110}
1107 1111
1108void add_interrupt_randomness(int irq, int irq_flags) 1112void add_interrupt_randomness(int irq, int irq_flags)