From b950e39c10ace74431310a190aa3041adbd37d65 Mon Sep 17 00:00:00 2001 From: Lorenz Bauer Date: Thu, 20 Oct 2016 09:51:22 +0200 Subject: [PATCH] mdbx: backport - mdb_env_copyfd2(): Don't abort on SIGPIPE (ITS#8504). Return EPIPE instead. Never clear mc_error, we could lose a failure in the other thread. Change-Id: Ief08803ed56293309f07be116e69123c10907e77 --- mdb.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/mdb.c b/mdb.c index 81dea96e..4c2cd1ed 100644 --- a/mdb.c +++ b/mdb.c @@ -9072,6 +9072,14 @@ mdb_env_copythr(void *arg) int toggle = 0, wsize, rc = 0; int len; +#ifdef SIGPIPE + sigset_t set; + sigemptyset(&set); + sigaddset(&set, SIGPIPE); + if ((rc = pthread_sigmask(SIG_BLOCK, &set, NULL)) != 0) + my->mc_error = rc; +#endif + pthread_mutex_lock(&my->mc_mutex); for(;;) { while (!my->mc_new) @@ -9086,6 +9094,15 @@ again: len = write(my->mc_fd, ptr, wsize); if (len < 0) { rc = errno; +#ifdef SIGPIPE + 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); + } +#endif break; } else if (len > 0) { rc = MDB_SUCCESS;