]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2189. [bug] Handle socket() returning EINTR. [RT #15949]
authorMark Andrews <marka@isc.org>
Mon, 21 May 2007 01:56:11 +0000 (01:56 +0000)
committerMark Andrews <marka@isc.org>
Mon, 21 May 2007 01:56:11 +0000 (01:56 +0000)
CHANGES
lib/isc/unix/socket.c

diff --git a/CHANGES b/CHANGES
index 1660e9e21087a360863d82fa234e3eae33c99ce9..e24e1fb41cf3be4d6d504f7d85b96825fe5a70dc 100644 (file)
--- 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]
 
index 9d8f50db502e2c9f886067660a877b9cd96362bd..14a22c905321b2be51fb67f33b150344122ffdf7 100644 (file)
@@ -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
        /*