ITS#8504 mdb_env_copyfd2(): Don't abort on SIGPIPE

Return EPIPE instead.
mdb.RE/0.9
Lorenz Bauer 8 years ago committed by Hallvard Furuseth
parent e8e8293359
commit 894e88bf89
  1. 14
      libraries/liblmdb/mdb.c

@ -129,6 +129,7 @@ typedef SSIZE_T ssize_t;
#ifndef _WIN32 #ifndef _WIN32
#include <pthread.h> #include <pthread.h>
#include <signal.h>
#ifdef MDB_USE_POSIX_SEM #ifdef MDB_USE_POSIX_SEM
# define MDB_USE_HASH 1 # define MDB_USE_HASH 1
#include <semaphore.h> #include <semaphore.h>
@ -8995,10 +8996,17 @@ mdb_env_copythr(void *arg)
#define DO_WRITE(rc, fd, ptr, w2, len) rc = WriteFile(fd, ptr, w2, &len, NULL) #define DO_WRITE(rc, fd, ptr, w2, len) rc = WriteFile(fd, ptr, w2, &len, NULL)
#else #else
int len; int len;
sigset_t set;
#define DO_WRITE(rc, fd, ptr, w2, len) len = write(fd, ptr, w2); rc = (len >= 0) #define DO_WRITE(rc, fd, ptr, w2, len) len = write(fd, ptr, w2); rc = (len >= 0)
sigemptyset(&set);
sigaddset(&set, SIGPIPE);
#endif #endif
pthread_mutex_lock(&my->mc_mutex); pthread_mutex_lock(&my->mc_mutex);
#ifndef _WIN32
my->mc_error = pthread_sigmask(SIG_BLOCK, &set, NULL);
#endif
for(;;) { for(;;) {
while (!my->mc_new) while (!my->mc_new)
pthread_cond_wait(&my->mc_cond, &my->mc_mutex); pthread_cond_wait(&my->mc_cond, &my->mc_mutex);
@ -9012,6 +9020,12 @@ again:
DO_WRITE(rc, my->mc_fd, ptr, wsize, len); DO_WRITE(rc, my->mc_fd, ptr, wsize, len);
if (!rc) { if (!rc) {
rc = ErrCode(); rc = ErrCode();
#ifndef _WIN32
if (rc == EPIPE) {
int tmp;
sigwait(&set, &tmp);
}
#endif
break; break;
} else if (len > 0) { } else if (len > 0) {
rc = MDB_SUCCESS; rc = MDB_SUCCESS;

Loading…
Cancel
Save