[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.