]> 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:55:10 +0000 (01:55 +0000)
committerMark Andrews <marka@isc.org>
Mon, 21 May 2007 01:55:10 +0000 (01:55 +0000)
CHANGES
lib/isc/unix/socket.c

diff --git a/CHANGES b/CHANGES
index 831ea63ba231897f72b21326a028a0e856e8251c..0d06d3d7b6c88c81c8ec4a2855b184bbc3526161 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 367ce6ef6fea22f64bbe8dc097641293a0fa3f2d..65955da2fb585178ad190a1b9fe36671aaf4e264 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: socket.c,v 1.271 2007/04/02 02:03:55 marka Exp $ */
+/* $Id: socket.c,v 1.272 2007/05/21 01:55:10 marka Exp $ */
 
 /*! \file */
 
@@ -1475,6 +1475,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);
@@ -1484,6 +1485,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);
@@ -1498,6 +1500,8 @@ isc_socket_create(isc_socketmgr_t *manager, int pf, isc_sockettype_t type,
                INSIST(type != isc_sockettype_fdwatch);
                break;
        }
+       if (sock->fd == -1 && errno == EINTR && try++ < 42)
+               goto again;
 
 #ifdef F_DUPFD
        /*