From 6222e736f15f325621c8c8c275b4cb03061afbbb Mon Sep 17 00:00:00 2001 From: caixianhong Date: Tue, 1 Jul 2025 16:26:30 +0800 Subject: [PATCH] [fix]The error handling method is more robust and has a stronger guarantee of randomness --- .../zookeeper-client-c/src/zookeeper.c | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/zookeeper-client/zookeeper-client-c/src/zookeeper.c b/zookeeper-client/zookeeper-client-c/src/zookeeper.c index c59da18a516..18e0eaa9830 100644 --- a/zookeeper-client/zookeeper-client-c/src/zookeeper.c +++ b/zookeeper-client/zookeeper-client-c/src/zookeeper.c @@ -16,6 +16,7 @@ * limitations under the License. */ +#include #if !defined(DLL_EXPORT) && !defined(USE_STATIC_LIB) # define USE_STATIC_LIB #endif @@ -718,7 +719,9 @@ static void setup_random() int seed; int fd = open("/dev/urandom", O_RDONLY); if (fd == -1) { - seed = getpid(); + struct timeval tv; + gettimeofday(&tv, NULL); + seed = getpid() ^ tv.tv_sec ^ tv.tv_usec; } else { int seed_len = 0; @@ -731,12 +734,22 @@ static void setup_random() * signal (errno == EINTR) in which case we need to retry. */ int rc = read(fd, (char *)&seed + seed_len, sizeof(seed) - seed_len); - assert(rc > 0 || errno == EINTR); - if (rc > 0) { - seed_len += rc; + if (rc <= 0) { + if (errno == EINTR) { + continue; + } + break; } + seed_len += rc; } close(fd); + + /* If not enough bytes are read, use a backup random source. */ + if (seed_len < sizeof(seed)) { + struct timeval tv; + gettimeofday(&tv, NULL); + seed ^= getpid() ^ tv.tv_sec ^ tv.tv_usec; + } } srandom(seed); srand48(seed);