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:
Zbigniew Jędrzejewski-Szmek
2026-05-14 09:38:10 +02:00
parent 0a33b37e93
commit 4a30028c85
8 changed files with 32 additions and 22 deletions
+3 -5
View File
@@ -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
+6 -2
View File
@@ -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 -2
View File
@@ -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);
+6 -2
View File
@@ -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 -1
View File
@@ -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);
+1 -1
View File
@@ -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;
+13 -8
View File
@@ -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);
}
}
+1 -1
View File
@@ -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);