diff options
author | eric <> | 2013-03-26 17:29:04 +0000 |
---|---|---|
committer | eric <> | 2013-03-26 17:29:04 +0000 |
commit | 90cfacf0af2e7ea39f3154ac0fd939d115ced46c (patch) | |
tree | 7a4e9ed9b80b12af61f4d3b39fd06f25b257decf | |
parent | 6dc75a457f873697edfd93f1a03194d5d8c01dd4 (diff) | |
download | openbsd-90cfacf0af2e7ea39f3154ac0fd939d115ced46c.tar.gz openbsd-90cfacf0af2e7ea39f3154ac0fd939d115ced46c.tar.bz2 openbsd-90cfacf0af2e7ea39f3154ac0fd939d115ced46c.zip |
protect the PRG state with a mutex in res_randomid().
ok deraadt@ guenther@ djm@
-rw-r--r-- | src/lib/libc/net/res_random.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/lib/libc/net/res_random.c b/src/lib/libc/net/res_random.c index f0beb7a573..d1cb0a0cf4 100644 --- a/src/lib/libc/net/res_random.c +++ b/src/lib/libc/net/res_random.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: res_random.c,v 1.17 2008/04/13 00:28:35 djm Exp $ */ | 1 | /* $OpenBSD: res_random.c,v 1.18 2013/03/26 17:29:04 eric Exp $ */ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de> | 4 | * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de> |
@@ -68,6 +68,8 @@ | |||
68 | #include <stdlib.h> | 68 | #include <stdlib.h> |
69 | #include <string.h> | 69 | #include <string.h> |
70 | 70 | ||
71 | #include "thread_private.h" | ||
72 | |||
71 | #define RU_OUT 180 /* Time after wich will be reseeded */ | 73 | #define RU_OUT 180 /* Time after wich will be reseeded */ |
72 | #define RU_MAX 30000 /* Uniq cycle, avoid blackjack prediction */ | 74 | #define RU_MAX 30000 /* Uniq cycle, avoid blackjack prediction */ |
73 | #define RU_GEN 2 /* Starting generator */ | 75 | #define RU_GEN 2 /* Starting generator */ |
@@ -225,8 +227,13 @@ u_int | |||
225 | res_randomid(void) | 227 | res_randomid(void) |
226 | { | 228 | { |
227 | struct timeval tv; | 229 | struct timeval tv; |
230 | u_int r; | ||
231 | _THREAD_PRIVATE_MUTEX(random); | ||
228 | 232 | ||
229 | gettimeofday(&tv, NULL); | 233 | gettimeofday(&tv, NULL); |
234 | |||
235 | _THREAD_PRIVATE_MUTEX_LOCK(random); | ||
236 | |||
230 | if (ru_counter >= RU_MAX || tv.tv_sec > ru_reseed) | 237 | if (ru_counter >= RU_MAX || tv.tv_sec > ru_reseed) |
231 | res_initid(); | 238 | res_initid(); |
232 | 239 | ||
@@ -234,7 +241,11 @@ res_randomid(void) | |||
234 | ru_x = (ru_a * ru_x + ru_b) % RU_M; | 241 | ru_x = (ru_a * ru_x + ru_b) % RU_M; |
235 | ru_counter++; | 242 | ru_counter++; |
236 | 243 | ||
237 | return permute15(ru_seed ^ pmod(ru_g, ru_seed2 + ru_x, RU_N)) | ru_msb; | 244 | r = permute15(ru_seed ^ pmod(ru_g, ru_seed2 + ru_x, RU_N)) | ru_msb; |
245 | |||
246 | _THREAD_PRIVATE_MUTEX_UNLOCK(random); | ||
247 | |||
248 | return (r); | ||
238 | } | 249 | } |
239 | 250 | ||
240 | #if 0 | 251 | #if 0 |