From: Hallvard Furuseth Date: Thu, 20 Oct 2016 07:51:22 +0000 (+0200) Subject: ITS#8504 Fix prev commit: mc_error, #ifdef SIGPIPE X-Git-Tag: LMDB_0.9.19~6 X-Git-Url: https://git.sur5r.net/?p=openldap;a=commitdiff_plain;h=bb08f63833536cf8dc30226b9b2271d87f8c0876 ITS#8504 Fix prev commit: mc_error, #ifdef SIGPIPE Never clear mc_error, we could lose a failure in the other thread. --- diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index 33c699883c..7a064f753d 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -8996,17 +8996,17 @@ mdb_env_copythr(void *arg) #define DO_WRITE(rc, fd, ptr, w2, len) rc = WriteFile(fd, ptr, w2, &len, NULL) #else int len; - sigset_t set; #define DO_WRITE(rc, fd, ptr, w2, len) len = write(fd, ptr, w2); rc = (len >= 0) - +#ifdef SIGPIPE + sigset_t set; sigemptyset(&set); sigaddset(&set, SIGPIPE); + if ((rc = pthread_sigmask(SIG_BLOCK, &set, NULL)) != 0) + my->mc_error = rc; +#endif #endif pthread_mutex_lock(&my->mc_mutex); -#ifndef _WIN32 - my->mc_error = pthread_sigmask(SIG_BLOCK, &set, NULL); -#endif for(;;) { while (!my->mc_new) pthread_cond_wait(&my->mc_cond, &my->mc_mutex); @@ -9020,8 +9020,11 @@ again: DO_WRITE(rc, my->mc_fd, ptr, wsize, len); if (!rc) { rc = ErrCode(); -#ifndef _WIN32 +#if defined(SIGPIPE) && !defined(_WIN32) if (rc == EPIPE) { + /* Collect the pending SIGPIPE, otherwise at least OS X + * gives it to the process on thread-exit (ITS#8504). + */ int tmp; sigwait(&set, &tmp); }