util: unify how we see srand()

This commit is contained in:
Lennart Poettering 2014-10-30 15:35:37 +01:00
parent 97768fc574
commit ef309a681f
5 changed files with 34 additions and 26 deletions

View File

@ -480,7 +480,7 @@ int main(int argc, char *argv[]) {
log_parse_environment();
log_open();
srand(time(NULL));
initialize_srand();
r = parse_argv(argc, argv);
if (r <= 0)

View File

@ -2521,8 +2521,36 @@ int dev_urandom(void *p, size_t n) {
return 0;
}
void random_bytes(void *p, size_t n) {
void initialize_srand(void) {
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;
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
* get a PRNG instead. */
if (!srand_called) {
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;
}
initialize_srand();
for (q = p; q < (uint8_t*) p + n; q ++)
*q = rand();

View File

@ -321,6 +321,7 @@ int make_console_stdio(void);
int dev_urandom(void *p, size_t n);
void random_bytes(void *p, size_t n);
void initialize_srand(void);
static inline uint64_t random_u64(void) {
uint64_t u;

View File

@ -922,7 +922,7 @@ int main(int argc, char *argv[])
goto exit;
}
srand((unsigned int)getpid());
initialize_srand();
for (cnt = 20; cnt > 0; cnt--) {
struct timespec duration;

View File

@ -861,7 +861,7 @@ int scsi_get_serial(struct udev *udev,
int retval;
memzero(dev_scsi->serial, len);
srand((unsigned int)getpid());
initialize_srand();
for (cnt = 20; cnt > 0; cnt--) {
struct timespec duration;