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:23:27 UTC
svn commit: r1718208 - in /zookeeper/branches/branch-3.5: CHANGES.txt
src/c/src/zookeeper.c
Author: rgs
Date: Sun Dec 6 19:23:27 2015
New Revision: 1718208
URL: http://svn.apache.org/viewvc?rev=1718208&view=rev
Log:
ZOOKEEPER-2311: assert in setup_random
(Marshall McMullen via rgs)
Modified:
zookeeper/branches/branch-3.5/CHANGES.txt
zookeeper/branches/branch-3.5/src/c/src/zookeeper.c
Modified: zookeeper/branches/branch-3.5/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/CHANGES.txt?rev=1718208&r1=1718207&r2=1718208&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/CHANGES.txt (original)
+++ zookeeper/branches/branch-3.5/CHANGES.txt Sun Dec 6 19:23:27 2015
@@ -71,6 +71,9 @@ BUGFIXES:
ZOOKEEPER-2335: Java Compilation Error in ClientCnxn.java
(Arshad Mohammad via rgs)
+ ZOOKEEPER-2311: assert in setup_random
+ (Marshall McMullen via rgs)
+
IMPROVEMENTS:
ZOOKEEPER-2270: Allow MBeanRegistry to be overridden for better unit tests
Modified: zookeeper/branches/branch-3.5/src/c/src/zookeeper.c
URL: http://svn.apache.org/viewvc/zookeeper/branches/branch-3.5/src/c/src/zookeeper.c?rev=1718208&r1=1718207&r2=1718208&view=diff
==============================================================================
--- zookeeper/branches/branch-3.5/src/c/src/zookeeper.c (original)
+++ zookeeper/branches/branch-3.5/src/c/src/zookeeper.c Sun Dec 6 19:23:27 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);