]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2279. [bug] Use setsockopt(SO_NOSIGPIPE), when available,
authorMark Andrews <marka@isc.org>
Fri, 14 Dec 2007 03:52:40 +0000 (03:52 +0000)
committerMark Andrews <marka@isc.org>
Fri, 14 Dec 2007 03:52:40 +0000 (03:52 +0000)
                        to protect applications from receiving spurious
                        SIGPIPE signals when using the resolver.

CHANGES
lib/bind/resolv/res_send.c
lib/isc/unix/socket.c

diff --git a/CHANGES b/CHANGES
index 8e261d30b401bf13218e7b75609c6ce9751e1a3d..c1f683b3dc47b34ab76cf1c0b445be19f7b1d28f 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+2279.   [bug]           Use setsockopt(SO_NOSIGPIPE), when available,
+                       to protect applications from receiving spurious
+                       SIGPIPE signals when using the resolver.
+
 2278.  [bug]           win32: handle the case where Windows returns no
                        searchlist or DNS suffix. [RT #17354]
 
index 87aab5a51d9070001cc8e275ad90929104b72fc3..58f280fe38acdff4ac28033b7b1f6af8ff8c478f 100644 (file)
@@ -70,7 +70,7 @@
 
 #if defined(LIBC_SCCS) && !defined(lint)
 static const char sccsid[] = "@(#)res_send.c   8.1 (Berkeley) 6/4/93";
-static const char rcsid[] = "$Id: res_send.c,v 1.17 2006/10/16 22:54:38 marka Exp $";
+static const char rcsid[] = "$Id: res_send.c,v 1.18 2007/12/14 03:52:40 marka Exp $";
 #endif /* LIBC_SCCS and not lint */
 
 /*! \file
@@ -601,6 +601,9 @@ send_vc(res_state statp,
        u_short len;
        u_char *cp;
        void *tmp;
+#ifdef SO_NOSIGPIPE
+       int on = 1;
+#endif
 
        nsap = get_nsaddr(statp, ns);
        nsaplen = get_salen(nsap);
@@ -646,6 +649,17 @@ send_vc(res_state statp,
                                return (-1);
                        }
                }
+#ifdef SO_NOSIGPIPE
+               /*
+                * Disable generation of SIGPIPE when writing to a closed
+                * socket.  Write should return -1 and set errno to EPIPE
+                * instead. 
+                *
+                * Push on even if setsockopt(SO_NOSIGPIPE) fails.
+                */
+               (void)setsockopt(statp->_vcsock, SOL_SOCKET, SO_NOSIGPIPE, &on,
+                                sizeof(on));
+#endif
                errno = 0;
                if (connect(statp->_vcsock, nsap, nsaplen) < 0) {
                        *terrno = errno;
index 59d72d092015f8937ef8d3072f5c80053f13084f..38b73e7e08411603529184247ce122d06795792c 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: socket.c,v 1.274 2007/07/27 14:28:04 explorer Exp $ */
+/* $Id: socket.c,v 1.275 2007/12/14 03:52:40 marka Exp $ */
 
 /*! \file */
 
@@ -1584,6 +1584,20 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
        }
 #endif
 
+#ifdef SO_NOSIGPIPE
+       if (setsockopt(sock->fd, SOL_SOCKET, SO_NOSIGPIPE,
+                      (void *)&on, sizeof(on)) < 0) {
+               isc__strerror(errno, strbuf, sizeof(strbuf));
+               UNEXPECTED_ERROR(__FILE__, __LINE__,
+                                "setsockopt(%d, SO_NOSIGPIPE) %s: %s",
+                                sock->fd,
+                                isc_msgcat_get(isc_msgcat, ISC_MSGSET_GENERAL,
+                                               ISC_MSG_FAILED, "failed"),
+                                strbuf);
+               /* Press on... */
+       }
+#endif
+
 #if defined(USE_CMSG) || defined(SO_RCVBUF)
        if (type == isc_sockettype_udp) {