struct pam_response **response,
void *appdata_ptr)
{
- int i;
+ int i, ri;
int ret;
struct pam_response *reply;
const char *prompt;
if (reply == NULL) {
return PAM_CONV_ERR;
}
+ ri = 0;
}
for (i=0; i < num_msg; i++) {
case PAM_PROMPT_ECHO_OFF:
prompt = (const char *) \
cctx->data->in_echo_off[cctx->echo_off_idx];
- if (prompt == NULL) {
- return PAM_CONV_ERR;
- }
if (reply != NULL) {
- ret = add_to_reply(&reply[i], prompt);
- if (ret != PAM_SUCCESS) {
- /* FIXME - free data? */
- return ret;
+ if (prompt != NULL) {
+ ret = add_to_reply(&reply[ri], prompt);
+ if (ret != PAM_SUCCESS) {
+ /* FIXME - free data? */
+ return ret;
+ }
+ } else {
+ reply[ri].resp = NULL;
}
+ ri++;
}
cctx->echo_off_idx++;
}
if (reply != NULL) {
- ret = add_to_reply(&reply[i], prompt);
- if (ret != PAM_SUCCESS) {
- /* FIXME - free data? */
- return ret;
+ if (prompt != NULL) {
+ ret = add_to_reply(&reply[ri], prompt);
+ if (ret != PAM_SUCCESS) {
+ /* FIXME - free data? */
+ return ret;
+ }
+ } else {
+ reply[ri].resp = NULL;
}
+ ri++;
}
cctx->echo_on_idx++;
{
int rv = PAM_AUTH_ERR;
+ if (pctx->pli.password == NULL) {
+ /* NULL passwords are not allowed */
+ return PAM_CRED_ERR;
+ }
+
if (pctx->pli.password != NULL &&
pctx->pmi.password != NULL &&
strcmp(pctx->pli.password, pctx->pmi.password) == 0) {
assert_int_equal(perr, PAMTEST_ERR_OK);
}
+static void test_pam_authenticate_null_password(void **state)
+{
+ enum pamtest_err perr;
+ struct pamtest_conv_data conv_data;
+ const char *empty_authtoks[] = {
+ NULL,
+ };
+ struct pam_testcase tests[] = {
+ pam_test(PAMTEST_AUTHENTICATE, PAM_CRED_ERR),
+ };
+
+ (void) state; /* unused */
+
+ ZERO_STRUCT(conv_data);
+ conv_data.in_echo_off = empty_authtoks;
+
+ perr = run_pamtest("matrix", "trinity", &conv_data, tests);
+ assert_int_equal(perr, PAMTEST_ERR_OK);
+}
+
static void test_pam_authenticate_err(void **state)
{
enum pamtest_err perr;
cmocka_unit_test_setup_teardown(test_pam_authenticate,
setup_passdb,
teardown_passdb),
+ cmocka_unit_test_setup_teardown(test_pam_authenticate_null_password,
+ setup_passdb,
+ teardown_passdb),
cmocka_unit_test_setup_teardown(test_pam_authenticate_err,
setup_passdb,
teardown_passdb),