mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-08 17:42:12 +03:00
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.
This commit is contained in:
@@ -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;
|
||||
|
Reference in New Issue
Block a user