]> git.sur5r.net Git - openldap/commitdiff
/dev/urandom re-read(2) loop
authorKurt Zeilenga <kurt@openldap.org>
Mon, 3 Jun 2002 16:43:57 +0000 (16:43 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Mon, 3 Jun 2002 16:43:57 +0000 (16:43 +0000)
libraries/liblutil/entropy.c

index cd379c67246abdf878a57de454cef4123ba8aa20..74d3f3210ab8b875d5400428b230a376b47a061e 100644 (file)
@@ -36,21 +36,27 @@ int lutil_entropy( unsigned char *buf, ber_len_t nbytes )
        if( nbytes == 0 ) return 0;
 
 #ifdef URANDOM_DEVICE
+#define URANDOM_NREADS 4
        /* Linux and *BSD offer a urandom device */
        {
-               int rc, fd;
+               int rc, fd, n=0;
 
                fd = open( URANDOM_DEVICE, O_RDONLY );
 
                if( fd < 0 ) return -1;
 
-               rc = read( fd, buf, nbytes );
-               close(fd);
+               do {
+                       rc = read( fd, buf, nbytes );
+                       if( rc <= 0 ) break;
 
-               /* should return nbytes */
-               if( rc != nbytes ) return -1;
+                       buf+=rc;
+                       nbytes-=rc;
 
-               return 0;
+                       if( ++n >= URANDOM_NREADS ) break;
+               } while( nbytes > 0 );
+
+               close(fd);
+               return nbytes > 0 ? -1 : 0;
        }
 #elif PROV_RSA_FULL
        {