aboutsummaryrefslogtreecommitdiff
path: root/contrib/openpam/lib/pam_set_item.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/openpam/lib/pam_set_item.c')
-rw-r--r--contrib/openpam/lib/pam_set_item.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/contrib/openpam/lib/pam_set_item.c b/contrib/openpam/lib/pam_set_item.c
index 1cebfd55aadd..5405a4e722cd 100644
--- a/contrib/openpam/lib/pam_set_item.c
+++ b/contrib/openpam/lib/pam_set_item.c
@@ -62,6 +62,7 @@ pam_set_item(pam_handle_t *pamh,
return (PAM_SYSTEM_ERR);
slot = &pamh->item[item_type];
+ tmp = NULL;
switch (item_type) {
case PAM_SERVICE:
case PAM_USER:
@@ -72,20 +73,23 @@ pam_set_item(pam_handle_t *pamh,
case PAM_RUSER:
case PAM_USER_PROMPT:
case PAM_AUTHTOK_PROMPT:
- size = strlen(*slot) + 1;
+ if (*slot != NULL)
+ size = strlen(*slot) + 1;
if (item != NULL)
- tmp = strdup(item);
+ if ((tmp = strdup(item)) == NULL)
+ return (PAM_BUF_ERR);
break;
case PAM_CONV:
size = sizeof(struct pam_conv);
- if (item != NULL)
- tmp = malloc(size);
+ if (item != NULL) {
+ if ((tmp = malloc(size)) == NULL)
+ return (PAM_BUF_ERR);
+ memcpy(tmp, item, sizeof(struct pam_conv));
+ }
break;
default:
return (PAM_SYSTEM_ERR);
}
- if (item != NULL && tmp == NULL)
- return (PAM_BUF_ERR);
if (*slot != NULL) {
memset(*slot, 0xd0, size);
free(*slot);