fuzz-systemctl-parse-argv: update suppression of logging and resetting of state
There's certainly more than one way to skin this particular cat, so I'm keeping this as a separate commit.
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include <getopt.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "bus-util.h"
|
||||
@@ -88,17 +87,16 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
||||
log_warning_errno(orig_stdout_fd, "Failed to duplicate fd 1: %m");
|
||||
else
|
||||
assert_se(freopen("/dev/null", "w", stdout));
|
||||
|
||||
opterr = 0; /* do not print errors */
|
||||
}
|
||||
|
||||
/* We need to reset some global state manually here since libfuzzer feeds a single process with
|
||||
* multiple inputs, so we might carry over state from previous invocations that can trigger
|
||||
* certain asserts. */
|
||||
optind = 0; /* this tells the getopt machinery to reinitialize */
|
||||
arg_transport = BUS_TRANSPORT_LOCAL;
|
||||
|
||||
r = systemctl_dispatch_parse_argv(strv_length(argv), argv, /* remaining_args= */ NULL);
|
||||
r = systemctl_dispatch_parse_argv(strv_length(argv), argv,
|
||||
/* log_level_shift= */ LOG_DEBUG - LOG_ERR,
|
||||
/* remaining_args= */ NULL);
|
||||
if (r < 0)
|
||||
log_error_errno(r, "Failed to parse args: %m");
|
||||
else
|
||||
|
||||
@@ -50,13 +50,17 @@ static int halt_help(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int halt_parse_argv(int argc, char *argv[]) {
|
||||
int halt_parse_argv(int argc, char *argv[], int log_level_shift) {
|
||||
int r;
|
||||
|
||||
assert(argc >= 0);
|
||||
assert(argv);
|
||||
|
||||
OptionParser opts = { argc, argv, .namespace = "halt" };
|
||||
OptionParser opts = {
|
||||
argc, argv,
|
||||
.namespace = "halt",
|
||||
.log_level_shift = log_level_shift,
|
||||
};
|
||||
|
||||
FOREACH_OPTION_OR_RETURN(c, &opts)
|
||||
switch (c) {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
#pragma once
|
||||
|
||||
int halt_parse_argv(int argc, char *argv[]);
|
||||
|
||||
int halt_parse_argv(int argc, char *argv[], int log_level_shift);
|
||||
int halt_main(void);
|
||||
|
||||
@@ -116,13 +116,17 @@ static int parse_shutdown_time_spec(const char *t, usec_t *ret) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int shutdown_parse_argv(int argc, char *argv[]) {
|
||||
int shutdown_parse_argv(int argc, char *argv[], int log_level_shift) {
|
||||
int r;
|
||||
|
||||
assert(argc >= 0);
|
||||
assert(argv);
|
||||
|
||||
OptionParser opts = { argc, argv, .namespace = "shutdown" };
|
||||
OptionParser opts = {
|
||||
argc, argv,
|
||||
.namespace = "shutdown",
|
||||
.log_level_shift = log_level_shift,
|
||||
};
|
||||
|
||||
FOREACH_OPTION_OR_RETURN(c, &opts)
|
||||
switch (c) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
#pragma once
|
||||
|
||||
int shutdown_parse_argv(int argc, char *argv[]);
|
||||
int shutdown_parse_argv(int argc, char *argv[], int log_level_shift);
|
||||
|
||||
@@ -26,7 +26,7 @@ static int run(int argc, char *argv[]) {
|
||||
setlocale(LC_ALL, "");
|
||||
log_setup();
|
||||
|
||||
r = systemctl_dispatch_parse_argv(argc, argv, &args);
|
||||
r = systemctl_dispatch_parse_argv(argc, argv, /* log_level_shift= */ 0, &args);
|
||||
if (r <= 0)
|
||||
goto finish;
|
||||
|
||||
|
||||
@@ -373,7 +373,7 @@ static int parse_what_argument(const char *value, char ***clean_what) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int systemctl_parse_argv(int argc, char *argv[], char ***remaining_args) {
|
||||
static int systemctl_parse_argv(int argc, char *argv[], int log_level_shift, char ***remaining_args) {
|
||||
int r;
|
||||
|
||||
assert(argc >= 0);
|
||||
@@ -382,7 +382,11 @@ static int systemctl_parse_argv(int argc, char *argv[], char ***remaining_args)
|
||||
/* We default to allowing interactive authorization only in systemctl (not in the legacy commands) */
|
||||
arg_ask_password = true;
|
||||
|
||||
OptionParser opts = { argc, argv, .namespace = "systemctl" };
|
||||
OptionParser opts = {
|
||||
argc, argv,
|
||||
.namespace = "systemctl",
|
||||
.log_level_shift = log_level_shift,
|
||||
};
|
||||
|
||||
FOREACH_OPTION_OR_RETURN(c, &opts)
|
||||
switch (c) {
|
||||
@@ -898,28 +902,29 @@ static int systemctl_parse_argv(int argc, char *argv[], char ***remaining_args)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int systemctl_dispatch_parse_argv(int argc, char *argv[], char ***remaining_args) {
|
||||
int systemctl_dispatch_parse_argv(int argc, char *argv[], int log_level_shift, char ***remaining_args) {
|
||||
assert(argc >= 0);
|
||||
assert(argv);
|
||||
|
||||
if (invoked_as(argv, "halt")) {
|
||||
arg_action = ACTION_HALT;
|
||||
return halt_parse_argv(argc, argv);
|
||||
return halt_parse_argv(argc, argv, log_level_shift);
|
||||
|
||||
} else if (invoked_as(argv, "poweroff")) {
|
||||
arg_action = ACTION_POWEROFF;
|
||||
return halt_parse_argv(argc, argv);
|
||||
return halt_parse_argv(argc, argv, log_level_shift);
|
||||
|
||||
} else if (invoked_as(argv, "reboot")) {
|
||||
arg_action = ACTION_REBOOT;
|
||||
return halt_parse_argv(argc, argv);
|
||||
return halt_parse_argv(argc, argv, log_level_shift);
|
||||
|
||||
} else if (invoked_as(argv, "shutdown")) {
|
||||
arg_action = ACTION_POWEROFF;
|
||||
return shutdown_parse_argv(argc, argv);
|
||||
return shutdown_parse_argv(argc, argv, log_level_shift);
|
||||
|
||||
} else {
|
||||
arg_action = ACTION_SYSTEMCTL;
|
||||
return systemctl_parse_argv(argc, argv, remaining_args);
|
||||
return systemctl_parse_argv(argc, argv, log_level_shift, remaining_args);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -102,5 +102,5 @@ static inline const char* arg_job_mode(void) {
|
||||
return _arg_job_mode ?: "replace";
|
||||
}
|
||||
|
||||
int systemctl_dispatch_parse_argv(int argc, char *argv[], char ***remaining_args);
|
||||
int systemctl_dispatch_parse_argv(int argc, char *argv[], int log_level_shift, char ***remaining_args);
|
||||
int systemctl_main(char **args);
|
||||
|
||||
Reference in New Issue
Block a user