---
name: "pam_set_data"
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_set_data"
---

# pam\_set\_data(3)

set module internal data

## NAME

pam\_set\_data - set module internal data

## SYNOPSIS

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

**int pam\_set\_data(pam\_handle\_t \****pamh***, const char \****module\_data\_name***, void \****data***, void** *(\*cleanup)(pam\_handle\_t \*pamh, void \*data, int error\_status)***);**

## DESCRIPTION

The **pam\_set\_data** function associates a pointer to an object with the (hopefully) unique string *module\_data\_name* in the PAM context specified by the *pamh* argument.

PAM modules may be dynamically loadable objects. In general such files should not contain *static* variables. This function and its counterpart [**pam\_get\_data**(3)](/pam_get_data/3.md), provide a mechanism for a module to associate some data with the handle *pamh*. Typically a module will call the **pam\_set\_data** function to register some data under a (hopefully) unique *module\_data\_name*. The data is available for use by other modules too but *not* by an application. Since this functions stores only a pointer to the *data*, the module should not modify or free the content of it.

The function **cleanup()** is associated with the *data* and, if non-NULL, it is called when this data is over-written or following a call to [**pam\_end**(3)](/pam_end/3.md).

The *error\_status* argument is used to indicate to the module the sort of action it is to take in cleaning this data item. As an example, Kerberos creates a ticket file during the authentication phase, this file might be associated with a data item. When [**pam\_end**(3)](/pam_end/3.md) is called by the module, the *error\_status* carries the return value of the [**pam\_authenticate**(3)](/pam_authenticate/3.md) or other *libpam* function as appropriate. Based on this value the Kerberos module may choose to delete the ticket file (*authentication failure*) or leave it in place.

The *error\_status* may have been logically OR'd with either of the following two values:

PAM\_DATA\_REPLACE

When a data item is being replaced (through a second call to **pam\_set\_data**) this mask is used. Otherwise, the call is assumed to be from [**pam\_end**(3)](/pam_end/3.md).

PAM\_DATA\_SILENT

Which indicates that the process would prefer to perform the **cleanup()** quietly. That is, discourages logging/messages to the user. 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.).

## RETURN VALUES

PAM\_BUF\_ERR

Memory buffer error.

PAM\_SUCCESS

Data was successfully stored.

PAM\_SYSTEM\_ERR

A NULL pointer was submitted as PAM handle or the function was called by an application.

## SEE ALSO

[**pam\_end**(3)](/pam_end/3.md), [**pam\_get\_data**(3)](/pam_get_data/3.md), [**pam\_strerror**(3)](/pam_strerror/3.md)
