You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by rg...@apache.org on 2015/12/06 20:21:07 UTC

svn commit: r1718207 - in /zookeeper/trunk: CHANGES.txt src/c/src/zookeeper.c

Author: rgs
Date: Sun Dec  6 19:21:07 2015
New Revision: 1718207

URL: http://svn.apache.org/viewvc?rev=1718207&view=rev
Log:
ZOOKEEPER-2311: assert in setup_random
(Marshall McMullen via rgs)

Modified:
    zookeeper/trunk/CHANGES.txt
    zookeeper/trunk/src/c/src/zookeeper.c

Modified: zookeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/trunk/CHANGES.txt?rev=1718207&r1=1718206&r2=1718207&view=diff
==============================================================================
--- zookeeper/trunk/CHANGES.txt (original)
+++ zookeeper/trunk/CHANGES.txt Sun Dec  6 19:21:07 2015
@@ -223,6 +223,9 @@ BUGFIXES:
   ZOOKEEPER-2330: ZooKeeper close API does not close Login thread
   (Arshad Mohammad via rgs)
 
+  ZOOKEEPER-2311: assert in setup_random
+  (Marshall McMullen via rgs)
+
 IMPROVEMENTS:
   ZOOKEEPER-1660 Documentation for Dynamic Reconfiguration (Reed Wanderman-Milne via shralex)  
 

Modified: zookeeper/trunk/src/c/src/zookeeper.c
URL: http://svn.apache.org/viewvc/zookeeper/trunk/src/c/src/zookeeper.c?rev=1718207&r1=1718206&r2=1718207&view=diff
==============================================================================
--- zookeeper/trunk/src/c/src/zookeeper.c (original)
+++ zookeeper/trunk/src/c/src/zookeeper.c Sun Dec  6 19:21:07 2015
@@ -533,8 +533,22 @@ static void setup_random()
     if (fd == -1) {
         seed = getpid();
     } else {
-        int rc = read(fd, &seed, sizeof(seed));
-        assert(rc == sizeof(seed));
+        int seed_len = 0;
+
+        /* Enter a loop to fill in seed with random data from /dev/urandom.
+         * This is done in a loop so that we can safely handle short reads
+         * which can happen due to signal interruptions.
+         */
+        while (seed_len < sizeof(seed)) {
+            /* Assert we either read something or we were interrupted due to a
+             * signal (errno == EINTR) in which case we need to retry.
+             */
+            int rc = read(fd, &seed + seed_len, sizeof(seed) - seed_len);
+            assert(rc > 0 || errno == EINTR);
+            if (rc > 0) {
+                seed_len += rc;
+            }
+        }
         close(fd);
     }
     srandom(seed);