diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2019-01-16 18:10:56 +0000 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2019-03-22 17:30:39 -0300 |
commit | 359653aaacad463d916323f03c0ac3c47405aafa (patch) | |
tree | a7d4de0a3e520ad4d62a2ed11bb63b55607fb160 /resolv | |
parent | 6e8ba7fd574f530afb9681f21604475d5756d773 (diff) | |
download | glibc-359653aaacad463d916323f03c0ac3c47405aafa.zip glibc-359653aaacad463d916323f03c0ac3c47405aafa.tar.gz glibc-359653aaacad463d916323f03c0ac3c47405aafa.tar.bz2 |
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.
Diffstat (limited to 'resolv')
-rw-r--r-- | resolv/res_mkquery.c | 19 | ||||
-rw-r--r-- | resolv/res_send.c | 12 |
2 files changed, 5 insertions, 26 deletions
diff --git a/resolv/res_mkquery.c b/resolv/res_mkquery.c index 19b8b40..dd43d34 100644 --- a/resolv/res_mkquery.c +++ b/resolv/res_mkquery.c @@ -82,6 +82,7 @@ * SOFTWARE. */ +#include <stdint.h> #include <sys/types.h> #include <sys/param.h> #include <netinet/in.h> @@ -92,12 +93,7 @@ #include <string.h> #include <sys/time.h> #include <shlib-compat.h> - -#include <hp-timing.h> -#include <stdint.h> -#if HP_TIMING_AVAIL -# define RANDOM_BITS(Var) { uint64_t v64; HP_TIMING_NOW (v64); Var = v64; } -#endif +#include <random-bits.h> int __res_context_mkquery (struct resolv_context *ctx, int op, const char *dname, @@ -120,16 +116,7 @@ __res_context_mkquery (struct resolv_context *ctx, int op, const char *dname, /* We randomize the IDs every time. The old code just incremented by one after the initial randomization which still predictable if the application does multiple requests. */ - int randombits; -#ifdef RANDOM_BITS - RANDOM_BITS (randombits); -#else - struct timeval tv; - __gettimeofday (&tv, NULL); - randombits = (tv.tv_sec << 8) ^ tv.tv_usec; -#endif - - hp->id = randombits; + hp->id = random_bits (); hp->opcode = op; hp->rd = (ctx->resp->options & RES_RECURSE) != 0; hp->rcode = NOERROR; diff --git a/resolv/res_send.c b/resolv/res_send.c index 0f6ec83..ca441c4 100644 --- a/resolv/res_send.c +++ b/resolv/res_send.c @@ -109,7 +109,7 @@ #include <unistd.h> #include <kernel-features.h> #include <libc-diag.h> -#include <hp-timing.h> +#include <random-bits.h> #if PACKETSZ > 65536 #define MAXPACKET PACKETSZ @@ -309,15 +309,7 @@ nameserver_offset (struct __res_state *statp) if ((offset & 1) == 0) { /* Initialization is required. */ -#if HP_TIMING_AVAIL - uint64_t ticks; - HP_TIMING_NOW (ticks); - offset = ticks; -#else - struct timeval tv; - __gettimeofday (&tv, NULL); - offset = ((tv.tv_sec << 8) ^ tv.tv_usec); -#endif + offset = random_bits (); /* The lowest bit is the most random. Preserve it. */ offset <<= 1; |