X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fexecute.c;h=5cfd4a1f97537d289fa86a8f8bde972751a0d3e5;hb=0c2a5d721ece665618614d05049975ad84a9ee4a;hp=07ec7a28d642bb5b069973ca4bb9c9bee1deff58;hpb=86b23b07c96b185126bfbf217227dad362a20c25;p=elogind.git diff --git a/src/core/execute.c b/src/core/execute.c index 07ec7a28d..5cfd4a1f9 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -1444,8 +1444,10 @@ static int exec_child(ExecCommand *command, } #endif -#ifdef HAVE_PAM - if (params->cgroup_path && context->user && context->pam_name) { + /* If delegation is enabled we'll pass ownership of the cgroup + * (but only in systemd's own controller hierarchy!) to the + * user of the new process. */ + if (params->cgroup_path && context->user && params->cgroup_delegate) { err = cg_set_task_access(SYSTEMD_CGROUP_CONTROLLER, params->cgroup_path, 0644, uid, gid); if (err < 0) { *error = EXIT_CGROUP; @@ -1459,7 +1461,6 @@ static int exec_child(ExecCommand *command, return err; } } -#endif if (!strv_isempty(context->runtime_directory) && params->runtime_prefix) { char **rt; @@ -1545,7 +1546,10 @@ static int exec_child(ExecCommand *command, context->protect_home, context->protect_system, context->mount_flags); - if (err < 0) { + + if (err == -EPERM) + log_warning_unit(params->unit_id, "Failed to set up file system namespace due to lack of privileges. Execution sandbox will not be in effect: %s", strerror(-err)); + else if (err < 0) { *error = EXIT_NAMESPACE; return err; } @@ -1666,7 +1670,7 @@ static int exec_child(ExecCommand *command, #endif #ifdef HAVE_SELINUX - if (use_selinux()) { + if (mac_selinux_use()) { if (context->selinux_context) { err = setexeccon(context->selinux_context); if (err < 0 && !context->selinux_context_ignore) { @@ -1678,7 +1682,7 @@ static int exec_child(ExecCommand *command, if (params->selinux_context_net && socket_fd >= 0) { _cleanup_free_ char *label = NULL; - err = label_get_child_mls_label(socket_fd, command->path, &label); + err = mac_selinux_get_child_mls_label(socket_fd, command->path, &label); if (err < 0) { *error = EXIT_SELINUX_CONTEXT; return err; @@ -1694,11 +1698,11 @@ static int exec_child(ExecCommand *command, #endif #ifdef HAVE_APPARMOR - if (context->apparmor_profile && use_apparmor()) { + if (context->apparmor_profile && mac_apparmor_use()) { err = aa_change_onexec(context->apparmor_profile); if (err < 0 && !context->apparmor_profile_ignore) { *error = EXIT_APPARMOR_PROFILE; - return err; + return -errno; } } #endif @@ -1782,7 +1786,7 @@ int exec_spawn(ExecCommand *command, n_fds = params->n_fds; } - err = exec_context_load_environment(context, &files_env); + err = exec_context_load_environment(context, params->unit_id, &files_env); if (err < 0) { log_struct_unit(LOG_ERR, params->unit_id, @@ -2011,7 +2015,7 @@ void exec_command_free_array(ExecCommand **c, unsigned n) { } } -int exec_context_load_environment(const ExecContext *c, char ***l) { +int exec_context_load_environment(const ExecContext *c, const char *unit_id, char ***l) { char **i, **r = NULL; assert(c); @@ -2068,7 +2072,7 @@ int exec_context_load_environment(const ExecContext *c, char ***l) { } /* Log invalid environment variables with filename */ if (p) - p = strv_env_clean_log(p, pglob.gl_pathv[n]); + p = strv_env_clean_log(p, unit_id, pglob.gl_pathv[n]); if (r == NULL) r = p; @@ -2399,6 +2403,21 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) { prefix, c->apparmor_profile_ignore ? "-" : "", c->apparmor_profile); } +bool exec_context_maintains_privileges(ExecContext *c) { + assert(c); + + /* Returns true if the process forked off would run run under + * an unchanged UID or as root. */ + + if (!c->user) + return true; + + if (streq(c->user, "root") || streq(c->user, "0")) + return true; + + return false; +} + void exec_status_start(ExecStatus *s, pid_t pid) { assert(s); @@ -2567,8 +2586,8 @@ int exec_command_set(ExecCommand *c, const char *path, ...) { } int exec_command_append(ExecCommand *c, const char *path, ...) { + _cleanup_strv_free_ char **l = NULL; va_list ap; - char **l; int r; assert(c); @@ -2582,10 +2601,8 @@ int exec_command_append(ExecCommand *c, const char *path, ...) { return -ENOMEM; r = strv_extend_strv(&c->argv, l); - if (r < 0) { - strv_free(l); + if (r < 0) return r; - } return 0; }