Просмотр исходного кода

[PATCH] rcu: Fix sign bug making rcu_random always return the same sequence

rcu_random uses a counter rrs_count to occasionally mix data from
get_random_bytes into the state of its pseudorandom generator.  However,
the rrs_counter gets declared as an unsigned long, and rcu_random checks
for --rrs_count < 0, so this code will never mix any real random data into
the state, and will thus always return the same sequence of random numbers.

Also, change the return value of rcu_random from long to unsigned long, to
avoid potential issues caused by the use of the % operator, which can
return negative values for negative left operands.

Signed-off-by: Josh Triplett <josh@freedesktop.org>
Acked-by: Paul E. McKenney <paulmck@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Josh Triplett 18 лет назад
Родитель
Сommit
75cfef32f2
1 измененных файлов с 2 добавлено и 2 удалено
  1. 2 2
      kernel/rcutorture.c

+ 2 - 2
kernel/rcutorture.c

@@ -147,7 +147,7 @@ rcu_torture_free(struct rcu_torture *p)
 
 
 struct rcu_random_state {
 struct rcu_random_state {
 	unsigned long rrs_state;
 	unsigned long rrs_state;
-	unsigned long rrs_count;
+	long rrs_count;
 };
 };
 
 
 #define RCU_RANDOM_MULT 39916801  /* prime */
 #define RCU_RANDOM_MULT 39916801  /* prime */
@@ -160,7 +160,7 @@ struct rcu_random_state {
  * Crude but fast random-number generator.  Uses a linear congruential
  * Crude but fast random-number generator.  Uses a linear congruential
  * generator, with occasional help from get_random_bytes().
  * generator, with occasional help from get_random_bytes().
  */
  */
-static long
+static unsigned long
 rcu_random(struct rcu_random_state *rrsp)
 rcu_random(struct rcu_random_state *rrsp)
 {
 {
 	long refresh;
 	long refresh;