summaryrefslogtreecommitdiff
path: root/libpam
diff options
context:
space:
mode:
Diffstat (limited to 'libpam')
-rw-r--r--libpam/Makefile.am2
-rw-r--r--libpam/pam_item.c10
-rw-r--r--libpam/pam_private.h1
3 files changed, 11 insertions, 2 deletions
diff --git a/libpam/Makefile.am b/libpam/Makefile.am
index 9cf45e82..f33c3db3 100644
--- a/libpam/Makefile.am
+++ b/libpam/Makefile.am
@@ -14,7 +14,7 @@ include_HEADERS = $(addprefix include/security/, _pam_compat.h _pam_macros.h _pa
noinst_HEADERS = pam_prelude.h pam_private.h pam_tokens.h
-libpam_la_LDFLAGS = -no-undefined -version-info 1:0:0
+libpam_la_LDFLAGS = -no-undefined -version-info 81:0:81
if HAVE_VERSIONING
libpam_la_LDFLAGS += -Wl,--version-script=libpam.map
endif
diff --git a/libpam/pam_item.c b/libpam/pam_item.c
index 96e88247..ff35559e 100644
--- a/libpam/pam_item.c
+++ b/libpam/pam_item.c
@@ -50,10 +50,12 @@ int pam_set_item (pam_handle_t *pamh, int item_type, const void *item)
case PAM_USER:
RESET(pamh->user, item);
+ pamh->former.fail_user = PAM_SUCCESS;
break;
case PAM_USER_PROMPT:
RESET(pamh->prompt, item);
+ pamh->former.fail_user = PAM_SUCCESS;
break;
case PAM_TTY:
@@ -127,6 +129,7 @@ int pam_set_item (pam_handle_t *pamh, int item_type, const void *item)
memcpy(tconv, item, sizeof(struct pam_conv));
_pam_drop(pamh->pam_conversation);
pamh->pam_conversation = tconv;
+ pamh->former.fail_user = PAM_SUCCESS;
}
}
break;
@@ -254,6 +257,9 @@ int pam_get_user(pam_handle_t *pamh, const char **user, const char *prompt)
return PAM_SUCCESS;
}
+ if (pamh->former.fail_user != PAM_SUCCESS)
+ return pamh->former.fail_user;
+
/* will need a prompt */
use_prompt = prompt;
if (use_prompt == NULL) {
@@ -308,6 +314,7 @@ int pam_get_user(pam_handle_t *pamh, const char **user, const char *prompt)
*/
D(("pam_get_user: no response provided"));
retval = PAM_CONV_ERR;
+ pamh->former.fail_user = retval;
} else if (retval == PAM_SUCCESS) { /* copy the username */
/*
* now we set the PAM_USER item -- this was missing from pre.53
@@ -316,7 +323,8 @@ int pam_get_user(pam_handle_t *pamh, const char **user, const char *prompt)
*/
RESET(pamh->user, resp->resp);
*user = pamh->user;
- }
+ } else
+ pamh->former.fail_user = retval;
if (resp) {
/*
diff --git a/libpam/pam_private.h b/libpam/pam_private.h
index 9d759ca9..53375bbb 100644
--- a/libpam/pam_private.h
+++ b/libpam/pam_private.h
@@ -122,6 +122,7 @@ struct _pam_former_state {
int status; /* the status before returning incomplete */
/* state info used by pam_get_user() function */
+ int fail_user;
int want_user;
char *prompt; /* saved prompt information */