]> git.sur5r.net Git - openldap/commitdiff
ITS#8504 mdb_env_copyfd2(): Don't abort on SIGPIPE
authorLorenz Bauer <lmb@cloudflare.com>
Thu, 20 Oct 2016 07:51:22 +0000 (09:51 +0200)
committerHallvard Furuseth <hallvard@openldap.org>
Tue, 13 Dec 2016 17:47:13 +0000 (18:47 +0100)
Return EPIPE instead.

libraries/liblmdb/mdb.c

index 42452c2894f057dcb9459a4acf955e69a18019af..b87e576fda5913c89005352200c5690e1fa67ff5 100644 (file)
@@ -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;