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
This commit is contained in:
Lorenz Bauer 2016-10-20 09:51:22 +02:00 committed by Leo Yuriev
parent 70a138472b
commit b950e39c10

17
mdb.c
View File

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