X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fexecute.c;h=3f7ca52139801ddc2606257100fa4d07b1618719;hb=51d122af23533b0b8318911c4fc8b128ad8eafb7;hp=0bfa41836afda89ef013e0b06da6d291e935ff3d;hpb=13b84ec7df103ce388910a2b868fe1668c1e27ef;p=elogind.git diff --git a/src/core/execute.c b/src/core/execute.c index 0bfa41836..3f7ca5213 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -317,12 +317,12 @@ static int setup_input(const ExecContext *context, int socket_fd, bool apply_tty case EXEC_INPUT_TTY_FAIL: { int fd, r; - if ((fd = acquire_terminal( - tty_path(context), - i == EXEC_INPUT_TTY_FAIL, - i == EXEC_INPUT_TTY_FORCE, - false, - (usec_t) -1)) < 0) + fd = acquire_terminal(tty_path(context), + i == EXEC_INPUT_TTY_FAIL, + i == EXEC_INPUT_TTY_FORCE, + false, + (usec_t) -1); + if (fd < 0) return fd; if (fd != STDIN_FILENO) { @@ -748,6 +748,7 @@ static int setup_pam( char **e = NULL; bool close_session = false; pid_t pam_pid = 0, parent_pid; + int flags = 0; assert(name); assert(user); @@ -760,24 +761,33 @@ static int setup_pam( * daemon. We do things this way to ensure that the main PID * of the daemon is the one we initially fork()ed. */ - if ((pam_code = pam_start(name, user, &conv, &handle)) != PAM_SUCCESS) { + if (log_get_max_level() < LOG_PRI(LOG_DEBUG)) + flags |= PAM_SILENT; + + pam_code = pam_start(name, user, &conv, &handle); + if (pam_code != PAM_SUCCESS) { handle = NULL; goto fail; } - if (tty) - if ((pam_code = pam_set_item(handle, PAM_TTY, tty)) != PAM_SUCCESS) + if (tty) { + pam_code = pam_set_item(handle, PAM_TTY, tty); + if (pam_code != PAM_SUCCESS) goto fail; + } - if ((pam_code = pam_acct_mgmt(handle, PAM_SILENT)) != PAM_SUCCESS) + pam_code = pam_acct_mgmt(handle, flags); + if (pam_code != PAM_SUCCESS) goto fail; - if ((pam_code = pam_open_session(handle, PAM_SILENT)) != PAM_SUCCESS) + pam_code = pam_open_session(handle, flags); + if (pam_code != PAM_SUCCESS) goto fail; close_session = true; - if ((!(e = pam_getenvlist(handle)))) { + e = pam_getenvlist(handle); + if (!e) { pam_code = PAM_BUF_ERR; goto fail; } @@ -791,7 +801,8 @@ static int setup_pam( parent_pid = getpid(); - if ((pam_pid = fork()) < 0) + pam_pid = fork(); + if (pam_pid < 0) goto fail; if (pam_pid == 0) { @@ -842,14 +853,16 @@ static int setup_pam( } /* If our parent died we'll end the session */ - if (getppid() != parent_pid) - if ((pam_code = pam_close_session(handle, PAM_DATA_SILENT)) != PAM_SUCCESS) + if (getppid() != parent_pid) { + pam_code = pam_close_session(handle, flags); + if (pam_code != PAM_SUCCESS) goto child_finish; + } r = 0; child_finish: - pam_end(handle, pam_code | PAM_DATA_SILENT); + pam_end(handle, pam_code | flags); _exit(r); } @@ -871,16 +884,19 @@ static int setup_pam( return 0; fail: - if (pam_code != PAM_SUCCESS) + if (pam_code != PAM_SUCCESS) { + log_error("PAM failed: %s", pam_strerror(handle, pam_code)); err = -EPERM; /* PAM errors do not map to errno */ - else + } else { + log_error("PAM failed: %m"); err = -errno; + } if (handle) { if (close_session) - pam_code = pam_close_session(handle, PAM_DATA_SILENT); + pam_code = pam_close_session(handle, flags); - pam_end(handle, pam_code | PAM_DATA_SILENT); + pam_end(handle, pam_code | flags); } strv_free(e); @@ -1085,7 +1101,7 @@ int exec_spawn(ExecCommand *command, if (pid == 0) { int i, err; sigset_t ss; - const char *username = NULL, *home = NULL; + const char *username = NULL, *home = NULL, *shell = NULL; uid_t uid = (uid_t) -1; gid_t gid = (gid_t) -1; _cleanup_strv_free_ char **our_env = NULL, **pam_env = NULL, @@ -1268,7 +1284,7 @@ int exec_spawn(ExecCommand *command, if (context->user) { username = context->user; - err = get_user_creds(&username, &uid, &gid, &home, NULL); + err = get_user_creds(&username, &uid, &gid, &home, &shell); if (err < 0) { r = EXIT_USER; goto fail_child; @@ -1453,46 +1469,28 @@ int exec_spawn(ExecCommand *command, } } - our_env = new0(char*, 7); - if (!our_env) { + our_env = new(char*, 8); + if (!our_env || + (n_fds > 0 && ( + asprintf(our_env + n_env++, "LISTEN_PID=%lu", (unsigned long) getpid()) < 0 || + asprintf(our_env + n_env++, "LISTEN_FDS=%u", n_fds) < 0)) || + (home && asprintf(our_env + n_env++, "HOME=%s", home) < 0) || + (username && ( + asprintf(our_env + n_env++, "LOGNAME=%s", username) < 0 || + asprintf(our_env + n_env++, "USER=%s", username) < 0)) || + (shell && asprintf(our_env + n_env++, "SHELL=%s", shell) < 0) || + ((is_terminal_input(context->std_input) || + context->std_output == EXEC_OUTPUT_TTY || + context->std_error == EXEC_OUTPUT_TTY) && ( + !(our_env[n_env++] = strdup(default_term_for_tty(tty_path(context))))))) { + err = -ENOMEM; r = EXIT_MEMORY; goto fail_child; } - if (n_fds > 0) - if (asprintf(our_env + n_env++, "LISTEN_PID=%lu", (unsigned long) getpid()) < 0 || - asprintf(our_env + n_env++, "LISTEN_FDS=%u", n_fds) < 0) { - err = -ENOMEM; - r = EXIT_MEMORY; - goto fail_child; - } - - if (home) - if (asprintf(our_env + n_env++, "HOME=%s", home) < 0) { - err = -ENOMEM; - r = EXIT_MEMORY; - goto fail_child; - } - - if (username) - if (asprintf(our_env + n_env++, "LOGNAME=%s", username) < 0 || - asprintf(our_env + n_env++, "USER=%s", username) < 0) { - err = -ENOMEM; - r = EXIT_MEMORY; - goto fail_child; - } - - if (is_terminal_input(context->std_input) || - context->std_output == EXEC_OUTPUT_TTY || - context->std_error == EXEC_OUTPUT_TTY) - if (!(our_env[n_env++] = strdup(default_term_for_tty(tty_path(context))))) { - err = -ENOMEM; - r = EXIT_MEMORY; - goto fail_child; - } - - assert(n_env <= 7); + our_env[n_env++] = NULL; + assert(n_env <= 8); final_env = strv_env_merge(5, environment,