summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorderaadt <>2013-04-17 03:07:40 +0000
committerderaadt <>2013-04-17 03:07:40 +0000
commit67b38865feb6e8af34201cc2291c158d370887bd (patch)
tree7d75d061d9ac2b55e9f64127c311cdce5a585a1f
parentb3bb5c7891cd039f5ca62445da67469a2847fb52 (diff)
downloadopenbsd-67b38865feb6e8af34201cc2291c158d370887bd.tar.gz
openbsd-67b38865feb6e8af34201cc2291c158d370887bd.tar.bz2
openbsd-67b38865feb6e8af34201cc2291c158d370887bd.zip
use CLOCK_MONOTONIC, and repair future time_t overflow
ok millert guenther
-rw-r--r--src/lib/libc/net/res_random.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/lib/libc/net/res_random.c b/src/lib/libc/net/res_random.c
index d1cb0a0cf4..78cd2c3bb0 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.18 2013/03/26 17:29:04 eric Exp $ */ 1/* $OpenBSD: res_random.c,v 1.19 2013/04/17 03:07:40 deraadt 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>
@@ -100,7 +100,7 @@ static u_int16_t ru_g;
100static u_int16_t ru_counter = 0; 100static u_int16_t ru_counter = 0;
101static u_int16_t ru_msb = 0; 101static u_int16_t ru_msb = 0;
102static struct prf_ctx *ru_prf = NULL; 102static struct prf_ctx *ru_prf = NULL;
103static long ru_reseed; 103static time_t ru_reseed;
104 104
105static u_int16_t pmod(u_int16_t, u_int16_t, u_int16_t); 105static u_int16_t pmod(u_int16_t, u_int16_t, u_int16_t);
106static void res_initid(void); 106static void res_initid(void);
@@ -174,7 +174,7 @@ res_initid(void)
174 u_int16_t j, i; 174 u_int16_t j, i;
175 u_int32_t tmp; 175 u_int32_t tmp;
176 int noprime = 1; 176 int noprime = 1;
177 struct timeval tv; 177 struct timespec ts;
178 178
179 ru_x = arc4random_uniform(RU_M); 179 ru_x = arc4random_uniform(RU_M);
180 180
@@ -218,23 +218,23 @@ res_initid(void)
218 if (ru_prf != NULL) 218 if (ru_prf != NULL)
219 arc4random_buf(ru_prf, sizeof(*ru_prf)); 219 arc4random_buf(ru_prf, sizeof(*ru_prf));
220 220
221 gettimeofday(&tv, NULL); 221 clock_gettime(CLOCK_MONOTONIC, &ts);
222 ru_reseed = tv.tv_sec + RU_OUT; 222 ru_reseed = ts.tv_sec + RU_OUT;
223 ru_msb = ru_msb == 0x8000 ? 0 : 0x8000; 223 ru_msb = ru_msb == 0x8000 ? 0 : 0x8000;
224} 224}
225 225
226u_int 226u_int
227res_randomid(void) 227res_randomid(void)
228{ 228{
229 struct timeval tv; 229 struct timespec ts;
230 u_int r; 230 u_int r;
231 _THREAD_PRIVATE_MUTEX(random); 231 _THREAD_PRIVATE_MUTEX(random);
232 232
233 gettimeofday(&tv, NULL); 233 clock_gettime(CLOCK_MONOTONIC, &ts);
234 234
235 _THREAD_PRIVATE_MUTEX_LOCK(random); 235 _THREAD_PRIVATE_MUTEX_LOCK(random);
236 236
237 if (ru_counter >= RU_MAX || tv.tv_sec > ru_reseed) 237 if (ru_counter >= RU_MAX || ts.tv_sec > ru_reseed)
238 res_initid(); 238 res_initid();
239 239
240 /* Linear Congruential Generator */ 240 /* Linear Congruential Generator */