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