From 90cfacf0af2e7ea39f3154ac0fd939d115ced46c Mon Sep 17 00:00:00 2001 From: eric <> Date: Tue, 26 Mar 2013 17:29:04 +0000 Subject: protect the PRG state with a mutex in res_randomid(). ok deraadt@ guenther@ djm@ --- src/lib/libc/net/res_random.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'src/lib') 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 @@ -/* $OpenBSD: res_random.c,v 1.17 2008/04/13 00:28:35 djm Exp $ */ +/* $OpenBSD: res_random.c,v 1.18 2013/03/26 17:29:04 eric Exp $ */ /* * Copyright 1997 Niels Provos @@ -68,6 +68,8 @@ #include #include +#include "thread_private.h" + #define RU_OUT 180 /* Time after wich will be reseeded */ #define RU_MAX 30000 /* Uniq cycle, avoid blackjack prediction */ #define RU_GEN 2 /* Starting generator */ @@ -225,8 +227,13 @@ u_int res_randomid(void) { struct timeval tv; + u_int r; + _THREAD_PRIVATE_MUTEX(random); gettimeofday(&tv, NULL); + + _THREAD_PRIVATE_MUTEX_LOCK(random); + if (ru_counter >= RU_MAX || tv.tv_sec > ru_reseed) res_initid(); @@ -234,7 +241,11 @@ res_randomid(void) ru_x = (ru_a * ru_x + ru_b) % RU_M; ru_counter++; - return permute15(ru_seed ^ pmod(ru_g, ru_seed2 + ru_x, RU_N)) | ru_msb; + r = permute15(ru_seed ^ pmod(ru_g, ru_seed2 + ru_x, RU_N)) | ru_msb; + + _THREAD_PRIVATE_MUTEX_UNLOCK(random); + + return (r); } #if 0 -- cgit v1.2.3-55-g6feb