diff options
Diffstat (limited to 'modules/pam_issue/pam_issue.c')
-rw-r--r-- | modules/pam_issue/pam_issue.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/modules/pam_issue/pam_issue.c b/modules/pam_issue/pam_issue.c index c08f90c3..e2c555c4 100644 --- a/modules/pam_issue/pam_issue.c +++ b/modules/pam_issue/pam_issue.c @@ -165,13 +165,31 @@ read_issue_quoted(pam_handle_t *pamh, FILE *fp, char **prompt) { unsigned int users = 0; #ifdef USE_LOGIND - int sessions = sd_get_sessions(NULL); + char **sessions_list; + int sessions = sd_get_sessions(&sessions_list); if (sessions < 0) { pam_syslog(pamh, LOG_ERR, "logind error: %s", strerror(-sessions)); _pam_drop(issue); return PAM_SERVICE_ERR; + } else if (sessions > 0 && sessions_list != NULL) { + int i; + + for (i = 0; i < sessions; i++) { + char *class; + + if (sd_session_get_class(sessions_list[i], &class) < 0 || class == NULL) + continue; + + if (strncmp(class, "user", 4) == 0) // user, user-early, user-incomplete + users++; + free(class); + } + + for (i = 0; i < sessions; i++) + free(sessions_list[i]); + free(sessions_list); } else { users = sessions; } @@ -240,7 +258,6 @@ pam_sm_authenticate(pam_handle_t *pamh, int flags UNUSED, const char *issue_file = NULL; int parse_esc = 1; const void *item = NULL; - const char *cur_prompt; char *issue_prompt = NULL; /* If we've already set the prompt, don't set it again */ @@ -277,10 +294,6 @@ pam_sm_authenticate(pam_handle_t *pamh, int flags UNUSED, return retval; } - cur_prompt = item; - if (cur_prompt == NULL) - cur_prompt = ""; - if (parse_esc) retval = read_issue_quoted(pamh, fp, &issue_prompt); else @@ -291,11 +304,10 @@ pam_sm_authenticate(pam_handle_t *pamh, int flags UNUSED, if (retval != PAM_SUCCESS) goto out; - { - size_t size = strlen(issue_prompt) + strlen(cur_prompt) + 1; - char *new_prompt = realloc(issue_prompt, size); - - if (new_prompt == NULL) { + if (item != NULL) { + const char *cur_prompt = item; + char *new_prompt; + if (asprintf(&new_prompt, "%s%s", issue_prompt, cur_prompt) < 0) { pam_syslog(pamh, LOG_CRIT, "out of memory"); retval = PAM_BUF_ERR; goto out; @@ -303,7 +315,6 @@ pam_sm_authenticate(pam_handle_t *pamh, int flags UNUSED, issue_prompt = new_prompt; } - strcat(issue_prompt, cur_prompt); retval = pam_set_item(pamh, PAM_USER_PROMPT, (const void *) issue_prompt); out: |