https://bugs.openldap.org/show_bug.cgi?id=10176

          Issue ID: 10176
           Summary: new atexit() call to atexit(ldap_exit_tls_destroy) in
                    2.5.17 crashes AIX application
           Product: OpenLDAP
           Version: 2.5.17
          Hardware: Other
                OS: Other
            Status: UNCONFIRMED
          Keywords: needs_review
          Severity: normal
          Priority: ---
         Component: libraries
          Assignee: [email protected]
          Reporter: [email protected]
  Target Milestone: ---

We have a long standing openldap application that's being ported from 2.4.58 to
2.5.17.
On ppc AIX (but not on linux for which we also build), when we exit the main
application we get a crash in exit() because it is trying to run the atexit
which LDAP regsitered, but ldap has already been unloaded and the unloading
caused that atexit function pointer to become zero.

So I tracked it to this line of code in ldap 2.5.17 that was not there in
2.4.58

libraries/libldap/tls2.c: atexit( ldap_exit_tls_destroy );

If I remove that line of code, my issue goes away.


So, now on to dlcose and atexit.


So we have a main kernel (irisdb), a C++ library (ldap.so) that we wrote that
calls ldap client libraries, and the 2 actual openldap libraries which ldap.so
is linked against.


During irisdb exit (the h command)

irisdb does call dlclose on ldap.so, which as a side effect results in the
unloading of the 2 official openldap libraries, but no one calls unatexit() (on
the 0x09001000a04947a8 below).


After the 3 libraries are unloaded, the atexit registration is still there but
its been replaced with zeroes. At what point in this process should we call
unatexit or some LDAP function and why does this sequence of events work right
on linux but not AIX?


[5] stop in ldap_unbind_s

(dbx) c

[1] stopped in unload_sharedlib at line 7793 in file
"/nethome/pmilosla/perforce/projects/OpenLDAP4/kernel/common/src/cdzf.c" ($t1)

 7793          if (!libptr)

(dbx) where

unload_sharedlib(libptr = 0x0000000000000004), line 7793 in "cdzf.c"

UnloadZFETable(zfetabdescp = 0x0a00010000032790), line 7346 in "cdzf.c"

ResetZFETable(), line 7940 in "cdzf.c"

zfrundown(), line 10135 in "cdzf.c"

chsub2(), line 3480 in "dmisc2.c"

chalt(flag = 1), line 3222 in "dmisc2.c"

Chaltcmd(), line 3146 in "dmisc2.c"

(dbx) p zfetabdescp->fnameptr

"/home/gavlak/gavlakcre7424/bin/ldap.so" 

(dbx) 0x09001000a04947a8/2x

0x09001000a04947a8: 0900 0000

(dbx) 0x09001000a04947a8/4x   

0x09001000a04947a8: 0900 0000 0491 8ec0

(dbx) c

[3] stopped in dlclose at 0x90000000029da40 ($t1)

0x90000000029da40 (dlclose)   7c0802a6          mflr  r0

(dbx) where

dlclose(0x4) at 0x90000000029da40

unload_sharedlib(libptr = 0x0000000000000004), line 7804 in "cdzf.c"

UnloadZFETable(zfetabdescp = 0x0a00010000032790), line 7346 in "cdzf.c"

ResetZFETable(), line 7940 in "cdzf.c"

zfrundown(), line 10135 in "cdzf.c"

chsub2(), line 3480 in "dmisc2.c"

chalt(flag = 1), line 3222 in "dmisc2.c"

Chaltcmd(), line 3146 in "dmisc2.c"

(dbx) p zfetabdescp->fnameptr

"/home/gavlak/gavlakcre7424/bin/ldap.so" 

(dbx) c

[2] stopped in exit at 0x9000000002524a0 ($t1)

0x9000000002524a0 (exit)   7c0802a6          mflr  r0

(dbx) 0x09001000a04947a8/4x

0x09001000a04947a8: 0000 0000 0000 0000

(dbx) c

Illegal instruction in . at 0x0 ($t1)
0x0000000000000000 00000000       Invalid opcode.
(dbx) where
.() at 0x0
exit(??) at 0x900000000252610
syshalt(a = 0), line 6925 in "emisc.c"
chalt(flag = 1), line 3227 in "dmisc2.c"
Chaltcmd(), line 3146 in "dmisc2.c"

-- 
You are receiving this mail because:
You are on the CC list for the issue.

Reply via email to