Bug 1071520

Summary: openldap does not re-register nss shutdown callbacks after nss_Shutdown is called
Product: Red Hat Enterprise Linux 6 Reporter: Daniel Sands <dnsands>
Component: openldapAssignee: Matus Honek <mhonek>
Status: CLOSED ERRATA QA Contact: Stefan Kremen <skremen>
Severity: medium Docs Contact:
Priority: medium    
Version: 6.5CC: dnsands, ebenes, nkinder, pkis, sardella, soohoon
Target Milestone: rc   
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: openldap-2.4.40-16.el6 Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of:
: 1405354 (view as bug list) Environment:
Last Closed: 2017-03-21 10:18:25 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On:    
Bug Blocks: 1405354, 1520990    
Attachments:
Description Flags
Sample code to demonstrate the problem none

Description Daniel Sands 2014-03-01 08:43:49 UTC
Description of problem:
If using a custom SSL context through the LDAP_OPT_X_TLS_NEWCTX LDAP option, openldap will call nss_ShutdownContext on each unbind.  When the last connection is unbound, NSS will call nss_Shutdown to unload the entire NSS library.  Once this happens, if using PEM files, the next unbind will result in SEC_BUSY with the following text:  TLS: could not shutdown NSS - error -8053:NSS could not shutdown. Objects are still in use..

This happens because the tlsm_nss_shutdown_cb is only registered once, and nss_Shutdown will unregister it.  tlsm_nss_shutdown_cb is responsible for unloading the nss PEM module.  Since the shutdown function is no longer called, the PEM module is still loaded, and the NSS module refuses to shut down correctly.  Eventually this causes many other strange issues such as complaints that no slots are available for the certificates that it reads.

Version-Release number of selected component (if applicable):
openldap-2.4.23-34.el6_5.1.x86_64

How reproducible:
Always

Steps to Reproduce:
1. Create a LDAPS connection using a custom context by calling ldap_set_option with LDAP_OPT_X_TLS_NEWCTX.  This also requires manually setting the LDAP_OPT_X_TLS_CACERTDIR or LDAP_OPT_X_TLS_CACERTFILE, LDAP_OPT_X_TLS_CERTFILE, and LDAP_OPT_X_TLS_KEYFILE, as a minimum.
2. Bind to an LDAPS server, then unbind
3. Bind again, then unbind.

Actual results:
TLS: could not shutdown NSS - error -8053:NSS could not shutdown. Objects are still in use..  and other strange behavior

Expected results:
Continued operation in binding and unbinding.

Comment 2 Jan Synacek 2014-05-14 09:35:44 UTC
Would you mind sharing a reproducer?

Comment 4 Daniel Sands 2014-06-25 23:12:53 UTC
Created attachment 912287 [details]
Sample code to demonstrate the problem

This code loops multiple times through initialize, bind, and unbind, using a LDAPS server as the target.  Oddly enough, the error only appears on the 3rd trip through the loop.

Compile with:

cc -g -o ldapbug ldapbug.c -lldap

Then run:

./ldapbug ldaps://my.ldaps.server

It uses EXTERNAL SSL auth, so LDAP_TLSCERT and LDAP_TLSKEY will need to be set to usable client certificates if not already set in ~/.ldaprc

Comment 12 errata-xmlrpc 2017-03-21 10:18:25 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory, and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://rhn.redhat.com/errata/RHBA-2017-0664.html