From 49ebcb1aa2fa35b5bdb328d6464d2f32b6f899ce Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Mon, 21 May 2007 01:56:45 +0000 Subject: [PATCH] 2189. [bug] Handle socket() returning EINTR. [RT #15949] --- CHANGES | 2 ++ lib/isc/unix/socket.c | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 929ed39bf2..06904607de 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 1cdb9c0c1e..ea634f6734 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.207.2.19.2.29 2007/04/02 02:11:17 marka Exp $ */ +/* $Id: socket.c,v 1.207.2.19.2.30 2007/05/21 01:56:45 marka Exp $ */ #include @@ -1428,6 +1428,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); @@ -1437,6 +1438,7 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type, return (ret); sock->pf = pf; + again: switch (type) { case isc_sockettype_udp: sock->fd = socket(pf, SOCK_DGRAM, IPPROTO_UDP); @@ -1445,6 +1447,8 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type, sock->fd = socket(pf, SOCK_STREAM, IPPROTO_TCP); break; } + if (sock->fd == -1 && errno == EINTR && try++ < 42) + goto again; #ifdef F_DUPFD /*