diff -up ./src/pam_pkcs11/pam_pkcs11.c.mem-leak ./src/pam_pkcs11/pam_pkcs11.c
--- ./src/pam_pkcs11/pam_pkcs11.c.mem-leak 2014-02-24 15:01:47.207019357 -0800
+++ ./src/pam_pkcs11/pam_pkcs11.c 2014-02-24 15:22:37.715982927 -0800
@@ -163,8 +163,14 @@ static int pam_get_pwd(pam_handle_t *pam
/* save password if variable nitem is set */
if ((nitem == PAM_AUTHTOK) || (nitem == PAM_OLDAUTHTOK)) {
rv = pam_set_item(pamh, nitem, *pwd);
- if (rv != PAM_SUCCESS)
+ if (rv != PAM_SUCCESS) {
+ if (*pwd) {
+ memset (*pwd, 0, strlen(*pwd));
+ free(*pwd);
+ *pwd = NULL;
+ }
return rv;
+ }
}
return PAM_SUCCESS;
}
@@ -176,7 +182,7 @@ PAM_EXTERN int pam_sm_authenticate(pam_h
int i, rv;
const char *user = NULL;
char *password;
- char password_prompt[70];
+ char password_prompt[180];
unsigned int slot_num = 0;
int is_a_screen_saver = 0;
struct configuration_st *configuration;
@@ -281,9 +287,11 @@ PAM_EXTERN int pam_sm_authenticate(pam_h
DBG1("explicit username = [%s]", user);
}
} else {
- sprintf(password_prompt,
+ snprintf(password_prompt, sizeof(password_prompt),
_("Please insert your %s or enter your username."),
_(configuration->token_type));
+ /* make sure we are NULL terminated if snprintf has to truncate */
+ password_prompt[sizeof(password_prompt)-1] =0;
pam_prompt(pamh, PAM_TEXT_INFO, NULL, password_prompt);
/* get user name */
rv = pam_get_user(pamh, &user, NULL);