From 359653aaacad463d916323f03c0ac3c47405aafa Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Wed, 16 Jan 2019 18:10:56 +0000 Subject: [PATCH] Do not use HP_TIMING_NOW for random bits This patch removes the HP_TIMING_BITS usage for fast random bits and replace with clock_gettime (CLOCK_MONOTONIC). It has unspecified starting time and nano-second accuracy, so its randomness is significantly better than gettimeofday. Althoug it should incur in more overhead (specially for architecture that support hp-timing), the symbol is also common implemented as a vDSO. Checked on aarch64-linux-gnu, x86_64-linux-gnu, and i686-linux-gnu. I also checked on a i686-gnu build. * include/random-bits.h: New file. * resolv/res_mkquery.c [HP_TIMING_AVAIL] (RANDOM_BITS, (__res_context_mkquery): Remove usage hp-timing usage and replace with random_bits. * resolv/res_send.c [HP_TIMING_AVAIL] (nameserver_offset): Likewise. * sysdeps/posix/tempname.c [HP_TIMING_AVAIL] (__gen_tempname): Likewise. note that this patch is just parts of the origin one to adapt glibc-2.28  --- resolv/res_mkquery.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/resolv/res_mkquery.c b/resolv/res_mkquery.c index 213abeef..7ba40640 100644 --- a/resolv/res_mkquery.c +++ b/resolv/res_mkquery.c @@ -95,6 +95,7 @@ #include #include +#include #if HP_TIMING_AVAIL # define RANDOM_BITS(Var) { uint64_t v64; HP_TIMING_NOW (v64); Var = v64; } #endif @@ -124,9 +125,12 @@ __res_context_mkquery (struct resolv_context *ctx, int op, const char *dname, #ifdef RANDOM_BITS RANDOM_BITS (randombits); #else - struct timeval tv; - __gettimeofday (&tv, NULL); - randombits = (tv.tv_sec << 8) ^ tv.tv_usec; + struct timespec tv; + clock_gettime (CLOCK_MONOTONIC, &tv); + /* Shuffle the lower bits to minimize the clock bias. */ + uint32_t ret = tv.tv_nsec ^ tv.tv_sec; + ret ^= (ret << 24) | (ret >> 8); + randombits = ret; #endif hp->id = randombits; -- 2.19.1