4
* $Id: pam_end.c,v 1.1 2001/04/29 04:17:05 hartmans Exp $
9
#include "pam_private.h"
11
int pam_end(pam_handle_t *pamh, int pam_status)
15
D(("entering pam_end()"));
17
IF_NO_PAMH("pam_end", pamh, PAM_SYSTEM_ERR);
19
if (__PAM_FROM_MODULE(pamh)) {
20
D(("called from module!?"));
21
return PAM_SYSTEM_ERR;
24
/* first liberate the modules (it is not inconcevible that the
25
modules may need to use the service_name etc. to clean up) */
27
_pam_free_data(pamh, pam_status);
29
/* now drop all modules */
31
if ((ret = _pam_free_handlers(pamh)) != PAM_SUCCESS) {
32
return ret; /* error occurred */
35
/* from this point we cannot call the modules any more. Free the remaining
36
memory used by the Linux-PAM interface */
38
_pam_drop_env(pamh); /* purge the environment */
40
_pam_overwrite(pamh->authtok); /* blank out old token */
41
_pam_drop(pamh->authtok);
43
_pam_overwrite(pamh->oldauthtok); /* blank out old token */
44
_pam_drop(pamh->oldauthtok);
46
_pam_overwrite(pamh->former.prompt);
47
_pam_drop(pamh->former.prompt); /* drop saved prompt */
49
_pam_overwrite(pamh->service_name);
50
_pam_drop(pamh->service_name);
52
_pam_overwrite(pamh->user);
53
_pam_drop(pamh->user);
55
_pam_overwrite(pamh->prompt);
56
_pam_drop(pamh->prompt); /* prompt for pam_get_user() */
58
_pam_overwrite(pamh->tty);
61
_pam_overwrite(pamh->rhost);
62
_pam_drop(pamh->rhost);
64
_pam_overwrite(pamh->ruser);
65
_pam_drop(pamh->ruser);
67
_pam_drop(pamh->pam_conversation);
68
pamh->fail_delay.delay_fn_ptr = NULL;
70
/* and finally liberate the memory for the pam_handle structure */
74
D(("exiting pam_end() successfully"));