chiark / gitweb /
main: don't set no_new_privs when using SystemCallArchitectures= system-wide
[elogind.git] / src / core / main.c
index 14e21d634b920a6c2b136dbf2e7936b496e9720c..b5bb3f6805d77285651a852daba58679dac76639 100644 (file)
@@ -303,7 +303,8 @@ static int parse_proc_cmdline_word(const char *word) {
         } else if (startswith(word, "systemd.dump_core=")) {
                 int r;
 
-                if ((r = parse_boolean(word + 18)) < 0)
+                r = parse_boolean(word + 18);
+                if (r < 0)
                         log_warning("Failed to parse dump core switch %s. Ignoring.", word + 18);
                 else
                         arg_dump_core = r;
@@ -311,7 +312,8 @@ static int parse_proc_cmdline_word(const char *word) {
         } else if (startswith(word, "systemd.crash_shell=")) {
                 int r;
 
-                if ((r = parse_boolean(word + 20)) < 0)
+                r = parse_boolean(word + 20);
+                if (r < 0)
                         log_warning("Failed to parse crash shell switch %s. Ignoring.", word + 20);
                 else
                         arg_crash_shell = r;
@@ -319,7 +321,8 @@ static int parse_proc_cmdline_word(const char *word) {
         } else if (startswith(word, "systemd.confirm_spawn=")) {
                 int r;
 
-                if ((r = parse_boolean(word + 22)) < 0)
+                r = parse_boolean(word + 22);
+                if (r < 0)
                         log_warning("Failed to parse confirm spawn switch %s. Ignoring.", word + 22);
                 else
                         arg_confirm_spawn = r;
@@ -341,23 +344,21 @@ static int parse_proc_cmdline_word(const char *word) {
         } else if (startswith(word, "systemd.default_standard_output=")) {
                 int r;
 
-                if ((r = exec_output_from_string(word + 32)) < 0)
+                r = exec_output_from_string(word + 32);
+                if (r < 0)
                         log_warning("Failed to parse default standard output switch %s. Ignoring.", word + 32);
                 else
                         arg_default_std_output = r;
         } else if (startswith(word, "systemd.default_standard_error=")) {
                 int r;
 
-                if ((r = exec_output_from_string(word + 31)) < 0)
+                r = exec_output_from_string(word + 31);
+                if (r < 0)
                         log_warning("Failed to parse default standard error switch %s. Ignoring.", word + 31);
                 else
                         arg_default_std_error = r;
         } else if (startswith(word, "systemd.setenv=")) {
-                _cleanup_free_ char *cenv = NULL;
-
-                cenv = strdup(word + 15);
-                if (!cenv)
-                        return -ENOMEM;
+                const char *cenv = word + 15;
 
                 if (env_assignment_is_valid(cenv)) {
                         char **env;
@@ -366,7 +367,8 @@ static int parse_proc_cmdline_word(const char *word) {
                         if (env)
                                 arg_default_environment = env;
                         else
-                                log_warning("Setting environment variable '%s' failed, ignoring: %m", cenv);
+                                log_warning("Setting environment variable '%s' failed, ignoring: %s",
+                                            cenv, strerror(ENOMEM));
                 } else
                         log_warning("Environment variable name '%s' is not valid. Ignoring.", cenv);
 
@@ -694,35 +696,6 @@ static int parse_config_file(void) {
         return 0;
 }
 
-static int parse_proc_cmdline(void) {
-        _cleanup_free_ char *line = NULL;
-        char *w, *state;
-        size_t l;
-        int r;
-
-        r = proc_cmdline(&line);
-        if (r < 0)
-                log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r));
-        if (r <= 0)
-                return 0;
-
-        FOREACH_WORD_QUOTED(w, l, line, state) {
-                _cleanup_free_ char *word;
-
-                word = strndup(w, l);
-                if (!word)
-                        return log_oom();
-
-                r = parse_proc_cmdline_word(word);
-                if (r < 0) {
-                        log_error("Failed on cmdline argument %s: %s", word, strerror(-r));
-                        return r;
-                }
-        }
-
-        return 0;
-}
-
 static int parse_argv(int argc, char *argv[]) {
 
         enum {
@@ -766,7 +739,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "switched-root",            no_argument,       NULL, ARG_SWITCHED_ROOT            },
                 { "default-standard-output",  required_argument, NULL, ARG_DEFAULT_STD_OUTPUT,      },
                 { "default-standard-error",   required_argument, NULL, ARG_DEFAULT_STD_ERROR,       },
-                { NULL,                       0,                 NULL, 0                            }
+                {}
         };
 
         int c, r;
@@ -782,7 +755,8 @@ static int parse_argv(int argc, char *argv[]) {
                 switch (c) {
 
                 case ARG_LOG_LEVEL:
-                        if ((r = log_set_max_level_from_string(optarg)) < 0) {
+                        r = log_set_max_level_from_string(optarg);
+                        if (r < 0) {
                                 log_error("Failed to parse log level %s.", optarg);
                                 return r;
                         }
@@ -790,8 +764,8 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case ARG_LOG_TARGET:
-
-                        if ((r = log_set_target_from_string(optarg)) < 0) {
+                        r = log_set_target_from_string(optarg);
+                        if (r < 0) {
                                 log_error("Failed to parse log target %s.", optarg);
                                 return r;
                         }
@@ -801,7 +775,8 @@ static int parse_argv(int argc, char *argv[]) {
                 case ARG_LOG_COLOR:
 
                         if (optarg) {
-                                if ((r = log_show_color_from_string(optarg)) < 0) {
+                                r = log_show_color_from_string(optarg);
+                                if (r < 0) {
                                         log_error("Failed to parse log color setting %s.", optarg);
                                         return r;
                                 }
@@ -811,9 +786,9 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case ARG_LOG_LOCATION:
-
                         if (optarg) {
-                                if ((r = log_show_location_from_string(optarg)) < 0) {
+                                r = log_show_location_from_string(optarg);
+                                if (r < 0) {
                                         log_error("Failed to parse log location setting %s.", optarg);
                                         return r;
                                 }
@@ -823,8 +798,8 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case ARG_DEFAULT_STD_OUTPUT:
-
-                        if ((r = exec_output_from_string(optarg)) < 0) {
+                        r = exec_output_from_string(optarg);
+                        if (r < 0) {
                                 log_error("Failed to parse default standard output setting %s.", optarg);
                                 return r;
                         } else
@@ -832,8 +807,8 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case ARG_DEFAULT_STD_ERROR:
-
-                        if ((r = exec_output_from_string(optarg)) < 0) {
+                        r = exec_output_from_string(optarg);
+                        if (r < 0) {
                                 log_error("Failed to parse default standard error output setting %s.", optarg);
                                 return r;
                         } else
@@ -842,7 +817,8 @@ static int parse_argv(int argc, char *argv[]) {
 
                 case ARG_UNIT:
 
-                        if ((r = set_default_unit(optarg)) < 0) {
+                        r = set_default_unit(optarg);
+                        if (r < 0) {
                                 log_error("Failed to set default unit %s: %s", optarg, strerror(-r));
                                 return r;
                         }
@@ -1215,6 +1191,12 @@ static int enforce_syscall_archs(Set *archs) {
                 }
         }
 
+        r = seccomp_attr_set(seccomp, SCMP_FLTATR_CTL_NNP, 0);
+        if (r < 0) {
+                log_error("Failed to unset NO_NEW_PRIVS: %s", strerror(-r));
+                goto finish;
+        }
+
         r = seccomp_load(seccomp);
         if (r < 0)
                 log_error("Failed to add install architecture seccomp: %s", strerror(-r));
@@ -1408,7 +1390,7 @@ int main(int argc, char *argv[]) {
                 goto finish;
 
         if (arg_running_as == SYSTEMD_SYSTEM)
-                if (parse_proc_cmdline() < 0)
+                if (parse_proc_cmdline(parse_proc_cmdline_word) < 0)
                         goto finish;
 
         log_parse_environment();
@@ -1905,14 +1887,42 @@ finish:
 #endif
 
         if (shutdown_verb) {
-                const char * command_line[] = {
+                char log_level[DECIMAL_STR_MAX(int) + 1];
+                const char* command_line[9] = {
                         SYSTEMD_SHUTDOWN_BINARY_PATH,
                         shutdown_verb,
-                        NULL
+                        "--log-level", log_level,
+                        "--log-target",
                 };
+                unsigned pos = 5;
+                assert(command_line[pos] == NULL);
+
                 _cleanup_strv_free_ char **env_block = NULL;
                 env_block = strv_copy(environ);
 
+                snprintf(log_level, sizeof(log_level), "%d", log_get_max_level());
+
+                switch (log_get_target()) {
+                case LOG_TARGET_KMSG:
+                case LOG_TARGET_JOURNAL_OR_KMSG:
+                case LOG_TARGET_SYSLOG_OR_KMSG:
+                        command_line[pos++] = "kmsg";
+                        break;
+
+                case LOG_TARGET_CONSOLE:
+                default:
+                        command_line[pos++] = "console";
+                        break;
+                };
+
+                if (log_get_show_color())
+                        command_line[pos++] = "--log-color";
+
+                if (log_get_show_location())
+                        command_line[pos++] = "--log-location";
+
+                assert(pos + 1 < ELEMENTSOF(command_line));
+
                 if (arm_reboot_watchdog && arg_shutdown_watchdog > 0) {
                         char *e;
 
@@ -1935,7 +1945,8 @@ finish:
                         cg_uninstall_release_agent(SYSTEMD_CGROUP_CONTROLLER);
 
                 execve(SYSTEMD_SHUTDOWN_BINARY_PATH, (char **) command_line, env_block);
-                log_error("Failed to execute shutdown binary, freezing: %m");
+                log_error("Failed to execute shutdown binary, %s: %m",
+                          getpid() == 1 ? "freezing" : "quitting");
         }
 
         if (getpid() == 1)