Thanks John for the useful response!
Yes we are using ldap at /opt/ldap because we are building it with our
SSL lib which is at /opt/ssl and it is OpenSSL 1.1.1. For the process,
/opt/ldap/lib and /opt/ssl/lib are set as preferred LD_LIBRARY_PATH.
This is the code of getRebindCredentials(). Let me know if you find
anything suspicious here.
int getRebindCredentials( LDAP *ld, LDAP_CONST char *url, ber_tag_t
request, ber_int_t msgid, void *params )
{
int rc;
const sec::LdapProvider* lLdapProvider = (sec::LdapProvider*)params;
//LdapProvider is the ldap config object
if(lLdapProvider->rootDn.getSize() == 0)
{
LOG(LOG_DEBUG3, "getRebindCredentials called - NULL DN");
rc = ldap_simple_bind_s(ld, NULL, NULL);
}
else
{
LOG(LOG_DEBUG3, "getRebindCredentials called - DN");
rc = ldap_simple_bind_s(ld,
lLdapProvider->rootDn.getBuffer(),
lLdapProvider->password.getBuffer());
LOG(LOG_DEBUG3, "getRebindCredentials called - DN:%s pass: %s",
lLdapProvider->rootDn.getBuffer(), lLdapProvider->password.getBuffer());
}
return rc;
}
Sample compilation logs (not putting everything here):
/bin/sh ../../libtool --mode=compile clang-17 -Wno-implicit-int
-Wno-int-conversion -I../../include -I../../include
-I/opt/ciscossl/include -DLDAP_LIBRARY -c bind.c
libtool: compile: clang-17 -Wno-implicit-int -Wno-int-conversion
-I../../include -I../../include -I/opt/ciscossl/include -DLDAP_LIBRARY
-c bind.c -fPIC -DPIC -o .libs/bind.o
/bin/sh ../../libtool --mode=compile clang-17 -Wno-implicit-int
-Wno-int-conversion -I../../include -I../../include
-I/opt/ciscossl/include -DLDAP_LIBRARY -c open.c
libtool: compile: clang-17 -Wno-implicit-int -Wno-int-conversion
-I../../include -I../../include -I/opt/ciscossl/include -DLDAP_LIBRARY
-c open.c -fPIC -DPIC -o .libs/open.o
/bin/sh ../../libtool --mode=compile clang-17 -Wno-implicit-int
-Wno-int-conversion -I../../include -I../../include
-I/opt/ciscossl/include -DLDAP_LIBRARY -c result.c
libtool: compile: clang-17 -Wno-implicit-int -Wno-int-conversion
-I../../include -I../../include -I/opt/ciscossl/include -DLDAP_LIBRARY
-c result.c -fPIC -DPIC -o .libs/result.o
/bin/sh ../../libtool --mode=compile clang-17 -Wno-implicit-int
-Wno-int-conversion -I../../include -I../../include
-I/opt/ciscossl/include -DLDAP_LIBRARY -c error.c
libtool: compile: clang-17 -Wno-implicit-int -Wno-int-conversion
-I../../include -I../../include -I/opt/ciscossl/include -DLDAP_LIBRARY
-c error.c -fPIC -DPIC -o .libs/error.o
/bin/sh ../../libtool --mode=compile clang-17 -Wno-implicit-int
-Wno-int-conversion -I../../include -I../../include
-I/opt/ciscossl/include -DLDAP_LIBRARY -c compare.c
libtool: compile: clang-17 -Wno-implicit-int -Wno-int-conversion
-I../../include -I../../include -I/opt/ciscossl/include -DLDAP_LIBRARY
-c compare.c -fPIC -DPIC -o .libs/compare.o
//more below like
/bin/sh ../../libtool --mode=link clang-17 -Wno-implicit-int
-Wno-int-conversion -L/opt/ciscossl/lib -version-info 2:200:0 -rpath
/opt/ldap/lib -Wl,--version-script=./ldap.map -o libldap.la bind.lo
open.lo result.lo error.lo compare.lo search.lo controls.lo
messages.lo references.lo extended.lo cyrus.lo modify.lo add.lo
modrdn.lo delete.lo abandon.lo sasl.lo sbind.lo unbind.lo cancel.lo
filter.lo free.lo sort.lo passwd.lo whoami.lo vc.lo getdn.lo
getentry.lo getattr.lo getvalues.lo addentry.lo request.lo os-ip.lo
url.lo pagectrl.lo sortctrl.lo vlvctrl.lo init.lo options.lo print.lo
string.lo util-int.lo schema.lo charray.lo os-local.lo dnssrv.lo
utf-8.lo utf-8-conv.lo tls2.lo tls_o.lo tls_g.lo turn.lo ppolicy.lo
dds.lo txn.lo ldap_sync.lo stctrl.lo assertion.lo deref.lo ldifutil.lo
ldif.lo fetch.lo lbase64.lo msctrl.lo psearchctrl.lo threads.lo
rdwr.lo tpool.lo rq.lo thr_posix.lo thr_thr.lo thr_nt.lo thr_pth.lo
thr_debug.lo account_usability.lo avl.lo tavl.lo version.lo
../../libraries/liblber/liblber.la -lsasl2 -lssl -lcrypto
On Sat, Jun 28, 2025 at 5:19 PM John Scott <[email protected]> wrote:
>
> radiatejava wrote:
> > Hello experts
> Hi! I'm not an expert but I have a couple thoughts that others will probably
> correct me on 🙃
>
> > We are using OpenLDAP lib ver 2.6.7 on Ubuntu 24.04. When doing LDAP search
> > using ldap_search_ext_s() we are getting assert failure. Any idea what
> > could be going wrong?
>
>
> The official OpenLDAP packages for Ubuntu 24.04 are indeed version 2.6.7
> which you can see at https://packages.ubuntu.com/source/noble/openldap
>
> However, your application is loading the library from /opt/ldap/ at
> /opt/ldap/lib/libldap.so.2 which is not where Ubuntu ships it. This isn't
> itself a problem, but I want to make sure you're aware of that. If this was
> manually installed and you're sure it really is 2.6.7, you should try using
> the official build shipped with Ubuntu and see if this continues. If you have
> a reason that's not appropriate for your application then so be it, but
> otherwise it has all sensible features enabled and is in good shape. (A
> reason not to use Ubuntu's build is if your application relies on OpenLDAP
> using OpenSSL in particular instead of GnuTLS, like if it uses the
> LDAP_OPT_X_TLS_CTX option).
> You should also make sure when compiling your application that it uses header
> files from this custom installation in preference to any provided by Ubuntu's
> packages.
>
> What features is your custom OpenLDAP built with? Knowing if it has Cyrus
> SASL and OpenSSL or GnuTLS would be helpful. Also the backtrace is lacking
> details that would be helpful because debugging symbols for OpenLDAP are
> either not available or not very good. If—by some magic—this version
> installed in /opt/ldap/ actually *is* the same as what ships in Ubuntu's
> package, you can use these two GDB commands before starting your program to
> fetch the debugging symbols on-the-fly:
> set debuginfod enabled on
> set debuginfod urls https://debuginfod.ubuntu.com
> https://debuginfod.elfutils.org
> The backtrace after that will likely be more helpful.
>
> Lastly, your backtrace hints that several things are being done recursively.
> For example it seems like your rebind credentials callback
> myapp::getRebindCredentials() *itself* calls ldap_simple_bind_s() and tries
> to do further operations, and when it gets another referral it does this even
> one more time. I'm suspicious if the code is really reentrant like that, and
> the end of the backtrace alludes that the recursive operations could be
> causing a double-free or other memory corruption, which would explain
> everything.
>
> > #5 0x000071e8b9684409 in ldap_do_free_request () from
> > /opt/ldap/lib/libldap.so.2
> > #6 0x000071e8b96b4bf9 in ldap_tavl_free () from /opt/ldap/lib/libldap.so.2
> > #7 0x000071e8b968359a in ldap_free_connection () from
> > /opt/ldap/lib/libldap.so.2
> > #8 0x000071e8b9683e9c in ldap_new_connection () from
> > /opt/ldap/lib/libldap.so.2
> > #9 0x000071e8b9682aa7 in ldap_send_server_request () from
> > /opt/ldap/lib/libldap.so.2
> > #10 0x000071e8b9685619 in ldap_chase_v3referrals () from
> > /opt/ldap/lib/libldap.so.2
> > #11 0x000071e8b9667640 in try_read1msg () from /opt/ldap/lib/libldap.so.2
> > #12 0x000071e8b9666515 in wait4msg () from /opt/ldap/lib/libldap.so.2
> > #13 0x000071e8b9665f09 in ldap_result () from /opt/ldap/lib/libldap.so.2
> > #14 0x000071e8b9672a95 in ldap_sasl_bind_s () from
> > /opt/ldap/lib/libldap.so.2
> > #15 0x000071e8b96740b2 in ldap_simple_bind_s () from
> > /opt/ldap/lib/libldap.so.2
> > #16 0x000071e8bb737e2a in myapp::getRebindCredentials(ldap*, char const*,
> > unsigned long, int, void*) () from
> > /mgmt/usr/lib/x86_64-linux-gnu/libsvc_myapp.so
> > #17 0x000071e8b9683e0b in ldap_new_connection () from
> > /opt/ldap/lib/libldap.so.2
> > #18 0x000071e8b9682aa7 in ldap_send_server_request () from
> > /opt/ldap/lib/libldap.so.2
> > #19 0x000071e8b9685619 in ldap_chase_v3referrals () from
> > /opt/ldap/lib/libldap.so.2
> > #20 0x000071e8b9667640 in try_read1msg () from /opt/ldap/lib/libldap.so.2
> > #21 0x000071e8b9666515 in wait4msg () from /opt/ldap/lib/libldap.so.2
> > #22 0x000071e8b9665f09 in ldap_result () from /opt/ldap/lib/libldap.so.2
> > #23 0x000071e8b966acf7 in ldap_pvt_search_s () from
> > /opt/ldap/lib/libldap.so.2
> > #24 0x000071e8b966ac25 in ldap_search_ext_s () from
> > /opt/ldap/lib/libldap.so.2
> > #25 0x000071e8bb732c15 in
> > myapp::LdapAuthenticationBroker::doLdapAuthenticate() () from
> > /mgmt/usr/lib/x86_64-linux-gnu/libsvc_myapp.so
> > #26 0x000071e8bb732484 in myapp::LdapAuthenticationBroker::start(bool&,
> > void (*)(myapp::ExternalAuthenticationBroker*)) () from
> > /mgmt/usr/lib/x86_64-linux-gnu/libsvc_myapp.so
>
> I hope any of those ideas gives you a lead. If possible, I'd like to know
> what's going in inside myapp::getRebindCredentials() in particular.