summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreric <>2013-03-26 17:29:04 +0000
committereric <>2013-03-26 17:29:04 +0000
commit90cfacf0af2e7ea39f3154ac0fd939d115ced46c (patch)
tree7a4e9ed9b80b12af61f4d3b39fd06f25b257decf
parent6dc75a457f873697edfd93f1a03194d5d8c01dd4 (diff)
downloadopenbsd-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.c15
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
225res_randomid(void) 227res_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