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

diff --git a/CHANGES b/CHANGES
index a0a7583868623c0fe876d4b826ab68c4aea611b9..fd1b66bc98b39617420fcb1428f10758bb595032 100644 (file)
--- 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]
 
index 68e4b95debf1f52a4bcab627b6972564b4667055..459103b0bff4228677698219026b3bce0e3bf2f6 100644 (file)
@@ -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 <config.h>
 
@@ -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
        /*