pam: initialize XDG_RUNTIME_DIR
This commit is contained in:
+40
-7
@@ -361,13 +361,6 @@ _public_ PAM_EXTERN int pam_sm_open_session(
|
||||
if (sd_booted() <= 0)
|
||||
return PAM_SUCCESS;
|
||||
|
||||
/* Make sure we don't enter a loop by talking to
|
||||
* systemd-logind when it is actually waiting for the
|
||||
* background to finish start-up, */
|
||||
pam_get_item(handle, PAM_SERVICE, (const void**) &service);
|
||||
if (streq_ptr(service, "systemd-shared"))
|
||||
return PAM_SUCCESS;
|
||||
|
||||
if (parse_argv(handle,
|
||||
argc, argv,
|
||||
&controllers, &reset_controllers,
|
||||
@@ -381,6 +374,46 @@ _public_ PAM_EXTERN int pam_sm_open_session(
|
||||
if (r != PAM_SUCCESS)
|
||||
goto finish;
|
||||
|
||||
/* Make sure we don't enter a loop by talking to
|
||||
* systemd-logind when it is actually waiting for the
|
||||
* background to finish start-up. If the service is
|
||||
* "systemd-shared" we simply set XDG_RUNTIME_DIR and
|
||||
* leave. */
|
||||
|
||||
pam_get_item(handle, PAM_SERVICE, (const void**) &service);
|
||||
if (streq_ptr(service, "systemd-shared")) {
|
||||
char *p, *rt = NULL;
|
||||
|
||||
if (asprintf(&p, "/run/systemd/users/%lu", (unsigned long) pw->pw_uid) < 0) {
|
||||
r = PAM_BUF_ERR;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
r = parse_env_file(p, NEWLINE,
|
||||
"RUNTIME", &rt,
|
||||
NULL);
|
||||
free(p);
|
||||
|
||||
if (r < 0 && r != -ENOENT) {
|
||||
r = PAM_SESSION_ERR;
|
||||
free(rt);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
if (rt) {
|
||||
r = pam_misc_setenv(handle, "XDG_RUNTIME_DIR", rt, 0);
|
||||
free(rt);
|
||||
|
||||
if (r != PAM_SUCCESS) {
|
||||
pam_syslog(handle, LOG_ERR, "Failed to set runtime dir.");
|
||||
goto finish;
|
||||
}
|
||||
}
|
||||
|
||||
r = PAM_SUCCESS;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
if (kill_processes)
|
||||
kill_processes = check_user_lists(handle, pw->pw_uid, kill_only_users, kill_exclude_users);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user