During TLS negotiation, if a timeout is set, ldap_int_tls_start sets the
socket to non-blocking and calls ldap_int_poll in a loop if
ldap_int_tls_connect does not succeed the first time it is called.
However, ldap_int_poll sets the socket back to blocking and we currently
do not set it back to non-blocking. This means that a subsequent call to
ldap_int_tls_connect may hang and the configured timeout will not be
enforced. To fix this, we now set the socket back to non-blocking after
ldap_int_poll is called.
ld->ld_errno = LDAP_TIMEOUT;
break;
}
+ /* ldap_int_poll switches the socket back to blocking, but we want
+ * it non-blocking before calling ldap_int_tls_connect */
+ ber_sockbuf_ctrl( sb, LBER_SB_OPT_SET_NONBLOCK, (void*)1 );
}
ret = ldap_int_tls_connect( ld, conn, host );
}