diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libc/stdlib/random.c | 49 |
1 files changed, 14 insertions, 35 deletions
diff --git a/src/lib/libc/stdlib/random.c b/src/lib/libc/stdlib/random.c index e4ff07ea0c..cba088c751 100644 --- a/src/lib/libc/stdlib/random.c +++ b/src/lib/libc/stdlib/random.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: random.c,v 1.24 2014/10/13 20:54:13 chl Exp $ */ | 1 | /* $OpenBSD: random.c,v 1.25 2014/12/08 21:45:20 deraadt Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 1983 Regents of the University of California. | 3 | * Copyright (c) 1983 Regents of the University of California. |
| 4 | * All rights reserved. | 4 | * All rights reserved. |
| @@ -176,7 +176,7 @@ static int rand_type = TYPE_3; | |||
| 176 | static int rand_deg = DEG_3; | 176 | static int rand_deg = DEG_3; |
| 177 | static int rand_sep = SEP_3; | 177 | static int rand_sep = SEP_3; |
| 178 | 178 | ||
| 179 | static int use_arc4random; | 179 | static int random_deterministic; |
| 180 | 180 | ||
| 181 | _THREAD_PRIVATE_MUTEX(random); | 181 | _THREAD_PRIVATE_MUTEX(random); |
| 182 | static long random_l(void); | 182 | static long random_l(void); |
| @@ -203,7 +203,7 @@ srandom_l(unsigned int x) | |||
| 203 | int32_t test; | 203 | int32_t test; |
| 204 | div_t val; | 204 | div_t val; |
| 205 | 205 | ||
| 206 | use_arc4random = 0; | 206 | random_deterministic = 1; |
| 207 | if (rand_type == TYPE_0) | 207 | if (rand_type == TYPE_0) |
| 208 | state[0] = x; | 208 | state[0] = x; |
| 209 | else { | 209 | else { |
| @@ -231,39 +231,23 @@ srandom_l(unsigned int x) | |||
| 231 | void | 231 | void |
| 232 | srandom(unsigned int x) | 232 | srandom(unsigned int x) |
| 233 | { | 233 | { |
| 234 | LOCK(); | 234 | random_deterministic = 0; |
| 235 | srandom_l(x); | ||
| 236 | UNLOCK(); | ||
| 237 | } | 235 | } |
| 238 | 236 | ||
| 239 | #if defined(APIWARN) | ||
| 240 | __warn_references(srandom, | ||
| 241 | "warning: srandom() seed choices are invariably poor"); | ||
| 242 | #endif | ||
| 243 | |||
| 244 | /* | ||
| 245 | * srandomdev: | ||
| 246 | * | ||
| 247 | * Many programs choose the seed value in a totally predictable manner. | ||
| 248 | * This often causes problems. We seed the generator using random data. | ||
| 249 | * Note that this particular seeding procedure can generate states | ||
| 250 | * which are impossible to reproduce by calling srandom() with any | ||
| 251 | * value, since the succeeding terms in the state buffer are no longer | ||
| 252 | * derived from the LC algorithm applied to a fixed seed. | ||
| 253 | */ | ||
| 254 | void | 237 | void |
| 255 | srandomdev(void) | 238 | srandomdev(void) |
| 256 | { | 239 | { |
| 240 | random_deterministic = 0; /* back to the default */ | ||
| 241 | } | ||
| 242 | |||
| 243 | void | ||
| 244 | srandom_deterministic(unsigned int x) | ||
| 245 | { | ||
| 257 | LOCK(); | 246 | LOCK(); |
| 258 | use_arc4random = 1; | 247 | srandom_l(x); |
| 259 | UNLOCK(); | 248 | UNLOCK(); |
| 260 | } | 249 | } |
| 261 | 250 | ||
| 262 | #if defined(APIWARN) | ||
| 263 | __warn_references(srandomdev, | ||
| 264 | "warning: srandomdev() usage; consider switching to arc4random()"); | ||
| 265 | #endif | ||
| 266 | |||
| 267 | /* | 251 | /* |
| 268 | * initstate: | 252 | * initstate: |
| 269 | * | 253 | * |
| @@ -289,7 +273,7 @@ initstate(u_int seed, char *arg_state, size_t n) | |||
| 289 | char *ostate = (char *)(&state[-1]); | 273 | char *ostate = (char *)(&state[-1]); |
| 290 | 274 | ||
| 291 | LOCK(); | 275 | LOCK(); |
| 292 | use_arc4random = 0; | 276 | random_deterministic = 1; |
| 293 | if (rand_type == TYPE_0) | 277 | if (rand_type == TYPE_0) |
| 294 | state[-1] = rand_type; | 278 | state[-1] = rand_type; |
| 295 | else | 279 | else |
| @@ -354,7 +338,7 @@ setstate(char *arg_state) | |||
| 354 | char *ostate = (char *)(&state[-1]); | 338 | char *ostate = (char *)(&state[-1]); |
| 355 | 339 | ||
| 356 | LOCK(); | 340 | LOCK(); |
| 357 | use_arc4random = 0; | 341 | random_deterministic = 1; |
| 358 | if (rand_type == TYPE_0) | 342 | if (rand_type == TYPE_0) |
| 359 | state[-1] = rand_type; | 343 | state[-1] = rand_type; |
| 360 | else | 344 | else |
| @@ -405,7 +389,7 @@ random_l(void) | |||
| 405 | { | 389 | { |
| 406 | int32_t i; | 390 | int32_t i; |
| 407 | 391 | ||
| 408 | if (use_arc4random) | 392 | if (random_deterministic == 0) |
| 409 | return arc4random() & 0x7fffffff; | 393 | return arc4random() & 0x7fffffff; |
| 410 | 394 | ||
| 411 | if (rand_type == TYPE_0) | 395 | if (rand_type == TYPE_0) |
| @@ -431,8 +415,3 @@ random(void) | |||
| 431 | UNLOCK(); | 415 | UNLOCK(); |
| 432 | return r; | 416 | return r; |
| 433 | } | 417 | } |
| 434 | |||
| 435 | #if defined(APIWARN) | ||
| 436 | __warn_references(random, | ||
| 437 | "warning: random() isn't random; consider using arc4random()"); | ||
| 438 | #endif | ||
