X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fexecute.c;h=91e4352f9a0a44cb045b16fb96561d03fa1a530b;hb=cccb0b2cdbd25e90ae92d2d5b107125cb1ca3433;hp=6ae9a5eb71ebb0c54816879cf3989d058c922fd9;hpb=43a99a7afe3063eebc901452026b13360b69a7b5;p=elogind.git diff --git a/src/core/execute.c b/src/core/execute.c index 6ae9a5eb7..91e4352f9 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -650,14 +650,13 @@ static int enforce_groups(const ExecContext *context, const char *username, gid_ } static int enforce_user(const ExecContext *context, uid_t uid) { - int r; assert(context); /* Sets (but doesn't lookup) the uid and make sure we keep the * capabilities while doing so. */ if (context->capabilities) { - cap_t d; + _cleanup_cap_free_ cap_t d = NULL; static const cap_value_t bits[] = { CAP_SETUID, /* Necessary so that we can run setresuid() below */ CAP_SETPCAP /* Necessary so that we can set PR_SET_SECUREBITS later on */ @@ -677,23 +676,16 @@ static int enforce_user(const ExecContext *context, uid_t uid) { /* Second step: set the capabilities. This will reduce * the capabilities to the minimum we need. */ - if (!(d = cap_dup(context->capabilities))) + d = cap_dup(context->capabilities); + if (!d) return -errno; if (cap_set_flag(d, CAP_EFFECTIVE, ELEMENTSOF(bits), bits, CAP_SET) < 0 || - cap_set_flag(d, CAP_PERMITTED, ELEMENTSOF(bits), bits, CAP_SET) < 0) { - r = -errno; - cap_free(d); - return r; - } - - if (cap_set_proc(d) < 0) { - r = -errno; - cap_free(d); - return r; - } + cap_set_flag(d, CAP_PERMITTED, ELEMENTSOF(bits), bits, CAP_SET) < 0) + return -errno; - cap_free(d); + if (cap_set_proc(d) < 0) + return -errno; } /* Third step: actually set the uids */ @@ -1038,7 +1030,7 @@ static int build_environment( return -ENOMEM; if (n_fds > 0) { - if (asprintf(&x, "LISTEN_PID=%lu", (unsigned long) getpid()) < 0) + if (asprintf(&x, "LISTEN_PID="PID_FMT, getpid()) < 0) return -ENOMEM; our_env[n_env++] = x; @@ -1048,7 +1040,7 @@ static int build_environment( } if (watchdog_usec > 0) { - if (asprintf(&x, "WATCHDOG_PID=%lu", (unsigned long) getpid()) < 0) + if (asprintf(&x, "WATCHDOG_PID="PID_FMT, getpid()) < 0) return -ENOMEM; our_env[n_env++] = x; @@ -1435,7 +1427,8 @@ int exec_spawn(ExecCommand *command, !strv_isempty(context->read_only_dirs) || !strv_isempty(context->inaccessible_dirs) || context->mount_flags != 0 || - (context->private_tmp && runtime && (runtime->tmp_dir || runtime->var_tmp_dir))) { + (context->private_tmp && runtime && (runtime->tmp_dir || runtime->var_tmp_dir)) || + context->private_devices) { char *tmp = NULL, *var = NULL; @@ -1458,6 +1451,7 @@ int exec_spawn(ExecCommand *command, context->inaccessible_dirs, tmp, var, + context->private_devices, context->mount_flags); if (err < 0) { @@ -1636,8 +1630,8 @@ int exec_spawn(ExecCommand *command, log_struct_unit(LOG_DEBUG, unit_id, - "MESSAGE=Forked %s as %lu", - command->path, (unsigned long) pid, + "MESSAGE=Forked %s as "PID_FMT, + command->path, pid, NULL); /* We add the new process to the cgroup both in the child (so @@ -1904,6 +1898,7 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) { "%sNonBlocking: %s\n" "%sPrivateTmp: %s\n" "%sPrivateNetwork: %s\n" + "%sPrivateDevices: %s\n" "%sIgnoreSIGPIPE: %s\n", prefix, c->umask, prefix, c->working_directory ? c->working_directory : "/", @@ -1911,6 +1906,7 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) { prefix, yes_no(c->non_blocking), prefix, yes_no(c->private_tmp), prefix, yes_no(c->private_network), + prefix, yes_no(c->private_devices), prefix, yes_no(c->ignore_sigpipe)); STRV_FOREACH(e, c->environment) @@ -1979,7 +1975,7 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) { } if (c->timer_slack_nsec != (nsec_t) -1) - fprintf(f, "%sTimerSlackNSec: %lu\n", prefix, (unsigned long)c->timer_slack_nsec); + fprintf(f, "%sTimerSlackNSec: "NSEC_FMT "\n", prefix, c->timer_slack_nsec); fprintf(f, "%sStandardInput: %s\n" @@ -2000,37 +1996,37 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) { prefix, yes_no(c->tty_vhangup), prefix, yes_no(c->tty_vt_disallocate)); - if (c->std_output == EXEC_OUTPUT_SYSLOG || c->std_output == EXEC_OUTPUT_KMSG || c->std_output == EXEC_OUTPUT_JOURNAL || - c->std_output == EXEC_OUTPUT_SYSLOG_AND_CONSOLE || c->std_output == EXEC_OUTPUT_KMSG_AND_CONSOLE || c->std_output == EXEC_OUTPUT_JOURNAL_AND_CONSOLE || - c->std_error == EXEC_OUTPUT_SYSLOG || c->std_error == EXEC_OUTPUT_KMSG || c->std_error == EXEC_OUTPUT_JOURNAL || - c->std_error == EXEC_OUTPUT_SYSLOG_AND_CONSOLE || c->std_error == EXEC_OUTPUT_KMSG_AND_CONSOLE || c->std_error == EXEC_OUTPUT_JOURNAL_AND_CONSOLE) { - char *fac_str, *lvl_str; - int r; + if (c->std_output == EXEC_OUTPUT_SYSLOG || + c->std_output == EXEC_OUTPUT_KMSG || + c->std_output == EXEC_OUTPUT_JOURNAL || + c->std_output == EXEC_OUTPUT_SYSLOG_AND_CONSOLE || + c->std_output == EXEC_OUTPUT_KMSG_AND_CONSOLE || + c->std_output == EXEC_OUTPUT_JOURNAL_AND_CONSOLE || + c->std_error == EXEC_OUTPUT_SYSLOG || + c->std_error == EXEC_OUTPUT_KMSG || + c->std_error == EXEC_OUTPUT_JOURNAL || + c->std_error == EXEC_OUTPUT_SYSLOG_AND_CONSOLE || + c->std_error == EXEC_OUTPUT_KMSG_AND_CONSOLE || + c->std_error == EXEC_OUTPUT_JOURNAL_AND_CONSOLE) { - r = log_facility_unshifted_to_string_alloc(c->syslog_priority >> 3, &fac_str); - if (r < 0) - fac_str = NULL; + _cleanup_free_ char *fac_str = NULL, *lvl_str = NULL; - r = log_level_to_string_alloc(LOG_PRI(c->syslog_priority), &lvl_str); - if (r < 0) - lvl_str = NULL; + log_facility_unshifted_to_string_alloc(c->syslog_priority >> 3, &fac_str); + log_level_to_string_alloc(LOG_PRI(c->syslog_priority), &lvl_str); fprintf(f, "%sSyslogFacility: %s\n" "%sSyslogLevel: %s\n", prefix, strna(fac_str), prefix, strna(lvl_str)); - free(lvl_str); - free(fac_str); } if (c->capabilities) { - char *t; - if ((t = cap_to_text(c->capabilities, NULL))) { - fprintf(f, "%sCapabilities: %s\n", - prefix, t); - cap_free(t); - } + _cleanup_cap_free_charp_ char *t; + + t = cap_to_text(c->capabilities, NULL); + if (t) + fprintf(f, "%sCapabilities: %s\n", prefix, t); } if (c->secure_bits) @@ -2049,12 +2045,11 @@ void exec_context_dump(ExecContext *c, FILE* f, const char *prefix) { for (l = 0; l <= cap_last_cap(); l++) if (!(c->capability_bounding_set_drop & ((uint64_t) 1ULL << (uint64_t) l))) { - char *t; + _cleanup_cap_free_charp_ char *t; - if ((t = cap_to_name(l))) { + t = cap_to_name(l); + if (t) fprintf(f, " %s", t); - cap_free(t); - } } fputs("\n", f); @@ -2139,8 +2134,8 @@ void exec_status_dump(ExecStatus *s, FILE *f, const char *prefix) { return; fprintf(f, - "%sPID: %lu\n", - prefix, (unsigned long) s->pid); + "%sPID: "PID_FMT"\n", + prefix, s->pid); if (s->start_timestamp.realtime > 0) fprintf(f, @@ -2282,7 +2277,7 @@ static int exec_runtime_allocate(ExecRuntime **rt) { return 0; *rt = new0(ExecRuntime, 1); - if (!rt) + if (!*rt) return -ENOMEM; (*rt)->n_ref = 1;