diff --git a/lib/sslgen.c b/lib/sslgen.c index a633b0c5d..dee06e89c 100644 --- a/lib/sslgen.c +++ b/lib/sslgen.c @@ -187,45 +187,43 @@ unsigned int Curl_rand(struct SessionHandle *data) { unsigned int r; static unsigned int randseed; - static bool seeded; + static bool seeded = FALSE; -#ifdef have_curlssl_random - if(!data) { -#endif - - if(!seeded) { - -#ifdef RANDOM_FILE - /* if there's a random file to read a seed from, use it */ - int fd = open(RANDOM_FILE, O_RDONLY); - seeded = TRUE; - if(fd > -1) { - /* read random data into the randseed variable */ - read(fd, &randseed, sizeof(randseed)); - close(fd); - } - else -#endif /* RANDOM_FILE */ - { - struct timeval now = curlx_tvnow(); - randseed += (unsigned int) now.tv_usec + (unsigned int)now.tv_sec; - randseed = randseed * 1103515245 + 12345; - randseed = randseed * 1103515245 + 12345; - randseed = randseed * 1103515245 + 12345; - seeded = TRUE; - } - } - /* Return an unsigned 32-bit pseudo-random number. */ - r = randseed = randseed * 1103515245 + 12345; - return (r << 16) | ((r >> 16) & 0xFFFF); - -#ifdef have_curlssl_random - } - else { +#ifndef have_curlssl_random + (void)data; +#else + if(data) { Curl_ssl_random(data, (unsigned char *)&r, sizeof(r)); return r; } #endif + +#ifdef RANDOM_FILE + if(!seeded) { + /* if there's a random file to read a seed from, use it */ + int fd = open(RANDOM_FILE, O_RDONLY); + if(fd > -1) { + /* read random data into the randseed variable */ + ssize_t nread = read(fd, &randseed, sizeof(randseed)); + if(nread == sizeof(randseed)) + seeded = TRUE; + close(fd); + } + } +#endif + + if(!seeded) { + struct timeval now = curlx_tvnow(); + randseed += (unsigned int)now.tv_usec + (unsigned int)now.tv_sec; + randseed = randseed * 1103515245 + 12345; + randseed = randseed * 1103515245 + 12345; + randseed = randseed * 1103515245 + 12345; + seeded = TRUE; + } + + /* Return an unsigned 32-bit pseudo-random number. */ + r = randseed = randseed * 1103515245 + 12345; + return (r << 16) | ((r >> 16) & 0xFFFF); } #ifdef USE_SSL