From f7091f458e2c91afe5005c694cd17fa0adf2197f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sun, 31 May 2020 17:54:57 +0200 Subject: [PATCH 1/2] loginctl: define loop iterators in the loop header --- src/login/loginctl.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/login/loginctl.c b/src/login/loginctl.c index 7e33fd6ec2..7805863d8d 100644 --- a/src/login/loginctl.c +++ b/src/login/loginctl.c @@ -815,7 +815,7 @@ static int show_properties(sd_bus *bus, const char *path, bool *new_line) { static int show_session(int argc, char *argv[], void *userdata) { bool properties, new_line = false; sd_bus *bus = userdata; - int r, i; + int r; _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_free_ char *path = NULL; @@ -834,7 +834,7 @@ static int show_session(int argc, char *argv[], void *userdata) { return print_session_status_info(bus, "/org/freedesktop/login1/session/auto", &new_line); } - for (i = 1; i < argc; i++) { + for (int i = 1; i < argc; i++) { r = get_session_path(bus, argv[i], &error, &path); if (r < 0) return log_error_errno(r, "Failed to get session path: %s", bus_error_message(&error, r)); @@ -854,7 +854,7 @@ static int show_session(int argc, char *argv[], void *userdata) { static int show_user(int argc, char *argv[], void *userdata) { bool properties, new_line = false; sd_bus *bus = userdata; - int r, i; + int r; assert(bus); assert(argv); @@ -871,7 +871,7 @@ static int show_user(int argc, char *argv[], void *userdata) { return print_user_status_info(bus, "/org/freedesktop/login1/user/self", &new_line); } - for (i = 1; i < argc; i++) { + for (int i = 1; i < argc; i++) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_(sd_bus_message_unrefp) sd_bus_message * reply = NULL; const char *path = NULL; @@ -911,7 +911,7 @@ static int show_user(int argc, char *argv[], void *userdata) { static int show_seat(int argc, char *argv[], void *userdata) { bool properties, new_line = false; sd_bus *bus = userdata; - int r, i; + int r; assert(bus); assert(argv); @@ -928,7 +928,7 @@ static int show_seat(int argc, char *argv[], void *userdata) { return print_seat_status_info(bus, "/org/freedesktop/login1/seat/auto", &new_line); } - for (i = 1; i < argc; i++) { + for (int i = 1; i < argc; i++) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_(sd_bus_message_unrefp) sd_bus_message * reply = NULL; const char *path = NULL; @@ -956,7 +956,7 @@ static int show_seat(int argc, char *argv[], void *userdata) { static int activate(int argc, char *argv[], void *userdata) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; sd_bus *bus = userdata; - int r, i; + int r; assert(bus); assert(argv); @@ -980,7 +980,7 @@ static int activate(int argc, char *argv[], void *userdata) { return 0; } - for (i = 1; i < argc; i++) { + for (int i = 1; i < argc; i++) { r = bus_call_method( bus, @@ -1001,7 +1001,7 @@ static int activate(int argc, char *argv[], void *userdata) { static int kill_session(int argc, char *argv[], void *userdata) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; sd_bus *bus = userdata; - int r, i; + int r; assert(bus); assert(argv); @@ -1011,7 +1011,7 @@ static int kill_session(int argc, char *argv[], void *userdata) { if (!arg_kill_who) arg_kill_who = "all"; - for (i = 1; i < argc; i++) { + for (int i = 1; i < argc; i++) { r = bus_call_method( bus, @@ -1031,7 +1031,7 @@ static int enable_linger(int argc, char *argv[], void *userdata) { sd_bus *bus = userdata; char* short_argv[3]; bool b; - int r, i; + int r; assert(bus); assert(argv); @@ -1051,7 +1051,7 @@ static int enable_linger(int argc, char *argv[], void *userdata) { argc = 2; } - for (i = 1; i < argc; i++) { + for (int i = 1; i < argc; i++) { uid_t uid; if (isempty(argv[i])) @@ -1078,14 +1078,14 @@ static int enable_linger(int argc, char *argv[], void *userdata) { static int terminate_user(int argc, char *argv[], void *userdata) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; sd_bus *bus = userdata; - int r, i; + int r; assert(bus); assert(argv); polkit_agent_open_if_enabled(arg_transport, arg_ask_password); - for (i = 1; i < argc; i++) { + for (int i = 1; i < argc; i++) { uid_t uid; r = get_user_creds((const char**) (argv+i), &uid, NULL, NULL, NULL, 0); @@ -1103,7 +1103,7 @@ static int terminate_user(int argc, char *argv[], void *userdata) { static int kill_user(int argc, char *argv[], void *userdata) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; sd_bus *bus = userdata; - int r, i; + int r; assert(bus); assert(argv); @@ -1113,7 +1113,7 @@ static int kill_user(int argc, char *argv[], void *userdata) { if (!arg_kill_who) arg_kill_who = "all"; - for (i = 1; i < argc; i++) { + for (int i = 1; i < argc; i++) { uid_t uid; r = get_user_creds((const char**) (argv+i), &uid, NULL, NULL, NULL, 0); @@ -1136,14 +1136,14 @@ static int kill_user(int argc, char *argv[], void *userdata) { static int attach(int argc, char *argv[], void *userdata) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; sd_bus *bus = userdata; - int r, i; + int r; assert(bus); assert(argv); polkit_agent_open_if_enabled(arg_transport, arg_ask_password); - for (i = 2; i < argc; i++) { + for (int i = 2; i < argc; i++) { r = bus_call_method( bus, @@ -1200,14 +1200,14 @@ static int lock_sessions(int argc, char *argv[], void *userdata) { static int terminate_seat(int argc, char *argv[], void *userdata) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; sd_bus *bus = userdata; - int r, i; + int r; assert(bus); assert(argv); polkit_agent_open_if_enabled(arg_transport, arg_ask_password); - for (i = 1; i < argc; i++) { + for (int i = 1; i < argc; i++) { r = bus_call_method(bus, bus_login_mgr, "TerminateSeat", &error, NULL, "s", argv[i]); if (r < 0) From 156a5fd297b61bce31630d7a52c15614bf784843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sun, 31 May 2020 18:21:09 +0200 Subject: [PATCH 2/2] basic/user-util: always use base 10 for user/group numbers We would parse numbers with base prefixes as user identifiers. For example, "0x2b3bfa0" would be interpreted as UID==45334432 and "01750" would be interpreted as UID==1000. This parsing was used also in cases where either a user/group name or number may be specified. This means that names like 0x2b3bfa0 would be ambiguous: they are a valid user name according to our documented relaxed rules, but they would also be parsed as numeric uids. This behaviour is definitely not expected by users, since tools generally only accept decimal numbers (e.g. id, getent passwd), while other tools only accept user names and thus will interpret such strings as user names without even attempting to convert them to numbers (su, ssh). So let's follow suit and only accept numbers in decimal notation. Effectively this means that we will reject such strings as a username/uid/groupname/gid where strict mode is used, and try to look up a user/group with such a name in relaxed mode. Since the function changed is fairly low-level and fairly widely used, this affects multiple tools: loginctl show-user/enable-linger/disable-linger foo', the third argument in sysusers.d, fourth and fifth arguments in tmpfiles.d, etc. Fixes #15985. --- src/basic/user-util.c | 2 +- src/test/test-user-util.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/basic/user-util.c b/src/basic/user-util.c index 2e3580017d..2db8ef6abf 100644 --- a/src/basic/user-util.c +++ b/src/basic/user-util.c @@ -49,7 +49,7 @@ int parse_uid(const char *s, uid_t *ret) { assert(s); assert_cc(sizeof(uid_t) == sizeof(uint32_t)); - r = safe_atou32(s, &uid); + r = safe_atou32_full(s, 10, &uid); if (r < 0) return r; diff --git a/src/test/test-user-util.c b/src/test/test-user-util.c index a0e1495186..3165232fef 100644 --- a/src/test/test-user-util.c +++ b/src/test/test-user-util.c @@ -48,9 +48,19 @@ static void test_parse_uid(void) { r = parse_uid("65535", &uid); assert_se(r == -ENXIO); + assert_se(uid == 100); + + r = parse_uid("0x1234", &uid); + assert_se(r == -EINVAL); + assert_se(uid == 100); + + r = parse_uid("01234", &uid); + assert_se(r == 0); + assert_se(uid == 1234); r = parse_uid("asdsdas", &uid); assert_se(r == -EINVAL); + assert_se(uid == 1234); } static void test_uid_ptr(void) {