Description: fix excessive random usage
Forwarded: a-del@iname.com on 2005-07-30
Author: Johannes Berg <johannes@sipsolutions.net>
Last-Update: 2005-07-28
Bug-Debian: http://bugs.debian.org/320307
--- a/rnd.c
+++ b/rnd.c
@@ -36,6 +36,7 @@
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/time.h>
+#include <fcntl.h>
 #include "rnd.h"
 
 #ifndef APG_USE_SHA 
@@ -176,25 +177,31 @@ x917sha1_rnd (void)
 void
 x917_setseed (UINT32 seed, int quiet)
 {
- FILE * dr;
+ int fd;
  UINT32 drs[2];
  UINT32 pid = 0;
 
  pid = (UINT32)getpid();
+ 
+ /* NOTE: this function intentionally does not use
+  *       the regular <stdio> API because fread may
+  *       read much more data than requested (up to
+  *       4K), which is extremely bad with /dev/random
+  */
 
- if ( (dr = fopen(APG_DEVRANDOM, "r")) != NULL)
+ if ( (fd = open(APG_DEVRANDOM, O_RDONLY)) != -1)
   {
-   (void)fread( (void *)&drs[0], 8, 1, dr);
+   read(fd, (void *)&drs[0], 8);
    __rnd_seed[0] = seed ^ drs[0];
    __rnd_seed[1] = seed ^ drs[1];
-   (void) fclose(dr);
+   close(fd);
   }
- else if ( (dr = fopen(APG_DEVURANDOM, "r")) != NULL)
+ else if ( (fd = open(APG_DEVURANDOM, O_RDONLY)) != -1)
   {
-   (void)fread( (void *)&drs[0], 8, 1, dr);
+   read(fd, &drs[0], 8);
    __rnd_seed[0] = seed ^ drs[0];
    __rnd_seed[1] = seed ^ drs[1];
-   (void) fclose(dr);
+   close(fd);
   }
  else
   {
