sachidananda sahu wrote:
> many thanks for the information.
> Now have couple of queries.
>
> Then which call i should use to create the local context and destroy the tls context.
None. The context is created automatically and used as needed.
The context is per-process state, not per-thread state. No threads should be trying to destroy the context.
The reference implementations are in clients/tools in the source tree.
>
> Currently i was calling ldap_start_tls_s->ldap_int_tls_start->ldap_int_tls_connect : here it was doing ctx
> <http://opengrok-prd.eng.netapp.com/source/s?defs=ctx&project=dev>= ld <http://opengrok-prd.eng.netapp.com/source/s?defs=ld&project=dev>->ld_options
> <http://opengrok-prd.eng.netapp.com/source/s?defs=ld_options&project=dev>.ldo_tls_ctx
> <http://opengrok-prd.eng.netapp.com/source/s?defs=ldo_tls_ctx&project=dev>;, So as this connection is newly started and to add tls context over LDAP we call
> ldap_start_tls_s .....So when we should allocate the assign memory for this local context.
>
> Currently It;s going for alloc_handle and creating a default context using global and assigning it to local context.
>
> Similarly many places it access the global option->ldo_tls_ctx many places, which function we should use for the destory of the context, considering multiple
> threads are there and creating and destroying connection.
>
> If any reference implementation link also there, you can share.
>
> Many thanks Howard for your insights.
>
>
>
>
> On Tue, Aug 6, 2019 at 10:42 PM Howard Chu <hyc@symas.com <mailto:hyc@symas.com>> wrote:
>
> sachidananda sahu wrote:
> > Hi Howard,
> > Thanks for your response. I may be missing something, but let me share my thoughts based on code.
> >
> > ldap_set_option called from many threads, not only that even ldap_int_tls_connect, ldap_pvt_tls_init_def_ctx as multiple thread can connect to LDAP server.
> > Based on code lookup, i feel not every members of option structure is read only.
> >
> > Let's consider ldapoptions->ldo_tls_ctx which is global and can be used by many threads. Suppose there is two threads and thread A may be at point 1 and
> thread
> > B may be at point 2, based on scheduling chances of getting it messed is more, which problem i am facing now. Have a look and please share in case my
> > assumptions are wrong or i am missing something.
>
> init_def_ctx only gets called from alloc_handle() if there was no existing ctx.
> >
> > tls2.c
> > ---------------------------
> >
> > 1. Let's see where ldo_tls_ctx get allocated.
> > ldap_pvt_tls_init_def_ctx( int is_server )
>
> > 2. Let's see where it's getting freed. ldo_tls_ctx the same from global option context.
> >
> > *ldap_pvt_tls_destroy( void )*
> > {
> This is an OpenLDAP-specific private API. If you're calling this function, you're misusing the API.
>
> > On Tue, Aug 6, 2019 at 9:44 PM Howard Chu <hyc@symas.com <mailto:hyc@symas.com> <mailto:hyc@symas.com <mailto:hyc@symas.com>>> wrote:
> >
> > sachidananda sahu wrote:
> > > Hi All,
> > >
> > > Any one can give a thought on this ?
> >
> > Your problem description makes no sense. Unless you're explicitly calling ldap_set_option in multiple threads,
> > the option structure is read-only.
> >
> > The default libldap is not threadsafe, nor is it meant to be. You should probably be using libldap_r.
> > >
> > >
> > >
> > > On Thu, Aug 1, 2019 at 7:55 PM sachidananda sahu <sachi059@gmail.com <mailto:sachi059@gmail.com> <mailto:sachi059@gmail.com
> <mailto:sachi059@gmail.com>> <mailto:sachi059@gmail.com <mailto:sachi059@gmail.com> <mailto:sachi059@gmail.com <mailto:sachi059@gmail.com>>>>
> > wrote:
> > >
> > >
> > > Hi All,
> > >
> > > I recently upgraded to openldap 2.4.47, it's working with single threaded connection but with multi threaded getting problem due to global
> structure of
> > > ldapoptions in init.c
> > >
> > > -------------------------
> > > init.c
> > > -------------------------
> > >
> > > *struct* ldapoptions ldap_int_global_options =
> > > { LDAP_UNINITIALIZED , LDAP_DEBUG_NONE,
> > > LDAP_LDO_NULLARG ,
> > > LDAP_LDO_CONNECTIONLESS_NULLARG,
> > > LDAP_LDO_TLS_NULLARG,
> > > LDAP_LDO_SASL_NULLARG ,
> > > LDAP_LDO_GSSAPI_NULLARG,
> > > LDAP_LDO_MUTEX_NULLARG };,
> > >
> > >
> > > This global structure is accessed at multiple places (such as ldap_pvt_tls_init_def_ctx , alloc_handle, ldap_int_tls_connect ,
> *ldap_pvt_tls_destroy ,
> > ldap_ld_free*)
> > >
> > > in tls2.c using the macro lo = LDAP_INT_GLOBAL_OPT
> > > ();
> > >
> > > So in case of multi threaded application multiple ldap connection will be using this global structure, for example ldo_tls_ctx of lapoptions
> will be used.
> > > In one thread it can be creating a tls connection and in one it can be destroying the connection. As it's global so it is getting corrupted.
> > >
> > > Is openldap library thread safe completely ? Because this variable seems to be not for this tls context variable, is there any other way of
> using this
> > > context . As i can see a local variable ldo_tls_ctx exist in dap ld->ldc->ldap_options->ldo_tls_ctx structure, but it's just got assigned with
> the same
> > > address of global structure in ldap_int_tls_connect.
> > >
> > > So can someone share some thoughts on it ?
--
-- Howard Chu
CTO, Symas Corp. http://www.symas.com
Director, Highland Sun http://highlandsun.com/hyc/
Chief Architect, OpenLDAP http://www.openldap.org/project/