util: unify how we see srand()
This commit is contained in:
parent
97768fc574
commit
ef309a681f
|
@ -480,7 +480,7 @@ int main(int argc, char *argv[]) {
|
||||||
log_parse_environment();
|
log_parse_environment();
|
||||||
log_open();
|
log_open();
|
||||||
|
|
||||||
srand(time(NULL));
|
initialize_srand();
|
||||||
|
|
||||||
r = parse_argv(argc, argv);
|
r = parse_argv(argc, argv);
|
||||||
if (r <= 0)
|
if (r <= 0)
|
||||||
|
|
|
@ -2521,8 +2521,36 @@ int dev_urandom(void *p, size_t n) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void random_bytes(void *p, size_t n) {
|
void initialize_srand(void) {
|
||||||
static bool srand_called = false;
|
static bool srand_called = false;
|
||||||
|
unsigned x;
|
||||||
|
#ifdef HAVE_SYS_AUXV_H
|
||||||
|
void *auxv;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (srand_called)
|
||||||
|
return;
|
||||||
|
|
||||||
|
x = 0;
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_AUXV_H
|
||||||
|
/* The kernel provides us with a bit of entropy in auxv, so
|
||||||
|
* let's try to make use of that to seed the pseudo-random
|
||||||
|
* generator. It's better than nothing... */
|
||||||
|
|
||||||
|
auxv = (void*) getauxval(AT_RANDOM);
|
||||||
|
if (auxv)
|
||||||
|
x ^= *(unsigned*) auxv;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
x ^= (unsigned) now(CLOCK_REALTIME);
|
||||||
|
x ^= (unsigned) gettid();
|
||||||
|
|
||||||
|
srand(x);
|
||||||
|
srand_called = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void random_bytes(void *p, size_t n) {
|
||||||
uint8_t *q;
|
uint8_t *q;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
@ -2533,28 +2561,7 @@ void random_bytes(void *p, size_t n) {
|
||||||
/* If some idiot made /dev/urandom unavailable to us, he'll
|
/* If some idiot made /dev/urandom unavailable to us, he'll
|
||||||
* get a PRNG instead. */
|
* get a PRNG instead. */
|
||||||
|
|
||||||
if (!srand_called) {
|
initialize_srand();
|
||||||
unsigned x = 0;
|
|
||||||
|
|
||||||
#ifdef HAVE_SYS_AUXV_H
|
|
||||||
/* The kernel provides us with a bit of entropy in
|
|
||||||
* auxv, so let's try to make use of that to seed the
|
|
||||||
* pseudo-random generator. It's better than
|
|
||||||
* nothing... */
|
|
||||||
|
|
||||||
void *auxv;
|
|
||||||
|
|
||||||
auxv = (void*) getauxval(AT_RANDOM);
|
|
||||||
if (auxv)
|
|
||||||
x ^= *(unsigned*) auxv;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
x ^= (unsigned) now(CLOCK_REALTIME);
|
|
||||||
x ^= (unsigned) gettid();
|
|
||||||
|
|
||||||
srand(x);
|
|
||||||
srand_called = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (q = p; q < (uint8_t*) p + n; q ++)
|
for (q = p; q < (uint8_t*) p + n; q ++)
|
||||||
*q = rand();
|
*q = rand();
|
||||||
|
|
|
@ -321,6 +321,7 @@ int make_console_stdio(void);
|
||||||
|
|
||||||
int dev_urandom(void *p, size_t n);
|
int dev_urandom(void *p, size_t n);
|
||||||
void random_bytes(void *p, size_t n);
|
void random_bytes(void *p, size_t n);
|
||||||
|
void initialize_srand(void);
|
||||||
|
|
||||||
static inline uint64_t random_u64(void) {
|
static inline uint64_t random_u64(void) {
|
||||||
uint64_t u;
|
uint64_t u;
|
||||||
|
|
|
@ -922,7 +922,7 @@ int main(int argc, char *argv[])
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
srand((unsigned int)getpid());
|
initialize_srand();
|
||||||
for (cnt = 20; cnt > 0; cnt--) {
|
for (cnt = 20; cnt > 0; cnt--) {
|
||||||
struct timespec duration;
|
struct timespec duration;
|
||||||
|
|
||||||
|
|
|
@ -861,7 +861,7 @@ int scsi_get_serial(struct udev *udev,
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
memzero(dev_scsi->serial, len);
|
memzero(dev_scsi->serial, len);
|
||||||
srand((unsigned int)getpid());
|
initialize_srand();
|
||||||
for (cnt = 20; cnt > 0; cnt--) {
|
for (cnt = 20; cnt > 0; cnt--) {
|
||||||
struct timespec duration;
|
struct timespec duration;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue