diff --git a/CHANGES b/CHANGES index 1660e9e210..e24e1fb41c 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,5 @@ +2189. [bug] Handle socket() returning EINTR. [RT #15949] + 2188. [contrib] queryperf: autoconf changes to make the search for libresolv or libbind more robust. [RT #16299] diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index 9d8f50db50..14a22c9053 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: socket.c,v 1.237.18.27 2007/04/02 02:10:51 marka Exp $ */ +/* $Id: socket.c,v 1.237.18.28 2007/05/21 01:56:11 marka Exp $ */ /*! \file */ @@ -1451,6 +1451,7 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type, #endif char strbuf[ISC_STRERRORSIZE]; const char *err = "socket"; + int try = 0; REQUIRE(VALID_MANAGER(manager)); REQUIRE(socketp != NULL && *socketp == NULL); @@ -1460,6 +1461,7 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type, return (result); sock->pf = pf; + again: switch (type) { case isc_sockettype_udp: sock->fd = socket(pf, SOCK_DGRAM, IPPROTO_UDP); @@ -1471,6 +1473,8 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type, sock->fd = socket(pf, SOCK_STREAM, 0); break; } + if (sock->fd == -1 && errno == EINTR && try++ < 42) + goto again; #ifdef F_DUPFD /*