]> git.sur5r.net Git - openldap/commitdiff
ITS#8504 Fix prev commit: mc_error, #ifdef SIGPIPE
authorHallvard Furuseth <hallvard@openldap.org>
Thu, 20 Oct 2016 07:51:22 +0000 (09:51 +0200)
committerHallvard Furuseth <hallvard@openldap.org>
Tue, 13 Dec 2016 17:50:45 +0000 (18:50 +0100)
Never clear mc_error, we could lose a failure in the other thread.

libraries/liblmdb/mdb.c

index b87e576fda5913c89005352200c5690e1fa67ff5..9e0f90758873e74b4b798696c3c623c1181d9083 100644 (file)
@@ -9787,17 +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)
-
+#ifdef SIGPIPE
+       sigset_t set;
        sigemptyset(&set);
        sigaddset(&set, SIGPIPE);
+       if ((rc = pthread_sigmask(SIG_BLOCK, &set, NULL)) != 0)
+               my->mc_error = rc;
+#endif
 #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);
@@ -9811,8 +9811,11 @@ again:
                        DO_WRITE(rc, my->mc_fd, ptr, wsize, len);
                        if (!rc) {
                                rc = ErrCode();
-#ifndef _WIN32
+#if defined(SIGPIPE) && !defined(_WIN32)
                                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);
                                }