[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
Re: FW: atexit-handler causes segfault when dlopen-ed libldap is unloaded prior to program termination (ITS#1577)
At 04:13 PM 2002-02-04, Howard Chu wrote:
>Perhaps we should instead have a public ldap_pvt_destroy() function that
>callers explicitly used to clean up the LDAP library?
My thoughts are to have a init()/destroy() function pair.
If the init() function is called as the first function,
then the atexit() handler will be avoided and a destroy()
call expected.
ldap_x_initialize();
ldap_x_destroy();
I suspect that dlopen/dlclose() provides a means for library
init/destroy routines to be called. A little glue would
be nice.
Kurt
> -- Howard Chu
> Chief Architect, Symas Corp. Director, Highland Sun
> http://www.symas.com http://highlandsun.com/hyc
> Symas: Premier OpenSource Development and Support
>
>-----Original Message-----
>From: owner-openldap-bugs@OpenLDAP.org
>[mailto:owner-openldap-bugs@OpenLDAP.org] On Behalf Of argggh@linpro.no
>Sent: Monday, February 04, 2002 1:24 AM
>To: openldap-its@OpenLDAP.org
>Subject: atexit-handler causes segfault when dlopen-ed libldap is
>unloaded prior to program termination (ITS#1577)
>
>
>Full_Name: Arne Georg Gleditsch
>Version: 2.0.21
>OS: GNU/Linux
>URL:
>Submission from: (NULL) (213.203.57.130)
>
>
>openldap-2.0.21/libraries/libldap/init.c contains the statement
>"atexit(ldap_int_destroy_global_options)". This causes programs
>that load and unload libldap using dlopen to segfault upon termination because
>one of the exit handlers reside in now unmapped memory. Trivial example
>program:
>
>#include <stdio.h>
>#include <dlfcn.h>
>
>int main() {
> void *(* ldap_init)(const char *, int);
> void *ldap = NULL;
> char *error;
>
> void *handle = dlopen("libldap.so.2", RTLD_LAZY);
>
> if (error = dlerror()) {
> printf("%s\n", error);
> exit();
> }
>
> ldap_init = dlsym(handle, "ldap_init");
> if (error = dlerror()) {
> printf("%s\n", error);
> exit();
> }
>
> printf("libldap loaded.\n");
>
> ldap_init("localhost", 389);
>
> dlclose(handle);
>
> printf("libldap unloaded.\n");
>}
>
>This is a real problem with pam-ldap, as su is now segfaulting at exit on my
>systems. Other services are likely affected as well.