diff options
| author | eric <> | 2013-03-26 17:29:04 +0000 |
|---|---|---|
| committer | eric <> | 2013-03-26 17:29:04 +0000 |
| commit | 487e58c6d4fb556b7aa0d89e39c11f57db15bdb7 (patch) | |
| tree | 7a4e9ed9b80b12af61f4d3b39fd06f25b257decf /src | |
| parent | 55c4ef087197a01b3d8704515ea99855e44a6fa2 (diff) | |
| download | openbsd-487e58c6d4fb556b7aa0d89e39c11f57db15bdb7.tar.gz openbsd-487e58c6d4fb556b7aa0d89e39c11f57db15bdb7.tar.bz2 openbsd-487e58c6d4fb556b7aa0d89e39c11f57db15bdb7.zip | |
protect the PRG state with a mutex in res_randomid().
ok deraadt@ guenther@ djm@
Diffstat (limited to 'src')
| -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 |
