diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-06-02 19:19:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-06-02 19:19:47 -0400 |
commit | 5a4829b564d2f69574dc55bba2ada3ee72022187 (patch) | |
tree | e27a16b2a564ef9a2263ca7cef83165664912dea | |
parent | f219764920c3d235713566013375cc01decd3d49 (diff) | |
parent | 9dfa7bba35ac08a63565d58c454dccb7e1bb0a08 (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.c | 6 |
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) | |||
1097 | static __u32 get_reg(struct fast_pool *f, struct pt_regs *regs) | 1097 | static __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 | ||
1108 | void add_interrupt_randomness(int irq, int irq_flags) | 1112 | void add_interrupt_randomness(int irq, int irq_flags) |