From: Mark Andrews Date: Mon, 21 May 2007 01:57:16 +0000 (+0000) Subject: 2189. [bug] Handle socket() returning EINTR. [RT #15949] X-Git-Tag: v9.2.0b1^2~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8e2dc11955a007f7fb7a25db3a85a527e7af2198;p=thirdparty%2Fbind9.git 2189. [bug] Handle socket() returning EINTR. [RT #15949] --- diff --git a/CHANGES b/CHANGES index a0a75838686..fd1b66bc98b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,5 @@ +2189. [bug] Handle socket() returning EINTR. [RT #15949] + 2186. [port] cygwin: libbind: check for struct sockaddr_storage independently of IPv6. [RT #16482] diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index 68e4b95debf..459103b0bff 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.44 2007/04/02 02:11:52 marka Exp $ */ +/* $Id: socket.c,v 1.207.2.45 2007/05/21 01:57:16 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 /*