From a59cc3860b8c129f747e96222801ef0c11bb3354 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Tue, 17 Jun 2025 01:48:08 +0200 Subject: [PATCH] tree-wide: check --machine= specification Addresses https://github.com/systemd/systemd/pull/37741#discussion_r2128482378 --- src/analyze/analyze.c | 5 +++-- src/busctl/busctl.c | 5 +++-- src/home/homectl.c | 5 +++-- src/hostname/hostnamectl.c | 7 ++++--- src/import/importctl.c | 5 +++-- src/locale/localectl.c | 8 +++++--- src/login/loginctl.c | 7 ++++--- src/mount/mount-tool.c | 5 +++-- src/portable/portablectl.c | 19 ++++++++----------- src/run/run.c | 10 ++++++---- src/shared/parse-argument.c | 22 ++++++++++++++++++++++ src/shared/parse-argument.h | 1 + src/stdio-bridge/stdio-bridge.c | 10 ++++++---- src/systemctl/systemctl.c | 5 +++-- src/sysupdate/updatectl.c | 2 +- src/timedate/timedatectl.c | 8 +++++--- 16 files changed, 80 insertions(+), 44 deletions(-) diff --git a/src/analyze/analyze.c b/src/analyze/analyze.c index 5c547197c8d..bb5855ecc60 100644 --- a/src/analyze/analyze.c +++ b/src/analyze/analyze.c @@ -453,8 +453,9 @@ static int parse_argv(int argc, char *argv[]) { break; case 'M': - arg_transport = BUS_TRANSPORT_MACHINE; - arg_host = optarg; + r = parse_machine_argument(optarg, &arg_host, &arg_transport); + if (r < 0) + return r; break; case ARG_MAN: diff --git a/src/busctl/busctl.c b/src/busctl/busctl.c index 8fe28ef015e..5853641e54c 100644 --- a/src/busctl/busctl.c +++ b/src/busctl/busctl.c @@ -2265,8 +2265,9 @@ static int parse_argv(int argc, char *argv[]) { break; case 'M': - arg_transport = BUS_TRANSPORT_MACHINE; - arg_host = optarg; + r = parse_machine_argument(optarg, &arg_host, &arg_transport); + if (r < 0) + return r; break; case 'C': diff --git a/src/home/homectl.c b/src/home/homectl.c index c933d45f786..54b0d67bc71 100644 --- a/src/home/homectl.c +++ b/src/home/homectl.c @@ -3418,8 +3418,9 @@ static int parse_argv(int argc, char *argv[]) { break; case 'M': - arg_transport = BUS_TRANSPORT_MACHINE; - arg_host = optarg; + r = parse_machine_argument(optarg, &arg_host, &arg_transport); + if (r < 0) + return r; break; case 'I': diff --git a/src/hostname/hostnamectl.c b/src/hostname/hostnamectl.c index fd0449c399b..d1bf6294220 100644 --- a/src/hostname/hostnamectl.c +++ b/src/hostname/hostnamectl.c @@ -33,7 +33,7 @@ static bool arg_ask_password = true; static BusTransport arg_transport = BUS_TRANSPORT_LOCAL; -static char *arg_host = NULL; +static const char *arg_host = NULL; static bool arg_transient = false; static bool arg_pretty = false; static bool arg_static = false; @@ -791,8 +791,9 @@ static int parse_argv(int argc, char *argv[]) { break; case 'M': - arg_transport = BUS_TRANSPORT_MACHINE; - arg_host = optarg; + r = parse_machine_argument(optarg, &arg_host, &arg_transport); + if (r < 0) + return r; break; case ARG_TRANSIENT: diff --git a/src/import/importctl.c b/src/import/importctl.c index e555b2f770a..5fd8af72efe 100644 --- a/src/import/importctl.c +++ b/src/import/importctl.c @@ -1111,8 +1111,9 @@ static int parse_argv(int argc, char *argv[]) { break; case 'M': - arg_transport = BUS_TRANSPORT_MACHINE; - arg_host = optarg; + r = parse_machine_argument(optarg, &arg_host, &arg_transport); + if (r < 0) + return r; break; case ARG_READ_ONLY: diff --git a/src/locale/localectl.c b/src/locale/localectl.c index 7c729249ac2..b60da006b3f 100644 --- a/src/locale/localectl.c +++ b/src/locale/localectl.c @@ -18,6 +18,7 @@ #include "main-func.h" #include "memory-util.h" #include "pager.h" +#include "parse-argument.h" #include "polkit-agent.h" #include "pretty-print.h" #include "runtime-scope.h" @@ -452,7 +453,7 @@ static int parse_argv(int argc, char *argv[]) { {} }; - int c; + int r, c; assert(argc >= 0); assert(argv); @@ -489,8 +490,9 @@ static int parse_argv(int argc, char *argv[]) { break; case 'M': - arg_transport = BUS_TRANSPORT_MACHINE; - arg_host = optarg; + r = parse_machine_argument(optarg, &arg_host, &arg_transport); + if (r < 0) + return r; break; case '?': diff --git a/src/login/loginctl.c b/src/login/loginctl.c index 1cbbd4ecf72..2c3394cc2cd 100644 --- a/src/login/loginctl.c +++ b/src/login/loginctl.c @@ -47,7 +47,7 @@ static sd_json_format_flags_t arg_json_format_flags = SD_JSON_FORMAT_OFF; static const char *arg_kill_whom = NULL; static int arg_signal = SIGTERM; static BusTransport arg_transport = BUS_TRANSPORT_LOCAL; -static char *arg_host = NULL; +static const char *arg_host = NULL; static bool arg_ask_password = true; static unsigned arg_lines = 10; static OutputMode arg_output = OUTPUT_SHORT; @@ -1654,8 +1654,9 @@ static int parse_argv(int argc, char *argv[]) { break; case 'M': - arg_transport = BUS_TRANSPORT_MACHINE; - arg_host = optarg; + r = parse_machine_argument(optarg, &arg_host, &arg_transport); + if (r < 0) + return r; break; case '?': diff --git a/src/mount/mount-tool.c b/src/mount/mount-tool.c index 3d468e06215..a684c0bef8a 100644 --- a/src/mount/mount-tool.c +++ b/src/mount/mount-tool.c @@ -279,8 +279,9 @@ static int parse_argv(int argc, char *argv[]) { break; case 'M': - arg_transport = BUS_TRANSPORT_MACHINE; - arg_host = optarg; + r = parse_machine_argument(optarg, &arg_host, &arg_transport); + if (r < 0) + return r; break; case ARG_DISCOVER: diff --git a/src/portable/portablectl.c b/src/portable/portablectl.c index 4b8e1cd88a2..c7803021b20 100644 --- a/src/portable/portablectl.c +++ b/src/portable/portablectl.c @@ -21,6 +21,7 @@ #include "main-func.h" #include "os-util.h" #include "pager.h" +#include "parse-argument.h" #include "parse-util.h" #include "path-util.h" #include "polkit-agent.h" @@ -35,7 +36,7 @@ static bool arg_legend = true; static bool arg_ask_password = true; static bool arg_quiet = false; static const char *arg_profile = "default"; -static const char* arg_copy_mode = NULL; +static const char *arg_copy_mode = NULL; static bool arg_runtime = false; static bool arg_reload = true; static bool arg_cat = false; @@ -1318,7 +1319,6 @@ static int help(int argc, char *argv[], void *userdata) { } static int parse_argv(int argc, char *argv[]) { - int r; enum { ARG_VERSION = 0x100, @@ -1360,15 +1360,12 @@ static int parse_argv(int argc, char *argv[]) { {} }; + int r, c; + assert(argc >= 0); assert(argv); - for (;;) { - int c; - - c = getopt_long(argc, argv, "hH:M:qp:", options, NULL); - if (c < 0) - break; + while ((c = getopt_long(argc, argv, "hH:M:qp:", options, NULL)) >= 0) switch (c) { @@ -1396,8 +1393,9 @@ static int parse_argv(int argc, char *argv[]) { break; case 'M': - arg_transport = BUS_TRANSPORT_MACHINE; - arg_host = optarg; + r = parse_machine_argument(optarg, &arg_host, &arg_transport); + if (r < 0) + return r; break; case 'q': @@ -1476,7 +1474,6 @@ static int parse_argv(int argc, char *argv[]) { default: assert_not_reached(); } - } return 1; } diff --git a/src/run/run.c b/src/run/run.c index ab620bb5cd1..5bbd55da9b0 100644 --- a/src/run/run.c +++ b/src/run/run.c @@ -457,8 +457,9 @@ static int parse_argv(int argc, char *argv[]) { break; case 'M': - arg_transport = BUS_TRANSPORT_MACHINE; - arg_host = optarg; + r = parse_machine_argument(optarg, &arg_host, &arg_transport); + if (r < 0) + return r; break; case ARG_SERVICE_TYPE: @@ -900,8 +901,9 @@ static int parse_argv_sudo_mode(int argc, char *argv[]) { break; case ARG_MACHINE: - arg_transport = BUS_TRANSPORT_MACHINE; - arg_host = optarg; + r = parse_machine_argument(optarg, &arg_host, &arg_transport); + if (r < 0) + return r; break; case ARG_UNIT: diff --git a/src/shared/parse-argument.c b/src/shared/parse-argument.c index 1575962d44a..107e3cb8ab1 100644 --- a/src/shared/parse-argument.c +++ b/src/shared/parse-argument.c @@ -1,7 +1,9 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #include "alloc-util.h" +#include "bus-util.h" #include "format-table.h" +#include "hostname-util.h" #include "log.h" #include "parse-argument.h" #include "parse-util.h" @@ -143,3 +145,23 @@ int parse_signal_argument(const char *s, int *ret) { *ret = r; return 1; /* work to do */ } + +int parse_machine_argument(const char *s, const char **ret_host, BusTransport *ret_transport) { + int r; + + assert(s); + assert(ret_host); + + r = machine_spec_valid(s); + if (r < 0) + return log_error_errno(r, "Failed to validate --machine= argument '%s': %m", s); + if (r == 0) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid --machine= specified: %s", s); + + *ret_host = s; + + if (ret_transport) + *ret_transport = BUS_TRANSPORT_MACHINE; + + return 0; +} diff --git a/src/shared/parse-argument.h b/src/shared/parse-argument.h index 06c47d90442..0f44223af3c 100644 --- a/src/shared/parse-argument.h +++ b/src/shared/parse-argument.h @@ -8,3 +8,4 @@ int parse_tristate_argument(const char *optname, const char *s, int *ret); int parse_json_argument(const char *s, sd_json_format_flags_t *ret); int parse_path_argument(const char *path, bool suppress_root, char **arg); int parse_signal_argument(const char *s, int *ret); +int parse_machine_argument(const char *s, const char **ret_host, BusTransport *ret_transport); diff --git a/src/stdio-bridge/stdio-bridge.c b/src/stdio-bridge/stdio-bridge.c index 0de59aaecfe..804762ab2e8 100644 --- a/src/stdio-bridge/stdio-bridge.c +++ b/src/stdio-bridge/stdio-bridge.c @@ -14,6 +14,7 @@ #include "io-util.h" #include "log.h" #include "main-func.h" +#include "parse-argument.h" #include "time-util.h" static const char *arg_bus_path = DEFAULT_SYSTEM_BUS_ADDRESS; @@ -35,9 +36,9 @@ static int help(void) { } static int parse_argv(int argc, char *argv[]) { + enum { ARG_VERSION = 0x100, - ARG_MACHINE, ARG_USER, ARG_SYSTEM, }; @@ -52,7 +53,7 @@ static int parse_argv(int argc, char *argv[]) { {}, }; - int c; + int r, c; assert(argc >= 0); assert(argv); @@ -80,8 +81,9 @@ static int parse_argv(int argc, char *argv[]) { break; case 'M': - arg_bus_path = optarg; - arg_transport = BUS_TRANSPORT_MACHINE; + r = parse_machine_argument(optarg, &arg_bus_path, &arg_transport); + if (r < 0) + return r; break; case '?': diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 0c8a2c96c62..c62a514777e 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -788,8 +788,9 @@ static int systemctl_parse_argv(int argc, char *argv[]) { break; case 'M': - arg_transport = BUS_TRANSPORT_MACHINE; - arg_host = optarg; + r = parse_machine_argument(optarg, &arg_host, &arg_transport); + if (r < 0) + return r; break; case ARG_RUNTIME: diff --git a/src/sysupdate/updatectl.c b/src/sysupdate/updatectl.c index 8e830fd6568..0336a6ac753 100644 --- a/src/sysupdate/updatectl.c +++ b/src/sysupdate/updatectl.c @@ -36,7 +36,7 @@ static bool arg_reboot = false; static bool arg_offline = false; static bool arg_now = false; static BusTransport arg_transport = BUS_TRANSPORT_LOCAL; -static char *arg_host = NULL; +static const char *arg_host = NULL; #define SYSUPDATE_HOST_PATH "/org/freedesktop/sysupdate1/target/host" #define SYSUPDATE_TARGET_INTERFACE "org.freedesktop.sysupdate1.Target" diff --git a/src/timedate/timedatectl.c b/src/timedate/timedatectl.c index 44a64bb6b68..0bbc740d469 100644 --- a/src/timedate/timedatectl.c +++ b/src/timedate/timedatectl.c @@ -22,6 +22,7 @@ #include "log.h" #include "main-func.h" #include "pager.h" +#include "parse-argument.h" #include "parse-util.h" #include "polkit-agent.h" #include "pretty-print.h" @@ -37,7 +38,7 @@ static PagerFlags arg_pager_flags = 0; static bool arg_ask_password = true; static BusTransport arg_transport = BUS_TRANSPORT_LOCAL; -static char *arg_host = NULL; +static const char *arg_host = NULL; static bool arg_adjust_system_clock = false; static bool arg_monitor = false; static char **arg_property = NULL; @@ -996,8 +997,9 @@ static int parse_argv(int argc, char *argv[]) { break; case 'M': - arg_transport = BUS_TRANSPORT_MACHINE; - arg_host = optarg; + r = parse_machine_argument(optarg, &arg_host, &arg_transport); + if (r < 0) + return r; break; case ARG_NO_ASK_PASSWORD: -- 2.47.3