[Pkg-openldap-devel] Bug#340601: Bug#340601: Bug#340601: ldapsearch hangs when using ldap for /etc/hosts

Steve Langasek vorlon at debian.org
Mon Feb 11 04:16:50 UTC 2008


On Sun, Feb 10, 2008 at 10:06:14AM -0800, Russ Allbery wrote:
> > Ok, I've scaled back the patch a bit before committing it because a
> > deeper search leaves me uncertain that res_query and dn_expand are
> > thread-safe even in current versions of glibc.  Dropping the mutex for
> > getaddrinfo() and getnameinfo() is sufficient to fix this bug, in any
> > case.

> I have now discussed this and the related fact that we're using libldap_r
> for ldapsearch (which from upstream's perspective is the actual problem)
> with upstream.  Upstream's stance on this is:

>  * Using libldap_r for anything other than slapd is flatly unsupported and
>    considered a bug.  We should not be doing that.  We should be treating
>    libldap_r as a private library only for slapd.

>  * libldap has no supported thread-safe API.  Threaded programs that link
>    against libldap are required to handle locking themselves.

Wow, ok, I'm very not happy with this answer.  I think that *all* libraries
should have thread-safe APIs; and aside from this minor blemish, libldap_r
appears to already be a perfectly good thread-safe, reentrant library,
supported by upstream or not.

We have the following callers using libldap in Debian which also have need
of thread-safety and currently take no additional steps to ensure libldap is
thread-safe:

- libpq5
- libnss-ldapd
- evolution-data-server
- libexchange-storage1.2-3
- libcurl3
- kdepimlibs5
- claws-mail (for bonus points, this app launches each LDAP query in a
  separate thread... :)
- strongswan
- libnss-ldap
- libpam-ldap
- python-ldap
- openoffice.org-core
- libsasl2-modules-ldap
- libpam-smbpass
- libsmbclient
- freeradius-ldap (uses a mutex to ensure any given LDAP connection is only
  used by one thread at a time, but otherwise assumes that multiple LDAP
  connections can be going at once)

... and probably others besides, the list of reverse-depends is long and I
haven't looked at them all.

Moving the locking up the stack when we already have a perfectly thread-safe
libldap available would be a significant regression.

>  * The root underlying problem would then be trying to use libnss-ldap and
>    slapd together on the same system at the same time, because libnss-ldap
>    pulls libldap into slapd's namespace.  Upstream's opinion is that
>    libnss-ldap is broken and this regard and libnss-ldapd may be better.

This particular bug is not related to using libnss-ldap and slapd together
on the same system; it only requires one to try using an LDAP *client* on a
system that uses nss_ldap for hosts resolution.

The concerns about symbol collisions between libldap and libldap_r are
specific to slapd only if we concede that libldap_r should be treated as a
private library not intended for public consumption, which I am not because
the non-threaded libldap is not an adequate replacement for a number of
applications without duplicating a lot of work that's already been done
centrally.

>  * People really shouldn't put hosts into LDAP; LDAP is a heavy-weight
>    protocol that is not suited for use as a DNS resolver.

I happen to agree with that, but nss_ldap nevertheless implements all of the
NSS services, and supporting the hosts implementation for glibc-based
systems is a trivial change.  Eliminating a lock that we *know* we don't
need is hardly a bad thing, anyway.

> The last we can communicate back to the user and perhaps even put into the
> documentation for libnss-ldap and libnss-ldapd.  For the rest, here is the
> outline of an upstream-acceptable solution, which I'd love to be able to
> get at.

>  * Revert the change to link everything against libldap_r and ship only
>    libldap in the libldap package (which will require nasty transition
>    stuff, but putting that side for right now).  Adjust the shlibs in the
>    package accordingly, of course.

Frankly, I would rather continue to ship libldap_r publically, even without
upstream's blessing for this configuration, than inflict threading problems
on the reverse-dependencies.  We *know* that libldap_r is thread-safe
because slapd itself exercises it in the "supported" configuration, and we
already have to deal with frequently-changing libldap sonames primarily
because of the ABI changes that are specific to the internal ldap_pvt_*
functions - we ought to get some benefit for the migration troubles that's
going to cause.

>  * Ship libldap_r in the slapd package or in a separate package referenced
>    by slapd and clearly document in the README.Debian for that package
>    that those libraries are intended for use only with slapd and any other
>    use is not supported.

If that's really upstream's position, then they've been doing this wrong
from the start.  If libldap_r isn't supposed to be public, then they
should have been building it as a convenience library and linking it
statically into slapd; they should have kept all of the ldap_pvt_*/ldap_int_*
functions *private*, instead of exporting them in libldap; and they should
be maintaining a stable ABI for what is a pretty major system library
instead of forcing rebuilds for every slapd internal ABI change.

I'm dismayed.  All of the problems with using libldap_r as the system
libldap would be fixable over time, but it becomes considerably less
feasible without upstream's support of the effort.

Was your discussion with upstream somewhere public?

-- 
Steve Langasek                   Give me a lever long enough and a Free OS
Debian Developer                   to set it on, and I can move the world.
Ubuntu Developer                                    http://www.debian.org/
slangasek at ubuntu.com                                     vorlon at debian.org





More information about the Pkg-openldap-devel mailing list