From: Yu Watanabe Date: Thu, 4 Apr 2024 17:51:34 +0000 (+0900) Subject: udevadm-control: check if control command really specified X-Git-Tag: v256-rc1~178^2~4 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fsystemd.git;a=commitdiff_plain;h=b2800ec597a796b99508c1fbed51b55d17fa5229 udevadm-control: check if control command really specified Previously, 'udevadm control' only checked the number of the arguments. So, if only `--timeout` is specified, it spuriously did nothing and succeeded. This makes the command request at least one control command. --- diff --git a/src/udev/udevadm-control.c b/src/udev/udevadm-control.c index b8215ddd1fc..530dca8a5f0 100644 --- a/src/udev/udevadm-control.c +++ b/src/udev/udevadm-control.c @@ -29,6 +29,17 @@ static int arg_start_exec_queue = -1; STATIC_DESTRUCTOR_REGISTER(arg_env, strv_freep); +static bool arg_has_control_commands(void) { + return + arg_exit || + arg_log_level >= 0 || + arg_start_exec_queue >= 0 || + arg_reload || + !strv_isempty(arg_env) || + arg_max_children >= 0 || + arg_ping; +} + static int help(void) { printf("%s control OPTION\n\n" "Control the udev daemon.\n\n" @@ -76,10 +87,6 @@ static int parse_argv(int argc, char *argv[]) { assert(argc >= 0); assert(argv); - if (argc <= 1) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "This command expects one or more options."); - while ((c = getopt_long(argc, argv, "el:sSRp:m:t:Vh", options, NULL)) >= 0) switch (c) { @@ -147,6 +154,10 @@ static int parse_argv(int argc, char *argv[]) { assert_not_reached(); } + if (!arg_has_control_commands()) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), + "No control command option is specified."); + if (optind < argc) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Extraneous argument: %s", argv[optind]); diff --git a/test/units/testsuite-17.10.sh b/test/units/testsuite-17.10.sh index f229dcf25f0..f643b0d6b42 100755 --- a/test/units/testsuite-17.10.sh +++ b/test/units/testsuite-17.10.sh @@ -45,8 +45,7 @@ udevadm control -S udevadm control -R udevadm control -p HELLO=world udevadm control -m 42 -udevadm control --ping -udevadm control -t 5 +udevadm control --ping -t 5 udevadm control -h udevadm info /dev/null