]> granicus.if.org Git - nethack/commitdiff
detect DEV_RANDOM fopen failure and fall back, noting it in paniclog
authornhmall <nhmall@nethack.org>
Sat, 26 Jan 2019 16:26:02 +0000 (11:26 -0500)
committerPatric Mueller <bhaak@gmx.net>
Mon, 28 Jan 2019 09:32:57 +0000 (10:32 +0100)
sys/unix/unixmain.c

index 0a1f469a7a46d4a042a7b4ded3f2af0c8df21d30..1d6500b68cf371fdeac5688ba4a5518ba9fa4c21 100644 (file)
@@ -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;
 }