diff options
Diffstat (limited to 'libpam/pam_item.c')
-rw-r--r-- | libpam/pam_item.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/libpam/pam_item.c b/libpam/pam_item.c index 42857da5..2e43d767 100644 --- a/libpam/pam_item.c +++ b/libpam/pam_item.c @@ -6,6 +6,7 @@ #include "pam_private.h" #include "pam_inline.h" +#include "pam_i18n.h" #include <ctype.h> #include <stdlib.h> @@ -13,7 +14,7 @@ #include <syslog.h> #define TRY_SET(X, Y) \ -{ \ +do { \ if ((X) != (Y)) { \ char *_TMP_ = _pam_strdup(Y); \ if (_TMP_ == NULL && (Y) != NULL) \ @@ -21,7 +22,7 @@ free(X); \ (X) = _TMP_; \ } \ -} +} while(0) /* functions */ @@ -31,13 +32,19 @@ int pam_set_item (pam_handle_t *pamh, int item_type, const void *item) D(("called")); - IF_NO_PAMH("pam_set_item", pamh, PAM_SYSTEM_ERR); + IF_NO_PAMH(pamh, PAM_SYSTEM_ERR); retval = PAM_SUCCESS; switch (item_type) { case PAM_SERVICE: + if (item == NULL) { + pam_syslog(pamh, LOG_ERR, + "pam_set_item: attempt to set service to NULL"); + retval = PAM_BAD_ITEM; + break; + } /* Setting handlers_loaded to 0 will cause the handlers * to be reloaded on the next call to a service module. */ @@ -46,7 +53,7 @@ int pam_set_item (pam_handle_t *pamh, int item_type, const void *item) { char *tmp; for (tmp=pamh->service_name; *tmp; ++tmp) - *tmp = tolower(*tmp); /* require lower case */ + *tmp = tolower((unsigned char)*tmp); /* require lower case */ } break; @@ -61,7 +68,7 @@ int pam_set_item (pam_handle_t *pamh, int item_type, const void *item) break; case PAM_TTY: - D(("setting tty to %s", item)); + D(("setting tty to %s", (const char *)item)); TRY_SET(pamh->tty, item); break; @@ -113,8 +120,7 @@ int pam_set_item (pam_handle_t *pamh, int item_type, const void *item) } else { struct pam_conv *tconv; - if ((tconv= - (struct pam_conv *) malloc(sizeof(struct pam_conv)) + if ((tconv = malloc(sizeof(struct pam_conv)) ) == NULL) { pam_syslog(pamh, LOG_CRIT, "pam_set_item: malloc failed for pam_conv"); @@ -177,7 +183,7 @@ int pam_get_item (const pam_handle_t *pamh, int item_type, const void **item) int retval = PAM_SUCCESS; D(("called.")); - IF_NO_PAMH("pam_get_item", pamh, PAM_SYSTEM_ERR); + IF_NO_PAMH(pamh, PAM_SYSTEM_ERR); if (item == NULL) { pam_syslog(pamh, LOG_ERR, @@ -280,7 +286,7 @@ int pam_get_user(pam_handle_t *pamh, const char **user, const char *prompt) D(("called.")); - IF_NO_PAMH("pam_get_user", pamh, PAM_SYSTEM_ERR); + IF_NO_PAMH(pamh, PAM_SYSTEM_ERR); if (user == NULL) { /* ensure that the module has supplied a destination */ @@ -372,7 +378,7 @@ int pam_get_user(pam_handle_t *pamh, const char **user, const char *prompt) break; } else { /* conversation should have given a response */ - D(("pam_get_user: no response provided")); + D(("no response provided")); retval = PAM_CONV_ERR; } /* fallthrough */ |