---
name: "pam_end"
section: "3"
platform: "linux"
package: "pam"
version: "1.7.3-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/pam_end"
---

# pam\_end(3)

termination of PAM transaction

## NAME

pam\_end - termination of PAM transaction

## SYNOPSIS

```
#include <security/pam_appl.h>
```

**int pam\_end(pam\_handle\_t \****pamh***, int** *pam\_status***);**

## DESCRIPTION

The **pam\_end** function terminates the PAM transaction and is the last function an application should call in the PAM context. Upon return the handle *pamh* is no longer valid and all memory associated with it will be invalid.

The *pam\_status* argument should be set to the value returned to the application by the last PAM library call.

The value taken by *pam\_status* is used as an argument to the module specific callback function, **cleanup()** (See [**pam\_set\_data**(3)](/pam_set_data/3.md) and [**pam\_get\_data**(3)](/pam_get_data/3.md)). In this way the module can be given notification of the pass/fail nature of the tear-down process, and perform any last minute tasks that are appropriate to the module before it is unlinked. This argument can be logically OR'd with *PAM\_DATA\_SILENT* to indicate that the module should not treat the call too seriously. It is generally used to indicate that the current closing of the library is in a [**fork**(2)](/fork/2.md)ed process, and that the parent will take care of cleaning up things that exist outside of the current process space (files etc.).

This function *free*'s all memory for items associated with the [**pam\_set\_item**(3)](/pam_set_item/3.md) and [**pam\_get\_item**(3)](/pam_get_item/3.md) functions. Pointers associated with such objects are not valid anymore after **pam\_end** was called.

## RETURN VALUES

PAM\_SUCCESS

Transaction was successfully terminated.

PAM\_SYSTEM\_ERR

System error, for example a NULL pointer was submitted as PAM handle or the function was called by a module.

## SEE ALSO

[**pam\_get\_data**(3)](/pam_get_data/3.md), [**pam\_set\_data**(3)](/pam_set_data/3.md), [**pam\_start**(3)](/pam_start/3.md), [**pam\_strerror**(3)](/pam_strerror/3.md)
