---
name: "ldap_destroy"
section: "3"
platform: "linux"
package: "libldap"
version: "2.7.2-2"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/ldap_dup"
---

# ldap\_destroy(3)

Duplicate and destroy LDAP session handles

Part of [ldap\_dup(3)](/ldap_dup/3.md).

## NAME

ldap\_dup, ldap\_destroy, - Duplicate and destroy LDAP session handles

## LIBRARY

OpenLDAP LDAP (libldap, -lldap)

## SYNOPSIS

```
#include <ldap.h>
```

**LDAP \*ldap\_dup(**

**LDAP \****old* **);**

**int ldap\_destroy(**

**LDAP \****old* **);**

## DESCRIPTION

**ldap\_dup()** **duplicates an existing LDAP** (**LDAP \***) **session handle.** **The new session handle may be used concurrently with the** **original session handle.** **In a threaded environment, different threads may execute concurrent** **requests on the same connection/session without fear of contamination.** **Each session handle manages its own private error results.**

**ldap\_destroy()** **destroys an existing session handle.**

**The** **ldap\_dup()** **and** **ldap\_destroy()** **functions are used in conjunction with a "thread safe" version** **of** **libldap** **to enable operation thread safe API calls, so that a single session** **may be simultaneously used across multiple threads with consistent** **error handling.**

**When a session is created through the use of one of the session creation** **functions including** [**ldap\_open**(3)](/ldap_open/3.md), [**ldap\_init**(3)](/ldap_init/3.md), [**ldap\_initialize**(3)](/ldap_initialize/3.md) **or** [**ldap\_init\_fd**(3)](/ldap_init_fd/3.md) **an** **LDAP \*** **session handle is returned to the application.** **The session handle may be shared amongst threads, however the** **error codes are unique to a session handle.** **Multiple threads performing different operations using the same** **session handle will result in inconsistent error codes and** **return values.**

**To prevent this confusion,** **ldap\_dup()** **is used duplicate an existing session handle so that multiple threads** **can share the session, and maintain consistent error information** **and results.**

**The message queues for a session are shared between sibling session handles.** **Results of operations on a sibling session handles are accessible** **to all the sibling session handles.** **Applications desiring results associated with a specific operation** **should provide the appropriate msgid to** **ldap\_result()**. **Applications should avoid calling** **ldap\_result()** **with** **LDAP\_RES\_ANY** **as that may "steal" and return results in the calling thread** **that another operation in a different thread, using a** **different session handle, may require to complete.**

**When** **ldap\_unbind()** **is called on a session handle with siblings, all the**  **siblings become invalid.**

**Siblings must be destroyed using** **ldap\_destroy()**. **Session handle resources associated with the original** (**LDAP \***) **will be freed when the last session handle is destroyed or when** **ldap\_unbind()** **is called, if no other session handles currently exist.**

## ERRORS

**If an error occurs,** **ldap\_dup()** **will return NULL and**  *errno* **should be set appropriately.** **ldap\_destroy()** **will directly return the LDAP code associated to the error (or** *LDAP\_SUCCESS* **in case of success);** *errno* **should be set as well whenever appropriate.**

## SEE ALSO

[**ldap\_open**(3)](/ldap_open/3.md), [**ldap\_init**(3)](/ldap_init/3.md), [**ldap\_initialize**(3)](/ldap_initialize/3.md), [**ldap\_init\_fd**(3)](/ldap_init_fd/3.md), [**errno**(3)](/errno/3.md)

## ACKNOWLEDGEMENTS

**This work is based on the previously proposed** **LDAP C API Concurrency Extensions** **draft** **(**draft-zeilenga-ldap-c-api-concurrency-00.txt**)** **effort.** **OpenLDAP Software** **is developed and maintained by The OpenLDAP Project \<http://www.openldap.org/\>.** **OpenLDAP Software** **is derived from the University of Michigan LDAP 3.3 Release.**
