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);