mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-01-08 16:04:47 -05:00
ITS#8504 mdb_env_copyfd2(): Don't abort on SIGPIPE
Return EPIPE instead.
This commit is contained in:
parent
65e95ffccf
commit
3e7a8e26e6
1 changed files with 14 additions and 0 deletions
|
|
@ -160,6 +160,7 @@ typedef SSIZE_T ssize_t;
|
|||
|
||||
#ifndef _WIN32
|
||||
#include <pthread.h>
|
||||
#include <signal.h>
|
||||
#ifdef MDB_USE_POSIX_SEM
|
||||
# define MDB_USE_HASH 1
|
||||
#include <semaphore.h>
|
||||
|
|
@ -9786,10 +9787,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)
|
||||
|
||||
sigemptyset(&set);
|
||||
sigaddset(&set, SIGPIPE);
|
||||
#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);
|
||||
|
|
@ -9803,6 +9811,12 @@ again:
|
|||
DO_WRITE(rc, my->mc_fd, ptr, wsize, len);
|
||||
if (!rc) {
|
||||
rc = ErrCode();
|
||||
#ifndef _WIN32
|
||||
if (rc == EPIPE) {
|
||||
int tmp;
|
||||
sigwait(&set, &tmp);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
} else if (len > 0) {
|
||||
rc = MDB_SUCCESS;
|
||||
|
|
|
|||
Loading…
Reference in a new issue