read_entropy_from_device on partial read will not fill buffer
authorEzra Peisach <epeisach@mit.edu>
Mon, 20 Aug 2007 14:50:41 +0000 (14:50 +0000)
committerEzra Peisach <epeisach@mit.edu>
Mon, 20 Aug 2007 14:50:41 +0000 (14:50 +0000)
read_entropy_from_device() will loop in read until the desired number
of bytes are read from the device (/dev/random, /dev/urandom).  I have
observed that for /dev/random, if there is not enough bits available
for reading - it will return a partial read.  The code would loop in
this case, but never advance the location to place the new bytes -
hence the start of the buffer would be filled again - leaving the tail
end as stack garbage.

ticket: new
tags: pullup

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@19845 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/crypto/prng.c

index 95d5868b722c06cb080b3e54b9e8f2f4777f9cb9..e1e34a2c3f70f1156ffce3c6c94993ae7e2187ac 100644 (file)
@@ -161,7 +161,7 @@ read_entropy_from_device (krb5_context context, const char *device)
   krb5_data data;
   struct stat sb;
   int fd;
-  unsigned char buf[YARROW_SLOW_THRESH/8];
+  unsigned char buf[YARROW_SLOW_THRESH/8], *bp;
   int left;
   fd = open (device, O_RDONLY);
   if (fd == -1)
@@ -172,14 +172,16 @@ read_entropy_from_device (krb5_context context, const char *device)
     close(fd);
     return 0;
   }
-  for (left = sizeof (buf); left > 0;) {
+
+  for (bp = &buf, left = sizeof (buf); left > 0;) {
     ssize_t count;
-    count = read (fd, &buf, (unsigned) left);
+    count = read (fd, bp, (unsigned) left);
     if (count <= 0) {
       close(fd);
       return 0;
     }
     left -= count;
+    bp += count;
   }
   close (fd);
   data.length = sizeof (buf);
@@ -198,7 +200,7 @@ krb5_c_random_os_entropy (krb5_context context,
   int unused;
   int *oursuccess = success?success:&unused;
   *oursuccess = 0;
-  /* If we are getting strong data then try that first.  We aare
+  /* If we are getting strong data then try that first.  We are
      guaranteed to cause a reseed of some kind if strong is true and
      we have both /dev/random and /dev/urandom.  We want the strong
      data included in the reseed so we get it first.*/