https://bugs.openldap.org/show_bug.cgi?id=10023
Issue ID: 10023
Summary: Asynchronous connects are broken
Product: OpenLDAP
Version: 2.5.14
Hardware: All
OS: All
Status: UNCONFIRMED
Keywords: needs_review
Severity: normal
Priority: ---
Component: libraries
Assignee: [email protected]
Reporter: [email protected]
Target Milestone: ---
We have a port of OpenLDAP client running in an embedded system, which is using
asynchronous connects to the LDAP server. We have been using OpenLDAP 2.4.40
for a long time, and I just upgraded it to use 2.5.14 (as the current LTS
release). After doing this, async connects to the LDAP server no longer work.
You can see this in the following debug output:
A successful async connect with 2.4.40:
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP Ian-DC1.sd80.com:389
ldap_pvt_gethostbyname_a: host=Ian-DC1.sd80.com, r=0
ldap_new_socket: 251
ldap_prepare_socket: 251
ldap_connect_to_host: Trying 192.168.168.3:389
ldap_pvt_connect: fd: 251 tm: 10 async: -1
ldap_ndelay_on: 251
attempting to connect:
connect errno: 115
ldap_int_poll: fd: -1 tm: 0
A failed async connect with 2.5.14:
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP Ian-DC1.sd80.com:389
ldap_pvt_gethostbyname_a: host=Ian-DC1.sd80.com, r=0
ldap_new_socket: 247
ldap_prepare_socket: 247
ldap_connect_to_host: Trying 10.21.61.3:389
ldap_pvt_connect: fd: 247 tm: 10 async: -1
ldap_ndelay_on: 247
attempting to connect:
connect errno: 115
ldap_open_defconn: successful
ldap_send_server_request
Sending Bind Request, len=0x6ca10c1f
ldap_write: want=63 error=Resource temporarily unavailable
Note that in both cases the connect attempt returns errno 115, EINPROGRESS,
meaning that it has not completed. But after that:
● 2.4.40 calls ldap_int_poll (via ldap_send_initial_request ->
ldap_int_check_async_open) to begin the wait for async completion.
● 2.5.14 instead reports a successful connect, and tries to send the bind which
fails since thre socket is not yet connected.
I tracked the problem down to a change made for ITS #8022 "an async connect may
still succeed immediately" in this commit:
https://git.openldap.org/openldap/openldap/-/commit/ae6347bac12bbf843678a838ca26089080705f81
That change in ldap_new_connection makes it set lconn_status for an async
connect to LDAP_CONNST_CONNECTED rather than LDAP_CONNST_CONNECTING if
ldap_int_open_connection returns 0. The problem is that
ldap_int_open_connection returns 0 after getting the EINPROGRESS.
ldap_connect_to_host returns -2 for the latter, but ldap_int_open_connection
doesn't check for that, returning 0 for any return code other than -1.
I think that the bug is actually in ldap_int_open_connection rather than in the
above commit. It should probably return -2 when ldap_connect_to_host returns
that.
--
You are receiving this mail because:
You are on the CC list for the issue.