Commit da31aff2 authored by Mark Andrews's avatar Mark Andrews
Browse files

2279. [bug] Use setsockopt(SO_NOSIGPIPE), when available,

                        to protect applications from receiving spurious
                        SIGPIPE signals when using the resolver.
parent e8ca2abe
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]
......
......@@ -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;
......
......@@ -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) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment