X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblutil%2Fentropy.c;h=74d3f3210ab8b875d5400428b230a376b47a061e;hb=c0f8e30d2290b22718f3cfd6800679dfb4c253a9;hp=4a16c5dd1bd5c4340f54b5237aad8add2e52d5fd;hpb=e5eb270e6c04102f42545d34efdce318b439f5ab;p=openldap diff --git a/libraries/liblutil/entropy.c b/libraries/liblutil/entropy.c index 4a16c5dd1b..74d3f3210a 100644 --- a/libraries/liblutil/entropy.c +++ b/libraries/liblutil/entropy.c @@ -1,6 +1,6 @@ /* $OpenLDAP$ */ /* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT 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 {