On Fri, Sep 05, 2025 at 02:47:52PM +0530, venugopal chinnakotla wrote: > Hi Team, > > We are working on migration of nsldap C sdk to OpenLDAP C sdk for our > application client code. > > We are using OpenLDAP 2.6.7. > > As part of this migration activity,we used ldap_initialize() API for > initializing and getting LDAP Handle. Our application supports multi > threading. So, ldap_initialize() API will be called from multi threaded > code. For example, 2 threads will call ldap_initialize() at same > time/simultaneously. > > When 2 threads call ldap_initialize() at same time, sometimes observed a > race condition during this API call. Due to this, the next api calls > ldap_simple_bind_s or ldap_start_tls_s are getting failed for 2 threads and > it is not recovered automatically until restarts our applications. We > observed this race condition multiple times. > > Because of this issue, we are unable to start our application and it > becomes a blocker for us to proceed further. > > After checking ldap_initialze() API code from openldap source code, noticed > that race condition happened while initializing/setting global options. > > Are there any known issues with OpenLDAP when we use it in multi thread > supported applications? > > Could you please check and provide a solution.
Hi Venugopal, libldap documentation[0] explicitly asks that libldap initialisation be done in a thread safe way (=not concurrently as you're doing). Ignoring that (at your peril), you should be calling ldap_get/set_option() first to give the library a chance to initialise itself **before** you call ldap_initialize() to set up a new session, again as the documentation suggests. [0]. Quoting from https://openldap.org/software/man.cgi?query=ldap_initialize Note: the first call into the LDAP library also initializes the global options for the library. As such the first call should be single- threaded or otherwise protected to insure that only one call is active. It is recommended that ldap_get_option() or ldap_set_option() be used in the program's main thread before any additional threads are created. See ldap_get_option(3). Regards, -- Ondřej Kuzník Senior Software Engineer Symas Corporation http://www.symas.com Packaged, certified, and supported LDAP solutions powered by OpenLDAP
