aboutsummaryrefslogtreecommitdiff
path: root/Linux-PAM/libpam/pam_end.c
diff options
context:
space:
mode:
authorSteve Langasek <steve.langasek@ubuntu.com>2019-01-03 13:00:10 -0800
committerSteve Langasek <steve.langasek@ubuntu.com>2019-01-03 13:00:10 -0800
commit9d69c7bbb05cc22edce56e751cef5828e652988a (patch)
treeb97c4aa6e6133fa3e319805c5190819020838c32 /Linux-PAM/libpam/pam_end.c
parenta6f4ab0bebc76acf85cc0244bd21c1036009c28c (diff)
parentd5b06b67bbeeed7c05c0eb2e05d6a972ad050d1c (diff)
downloadpam-9d69c7bbb05cc22edce56e751cef5828e652988a.tar.gz
pam-9d69c7bbb05cc22edce56e751cef5828e652988a.tar.bz2
pam-9d69c7bbb05cc22edce56e751cef5828e652988a.zip
Merge tag 'upstream/0.99.7.1' into debian
Diffstat (limited to 'Linux-PAM/libpam/pam_end.c')
-rw-r--r--Linux-PAM/libpam/pam_end.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/Linux-PAM/libpam/pam_end.c b/Linux-PAM/libpam/pam_end.c
new file mode 100644
index 00000000..23a9dd5d
--- /dev/null
+++ b/Linux-PAM/libpam/pam_end.c
@@ -0,0 +1,81 @@
+/* pam_end.c */
+
+/*
+ * $Id: pam_end.c,v 1.4 2006/01/12 10:06:49 t8m Exp $
+ */
+
+#include "pam_private.h"
+
+#include <stdlib.h>
+
+int pam_end(pam_handle_t *pamh, int pam_status)
+{
+ int ret;
+
+ D(("entering pam_end()"));
+
+ IF_NO_PAMH("pam_end", pamh, PAM_SYSTEM_ERR);
+
+ if (__PAM_FROM_MODULE(pamh)) {
+ D(("called from module!?"));
+ return PAM_SYSTEM_ERR;
+ }
+
+#ifdef HAVE_LIBAUDIT
+ _pam_audit_end(pamh, pam_status);
+#endif
+
+ /* first liberate the modules (it is not inconcevible that the
+ modules may need to use the service_name etc. to clean up) */
+
+ _pam_free_data(pamh, pam_status);
+
+ /* now drop all modules */
+
+ if ((ret = _pam_free_handlers(pamh)) != PAM_SUCCESS) {
+ return ret; /* error occurred */
+ }
+
+ /* from this point we cannot call the modules any more. Free the remaining
+ memory used by the Linux-PAM interface */
+
+ _pam_drop_env(pamh); /* purge the environment */
+
+ _pam_overwrite(pamh->authtok); /* blank out old token */
+ _pam_drop(pamh->authtok);
+
+ _pam_overwrite(pamh->oldauthtok); /* blank out old token */
+ _pam_drop(pamh->oldauthtok);
+
+ _pam_overwrite(pamh->former.prompt);
+ _pam_drop(pamh->former.prompt); /* drop saved prompt */
+
+ _pam_overwrite(pamh->service_name);
+ _pam_drop(pamh->service_name);
+
+ _pam_overwrite(pamh->user);
+ _pam_drop(pamh->user);
+
+ _pam_overwrite(pamh->prompt);
+ _pam_drop(pamh->prompt); /* prompt for pam_get_user() */
+
+ _pam_overwrite(pamh->tty);
+ _pam_drop(pamh->tty);
+
+ _pam_overwrite(pamh->rhost);
+ _pam_drop(pamh->rhost);
+
+ _pam_overwrite(pamh->ruser);
+ _pam_drop(pamh->ruser);
+
+ _pam_drop(pamh->pam_conversation);
+ pamh->fail_delay.delay_fn_ptr = NULL;
+
+ /* and finally liberate the memory for the pam_handle structure */
+
+ _pam_drop(pamh);
+
+ D(("exiting pam_end() successfully"));
+
+ return PAM_SUCCESS;
+}