X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Frand.c;h=1060e6519f0a23861db4e5f9d151ddb21835358e;hb=64e2556130a5220a09a770b85b442d0ff34bcbda;hp=6056e13c7391591003554675140319cea44813b6;hpb=ffb845b352dadf2a085b2b58aa3cb6c5d5ae4464;p=mono.git diff --git a/mono/metadata/rand.c b/mono/metadata/rand.c index 6056e13c739..1060e6519f0 100644 --- a/mono/metadata/rand.c +++ b/mono/metadata/rand.c @@ -6,8 +6,8 @@ * Patrik Torstensson (p@rxc.se) * Sebastien Pouliot (sebastien@ximian.com) * - * (C) 2001 Ximian, Inc. - * Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com) + * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com) + * Copyright 2004-2009 Novell, Inc (http://www.novell.com) */ #include @@ -15,7 +15,12 @@ #include #include #include +#ifdef HAVE_UNISTD_H #include +#endif +#ifdef HAVE_STRING_H +#include +#endif #include #include @@ -229,16 +234,20 @@ ves_icall_System_Security_Cryptography_RNGCryptoServiceProvider_RngGetBytes (gpo return NULL; get_entropy_from_server (socket_path, mono_array_addr (arry, guchar, 0), mono_array_length (arry)); return (gpointer) -1; - } - else { + } else { /* Read until the buffer is filled. This may block if using NAME_DEV_RANDOM. */ gint count = 0; gint err; do { err = read (file, buf + count, len - count); + if (err < 0) { + if (errno == EINTR) + continue; + break; + } count += err; - } while (err >= 0 && count < len); + } while (count < len); if (err < 0) { g_warning("Entropy error! Error in read (%s).", strerror (errno));