detect DEV_RANDOM fopen failure and fall back, noting it in paniclog
This commit is contained in:
@@ -770,24 +770,30 @@ sys_random_seed()
|
||||
{
|
||||
unsigned long seed;
|
||||
unsigned long pid = (unsigned long) getpid();
|
||||
boolean no_seed = TRUE;
|
||||
#ifdef DEV_RANDOM
|
||||
FILE *fptr = NULL;
|
||||
|
||||
fptr = fopen(DEV_RANDOM, "r");
|
||||
if (fptr) {
|
||||
fread(&seed, sizeof(long), 1, fptr);
|
||||
has_strong_rngseed = TRUE;
|
||||
}
|
||||
fclose(fptr);
|
||||
#else
|
||||
seed = (unsigned long) getnow(); /* time((TIME_type) 0) */
|
||||
/* Quick dirty band-aid to prevent PRNG prediction */
|
||||
if (pid) {
|
||||
if (!(pid & 3L))
|
||||
pid -= 1L;
|
||||
seed *= pid;
|
||||
has_strong_rngseed = TRUE; /* decl.c */
|
||||
no_seed = FALSE;
|
||||
fclose(fptr);
|
||||
} else {
|
||||
/* leaves clue, doesn't exit */
|
||||
paniclog("sys_random_seed", "falling back to weak seed");
|
||||
}
|
||||
#endif
|
||||
if (no_seed) {
|
||||
seed = (unsigned long) getnow(); /* time((TIME_type) 0) */
|
||||
/* Quick dirty band-aid to prevent PRNG prediction */
|
||||
if (pid) {
|
||||
if (!(pid & 3L))
|
||||
pid -= 1L;
|
||||
seed *= pid;
|
||||
}
|
||||
}
|
||||
return seed;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user