]> git.sur5r.net Git - openldap/commitdiff
ITS#7476 Prevent EINTR from stopping otherwise successful connect
authorDavid Bender <codehero@yahoo.com>
Wed, 19 Dec 2012 07:34:30 +0000 (02:34 -0500)
committerHoward Chu <hyc@openldap.org>
Wed, 9 Jan 2013 17:11:35 +0000 (09:11 -0800)
libraries/libldap/os-ip.c

index c7dc719a7b386d6b9e62d3307cfc186044ec878b..b31e05dc9be58227710e18ed694af6b6c2e14427 100644 (file)
@@ -438,13 +438,21 @@ ldap_pvt_connect(LDAP *ld, ber_socket_t s,
        if ( opt_tv && ldap_pvt_ndelay_on(ld, s) == -1 )
                return ( -1 );
 
-       if ( connect(s, sin, addrlen) != AC_SOCKET_ERROR ) {
-               if ( opt_tv && ldap_pvt_ndelay_off(ld, s) == -1 )
-                       return ( -1 );
-               return ( 0 );
-       }
+       do{
+               osip_debug(ld, "attempting to connect: \n", 0, 0, 0);
+               if ( connect(s, sin, addrlen) != AC_SOCKET_ERROR ) {
+                       osip_debug(ld, "connect success\n", 0, 0, 0);
+
+                       if ( opt_tv && ldap_pvt_ndelay_off(ld, s) == -1 )
+                               return ( -1 );
+                       return ( 0 );
+               }
+               err = sock_errno();
+               osip_debug(ld, "connect errno: %d\n", err, 0, 0);
+
+       } while(err == EINTR &&
+               LDAP_BOOL_GET( &ld->ld_options, LDAP_BOOL_RESTART ));
 
-       err = sock_errno();
        if ( err != EINPROGRESS && err != EWOULDBLOCK ) {
                return ( -1 );
        }