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.

Reply via email to