pam_end.c 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /* pam_end.c */
  2. /*
  3. * $Id$
  4. */
  5. #include "pam_private.h"
  6. #include <stdlib.h>
  7. int pam_end(pam_handle_t *pamh, int pam_status)
  8. {
  9. int ret;
  10. D(("entering pam_end()"));
  11. IF_NO_PAMH("pam_end", pamh, PAM_SYSTEM_ERR);
  12. if (__PAM_FROM_MODULE(pamh)) {
  13. D(("called from module!?"));
  14. return PAM_SYSTEM_ERR;
  15. }
  16. #ifdef HAVE_LIBAUDIT
  17. _pam_audit_end(pamh, pam_status);
  18. #endif
  19. /* first liberate the modules (it is not inconcevible that the
  20. modules may need to use the service_name etc. to clean up) */
  21. _pam_free_data(pamh, pam_status);
  22. /* now drop all modules */
  23. if ((ret = _pam_free_handlers(pamh)) != PAM_SUCCESS) {
  24. return ret; /* error occurred */
  25. }
  26. /* from this point we cannot call the modules any more. Free the remaining
  27. memory used by the Linux-PAM interface */
  28. _pam_drop_env(pamh); /* purge the environment */
  29. _pam_overwrite(pamh->authtok); /* blank out old token */
  30. _pam_drop(pamh->authtok);
  31. _pam_overwrite(pamh->oldauthtok); /* blank out old token */
  32. _pam_drop(pamh->oldauthtok);
  33. _pam_overwrite(pamh->former.prompt);
  34. _pam_drop(pamh->former.prompt); /* drop saved prompt */
  35. _pam_overwrite(pamh->service_name);
  36. _pam_drop(pamh->service_name);
  37. _pam_overwrite(pamh->user);
  38. _pam_drop(pamh->user);
  39. _pam_overwrite(pamh->confdir);
  40. _pam_drop(pamh->confdir);
  41. _pam_overwrite(pamh->prompt);
  42. _pam_drop(pamh->prompt); /* prompt for pam_get_user() */
  43. _pam_overwrite(pamh->tty);
  44. _pam_drop(pamh->tty);
  45. _pam_overwrite(pamh->rhost);
  46. _pam_drop(pamh->rhost);
  47. _pam_overwrite(pamh->ruser);
  48. _pam_drop(pamh->ruser);
  49. _pam_drop(pamh->pam_conversation);
  50. pamh->fail_delay.delay_fn_ptr = NULL;
  51. _pam_drop(pamh->former.substates);
  52. _pam_overwrite(pamh->xdisplay);
  53. _pam_drop(pamh->xdisplay);
  54. _pam_overwrite(pamh->xauth.name);
  55. _pam_drop(pamh->xauth.name);
  56. _pam_overwrite_n(pamh->xauth.data, (unsigned int)pamh->xauth.datalen);
  57. _pam_drop(pamh->xauth.data);
  58. _pam_overwrite_n((char *)&pamh->xauth, sizeof(pamh->xauth));
  59. _pam_overwrite(pamh->authtok_type);
  60. _pam_drop(pamh->authtok_type);
  61. /* and finally liberate the memory for the pam_handle structure */
  62. _pam_drop(pamh);
  63. D(("exiting pam_end() successfully"));
  64. return PAM_SUCCESS;
  65. }