aboutsummaryrefslogtreecommitdiff
path: root/modules/pam_issue/pam_issue.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/pam_issue/pam_issue.c')
-rw-r--r--modules/pam_issue/pam_issue.c35
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: