From 35bca925f9bf78df3f64e321ab4830936fcef662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 13 May 2017 11:24:37 -0400 Subject: [PATCH 1/5] tree-wide: fix incorrect uses of %m In those cases errno was not set, so we would be logging some unrelated error or "Success". --- src/import/import-raw.c | 4 ++-- src/import/import-tar.c | 4 ++-- src/libsystemd/sd-bus/test-bus-objects.c | 2 -- src/nspawn/nspawn.c | 2 +- src/stdio-bridge/stdio-bridge.c | 4 ++-- src/test/test-loopback.c | 2 +- 6 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/import/import-raw.c b/src/import/import-raw.c index 808eae38f8..55cf8e8edd 100644 --- a/src/import/import-raw.c +++ b/src/import/import-raw.c @@ -355,7 +355,7 @@ static int raw_import_process(RawImport *i) { } if (l == 0) { if (i->compress.type == IMPORT_COMPRESS_UNKNOWN) { - log_error("Premature end of file: %m"); + log_error("Premature end of file."); r = -EIO; goto finish; } @@ -369,7 +369,7 @@ static int raw_import_process(RawImport *i) { if (i->compress.type == IMPORT_COMPRESS_UNKNOWN) { r = import_uncompress_detect(&i->compress, i->buffer, i->buffer_size); if (r < 0) { - log_error("Failed to detect file compression: %m"); + log_error_errno(r, "Failed to detect file compression: %m"); goto finish; } if (r == 0) /* Need more data */ diff --git a/src/import/import-tar.c b/src/import/import-tar.c index 1c229ec82f..ba140bccbd 100644 --- a/src/import/import-tar.c +++ b/src/import/import-tar.c @@ -284,7 +284,7 @@ static int tar_import_process(TarImport *i) { } if (l == 0) { if (i->compress.type == IMPORT_COMPRESS_UNKNOWN) { - log_error("Premature end of file: %m"); + log_error("Premature end of file."); r = -EIO; goto finish; } @@ -298,7 +298,7 @@ static int tar_import_process(TarImport *i) { if (i->compress.type == IMPORT_COMPRESS_UNKNOWN) { r = import_uncompress_detect(&i->compress, i->buffer, i->buffer_size); if (r < 0) { - log_error("Failed to detect file compression: %m"); + log_error_errno(r, "Failed to detect file compression: %m"); goto finish; } if (r == 0) /* Need more data */ diff --git a/src/libsystemd/sd-bus/test-bus-objects.c b/src/libsystemd/sd-bus/test-bus-objects.c index 233a21a523..0b33ab7a3a 100644 --- a/src/libsystemd/sd-bus/test-bus-objects.c +++ b/src/libsystemd/sd-bus/test-bus-objects.c @@ -525,8 +525,6 @@ int main(int argc, char *argv[]) { void *p; int r, q; - zero(c); - c.automatic_integer_property = 4711; assert_se(c.automatic_string_property = strdup("dudeldu")); diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index a21fc1ba99..767d99201c 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -2029,7 +2029,7 @@ static int determine_names(void) { if (r < 0) return log_error_errno(r, "Failed to find image for machine '%s': %m", arg_machine); if (r == 0) { - log_error("No image for machine '%s': %m", arg_machine); + log_error("No image for machine '%s'.", arg_machine); return -ENOENT; } diff --git a/src/stdio-bridge/stdio-bridge.c b/src/stdio-bridge/stdio-bridge.c index ce8efce3d5..02ba5269dd 100644 --- a/src/stdio-bridge/stdio-bridge.c +++ b/src/stdio-bridge/stdio-bridge.c @@ -115,7 +115,7 @@ int main(int argc, char *argv[]) { in_fd = SD_LISTEN_FDS_START; out_fd = SD_LISTEN_FDS_START; } else { - log_error("Illegal number of file descriptors passed\n"); + log_error("Illegal number of file descriptors passed."); goto finish; } @@ -190,7 +190,7 @@ int main(int argc, char *argv[]) { } for (;;) { - _cleanup_(sd_bus_message_unrefp)sd_bus_message *m = NULL; + _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL; int events_a, events_b, fd; uint64_t timeout_a, timeout_b, t; struct timespec _ts, *ts; diff --git a/src/test/test-loopback.c b/src/test/test-loopback.c index 7b67337331..8ebd0e0e01 100644 --- a/src/test/test-loopback.c +++ b/src/test/test-loopback.c @@ -31,7 +31,7 @@ int main(int argc, char* argv[]) { r = loopback_setup(); if (r < 0) - log_error("loopback: %m"); + log_error_errno(r, "loopback: %m"); return r >= 0 ? EXIT_SUCCESS : EXIT_FAILURE; } From 25f027c5efb2a26b2c7cb9a9608eb2bd49cc5ffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 13 May 2017 11:26:55 -0400 Subject: [PATCH 2/5] tree-wide: when %m is used in log_*, always specify errno explicitly All those uses were correct, but I think it's better to be explicit. Using implicit errno is too error prone, and with this change we can require (in the sense of a style guideline) that the code is always specified. Helpful query: git grep -n -P 'log_[^s][a-z]+\(.*%m' --- src/basic/selinux-util.c | 2 +- src/core/cgroup.c | 3 +-- src/core/main.c | 2 +- src/libsystemd-network/sd-dhcp-client.c | 8 ++++---- src/libsystemd/sd-device/device-enumerator.c | 12 ++++-------- src/libsystemd/sd-device/sd-device.c | 3 +-- src/libudev/libudev-monitor.c | 2 +- src/shared/install.c | 2 +- src/stdio-bridge/stdio-bridge.c | 2 +- src/test/test-nss.c | 2 +- src/tmpfiles/tmpfiles.c | 7 +++---- src/udev/udev-rules.c | 18 +++++++++--------- 12 files changed, 28 insertions(+), 35 deletions(-) diff --git a/src/basic/selinux-util.c b/src/basic/selinux-util.c index bc07654668..bc53f812e3 100644 --- a/src/basic/selinux-util.c +++ b/src/basic/selinux-util.c @@ -50,7 +50,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(context_t, context_free); static int cached_use = -1; static struct selabel_handle *label_hnd = NULL; -#define log_enforcing(...) log_full(security_getenforce() == 1 ? LOG_ERR : LOG_DEBUG, __VA_ARGS__) +#define log_enforcing(...) log_full_errno(security_getenforce() == 1 ? LOG_ERR : LOG_DEBUG, errno, __VA_ARGS__) #endif bool mac_selinux_have(void) { diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 774b832a63..71f307fb6c 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -398,8 +398,7 @@ static int whitelist_major(const char *path, const char *name, char type, const return 0; fail: - log_warning_errno(errno, "Failed to read /proc/devices: %m"); - return -errno; + return log_warning_errno(errno, "Failed to read /proc/devices: %m"); } static bool cgroup_context_has_cpu_weight(CGroupContext *c) { diff --git a/src/core/main.c b/src/core/main.c index e6ae0bee31..c2439ed185 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -536,7 +536,7 @@ static int config_parse_cpu_affinity2( return ncpus; if (sched_setaffinity(0, CPU_ALLOC_SIZE(ncpus), c) < 0) - log_warning("Failed to set CPU affinity: %m"); + log_warning_errno(errno, "Failed to set CPU affinity: %m"); return 0; } diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c index 7c0317640f..e20d339bd5 100644 --- a/src/libsystemd-network/sd-dhcp-client.c +++ b/src/libsystemd-network/sd-dhcp-client.c @@ -1655,7 +1655,8 @@ static int client_receive_message_udp( if (errno == EAGAIN || errno == EINTR) return 0; - return log_dhcp_client_errno(client, errno, "Could not receive message from UDP socket: %m"); + return log_dhcp_client_errno(client, errno, + "Could not receive message from UDP socket: %m"); } if ((size_t) len < sizeof(DHCPMessage)) { log_dhcp_client(client, "Too small to be a DHCP message: ignoring"); @@ -1748,9 +1749,8 @@ static int client_receive_message_raw( if (errno == EAGAIN || errno == EINTR) return 0; - log_dhcp_client(client, "Could not receive message from raw socket: %m"); - - return -errno; + return log_dhcp_client_errno(client, errno, + "Could not receive message from raw socket: %m"); } else if ((size_t)len < sizeof(DHCPPacket)) return 0; diff --git a/src/libsystemd/sd-device/device-enumerator.c b/src/libsystemd/sd-device/device-enumerator.c index 86f8935a14..ebb8b2d160 100644 --- a/src/libsystemd/sd-device/device-enumerator.c +++ b/src/libsystemd/sd-device/device-enumerator.c @@ -631,10 +631,8 @@ static int enumerator_scan_devices_tag(sd_device_enumerator *enumerator, const c if (!dir) { if (errno == ENOENT) return 0; - else { - log_error("sd-device-enumerator: could not open tags directory %s: %m", path); - return -errno; - } + else + return log_error_errno(errno, "sd-device-enumerator: could not open tags directory %s: %m", path); } /* TODO: filter away subsystems? */ @@ -758,10 +756,8 @@ static int parent_crawl_children(sd_device_enumerator *enumerator, const char *p int r = 0; dir = opendir(path); - if (!dir) { - log_debug("sd-device-enumerate: could not open parent directory %s: %m", path); - return -errno; - } + if (!dir) + return log_debug_errno(errno, "sd-device-enumerate: could not open parent directory %s: %m", path); FOREACH_DIRENT_ALL(dent, dir, return -errno) { _cleanup_free_ char *child = NULL; diff --git a/src/libsystemd/sd-device/sd-device.c b/src/libsystemd/sd-device/sd-device.c index 04ead29338..c56ae39c9f 100644 --- a/src/libsystemd/sd-device/sd-device.c +++ b/src/libsystemd/sd-device/sd-device.c @@ -195,8 +195,7 @@ int device_set_syspath(sd_device *device, const char *_syspath, bool verify) { /* this is not a valid device */ return -ENODEV; - log_debug("sd-device: %s does not have an uevent file: %m", syspath); - return -errno; + return log_debug_errno(errno, "sd-device: %s does not have an uevent file: %m", syspath); } } else { /* everything else just needs to be a directory */ diff --git a/src/libudev/libudev-monitor.c b/src/libudev/libudev-monitor.c index a40329d732..8287694c49 100644 --- a/src/libudev/libudev-monitor.c +++ b/src/libudev/libudev-monitor.c @@ -681,7 +681,7 @@ retry: udev_device = udev_device_new_from_nulstr(udev_monitor->udev, &buf.raw[bufpos], buflen - bufpos); if (!udev_device) { - log_debug("could not create device: %m"); + log_debug_errno(errno, "could not create device: %m"); return NULL; } diff --git a/src/shared/install.c b/src/shared/install.c index 58c8e852b2..7f3bc0d813 100644 --- a/src/shared/install.c +++ b/src/shared/install.c @@ -3045,7 +3045,7 @@ int unit_file_get_list( if (errno == ENOENT) continue; if (IN_SET(errno, ENOTDIR, EACCES)) { - log_debug("Failed to open \"%s\": %m", *i); + log_debug_errno(errno, "Failed to open \"%s\": %m", *i); continue; } diff --git a/src/stdio-bridge/stdio-bridge.c b/src/stdio-bridge/stdio-bridge.c index 02ba5269dd..097f8c1a4b 100644 --- a/src/stdio-bridge/stdio-bridge.c +++ b/src/stdio-bridge/stdio-bridge.c @@ -292,7 +292,7 @@ int main(int argc, char *argv[]) { r = ppoll(p, ELEMENTSOF(p), ts, NULL); } if (r < 0) { - log_error("ppoll() failed: %m"); + log_error_errno(errno, "ppoll() failed: %m"); goto finish; } } diff --git a/src/test/test-nss.c b/src/test/test-nss.c index b4cb3f0d37..57eeb8e40c 100644 --- a/src/test/test-nss.c +++ b/src/test/test-nss.c @@ -105,7 +105,7 @@ static int print_gaih_addrtuples(const struct gaih_addrtuple *tuples) { goto numerical_index; if (if_indextoname(it->scopeid, ifname) == NULL) { - log_warning("if_indextoname(%d) failed: %m", it->scopeid); + log_warning_errno(errno, "if_indextoname(%d) failed: %m", it->scopeid); numerical_index: xsprintf(ifname, "%i", it->scopeid); }; diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index 36488c9a5c..9419c99e28 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -724,10 +724,9 @@ static int path_set_xattrs(Item *i, const char *path) { n = strlen(*value); log_debug("Setting extended attribute '%s=%s' on %s.", *name, *value, path); - if (lsetxattr(path, *name, *value, n, 0) < 0) { - log_error("Setting extended attribute %s=%s on %s failed: %m", *name, *value, path); - return -errno; - } + if (lsetxattr(path, *name, *value, n, 0) < 0) + return log_error_errno(errno, "Setting extended attribute %s=%s on %s failed: %m", + *name, *value, path); } return 0; } diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c index 4d07b8fce0..a1b2513794 100644 --- a/src/udev/udev-rules.c +++ b/src/udev/udev-rules.c @@ -814,7 +814,7 @@ static const char *get_key_attribute(struct udev *udev, char *str) { attr++; pos = strchr(attr, '}'); if (pos == NULL) { - log_error("missing closing brace for format"); + log_error("Missing closing brace for format"); return NULL; } pos[0] = '\0'; @@ -2536,19 +2536,19 @@ int udev_rules_apply_static_dev_perms(struct udev_rules *rules) { } if (mode != (stats.st_mode & 01777)) { r = chmod(device_node, mode); - if (r < 0) { - log_error("failed to chmod '%s' %#o", device_node, mode); - return -errno; - } else + if (r < 0) + return log_error_errno(errno, "Failed to chmod '%s' %#o: %m", + device_node, mode); + else log_debug("chmod '%s' %#o", device_node, mode); } if ((uid != 0 && uid != stats.st_uid) || (gid != 0 && gid != stats.st_gid)) { r = chown(device_node, uid, gid); - if (r < 0) { - log_error("failed to chown '%s' %u %u ", device_node, uid, gid); - return -errno; - } else + if (r < 0) + return log_error_errno(errno, "Failed to chown '%s' %u %u: %m", + device_node, uid, gid); + else log_debug("chown '%s' %u %u", device_node, uid, gid); } From bf32e385761d65459a7ee79864d43d87e6774992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 19 May 2017 14:37:48 -0400 Subject: [PATCH 3/5] test-parse-util: verify that ato[ui] actually rejects trailing garbage --- src/test/test-parse-util.c | 69 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/src/test/test-parse-util.c b/src/test/test-parse-util.c index d08014100b..9194772fca 100644 --- a/src/test/test-parse-util.c +++ b/src/test/test-parse-util.c @@ -395,6 +395,9 @@ static void test_safe_atou16(void) { r = safe_atou16("junk", &l); assert_se(r == -EINVAL); + + r = safe_atou16("123x", &l); + assert_se(r == -EINVAL); } static void test_safe_atoi16(void) { @@ -425,6 +428,70 @@ static void test_safe_atoi16(void) { r = safe_atoi16("junk", &l); assert_se(r == -EINVAL); + + r = safe_atoi16("123x", &l); + assert_se(r == -EINVAL); +} + +static void test_safe_atou64(void) { + int r; + uint64_t l; + + r = safe_atou64("12345", &l); + assert_se(r == 0); + assert_se(l == 12345); + + r = safe_atou64(" 12345", &l); + assert_se(r == 0); + assert_se(l == 12345); + + r = safe_atou64("18446744073709551617", &l); + assert_se(r == -ERANGE); + + r = safe_atou64("-1", &l); + assert_se(r == -ERANGE); + + r = safe_atou64(" -1", &l); + assert_se(r == -ERANGE); + + r = safe_atou64("junk", &l); + assert_se(r == -EINVAL); + + r = safe_atou64("123x", &l); + assert_se(r == -EINVAL); +} + +static void test_safe_atoi64(void) { + int r; + int64_t l; + + r = safe_atoi64("-12345", &l); + assert_se(r == 0); + assert_se(l == -12345); + + r = safe_atoi64(" -12345", &l); + assert_se(r == 0); + assert_se(l == -12345); + + r = safe_atoi64("32767", &l); + assert_se(r == 0); + assert_se(l == 32767); + + r = safe_atoi64(" 32767", &l); + assert_se(r == 0); + assert_se(l == 32767); + + r = safe_atoi64("9223372036854775813", &l); + assert_se(r == -ERANGE); + + r = safe_atoi64("-9223372036854775813", &l); + assert_se(r == -ERANGE); + + r = safe_atoi64("junk", &l); + assert_se(r == -EINVAL); + + r = safe_atoi64("123x", &l); + assert_se(r == -EINVAL); } static void test_safe_atod(void) { @@ -538,6 +605,8 @@ int main(int argc, char *argv[]) { test_safe_atolli(); test_safe_atou16(); test_safe_atoi16(); + test_safe_atou64(); + test_safe_atoi64(); test_safe_atod(); test_parse_percent(); test_parse_percent_unbounded(); From 9c0565b2c3dec698a526cade57b331004699e094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 19 May 2017 14:49:06 -0400 Subject: [PATCH 4/5] basic/time-util: make parsing of dual_timestamp more strict *scanf functions set errno on i/o error. For sscanf, this doesn't really apply, so (based on the man page), it seems that errno is unlikely to be ever set to a useful value. So just ignore errno. The error message includes the string that was parsed, so it should be always pretty clear why parsing failed. On the other hand, detect trailing characters and minus prefix that weren't converted properly. This matches what our safe_ato* functions do. Add tests to elucidate various edge cases. --- src/basic/time-util.c | 18 ++++++++++++++++-- src/test/test-time.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/basic/time-util.c b/src/basic/time-util.c index a0db97c41a..8d55af8492 100644 --- a/src/basic/time-util.c +++ b/src/basic/time-util.c @@ -555,15 +555,29 @@ void dual_timestamp_serialize(FILE *f, const char *name, dual_timestamp *t) { int dual_timestamp_deserialize(const char *value, dual_timestamp *t) { uint64_t a, b; + int r, pos; assert(value); assert(t); - if (sscanf(value, "%" PRIu64 "%" PRIu64, &a, &b) != 2) { - log_debug("Failed to parse dual timestamp value \"%s\": %m", value); + pos = strspn(value, WHITESPACE); + if (value[pos] == '-') + return -EINVAL; + pos += strspn(value + pos, DIGITS); + pos += strspn(value + pos, WHITESPACE); + if (value[pos] == '-') + return -EINVAL; + + r = sscanf(value, "%" PRIu64 "%" PRIu64 "%n", &a, &b, &pos); + if (r != 2) { + log_debug("Failed to parse dual timestamp value \"%s\".", value); return -EINVAL; } + if (value[pos] != '\0') + /* trailing garbage */ + return -EINVAL; + t->realtime = a; t->monotonic = b; diff --git a/src/test/test-time.c b/src/test/test-time.c index 911282bf0c..c9e31e90e1 100644 --- a/src/test/test-time.c +++ b/src/test/test-time.c @@ -273,6 +273,43 @@ static void test_format_timestamp_utc(void) { test_format_timestamp_utc_one(USEC_INFINITY, NULL); } +static void test_dual_timestamp_deserialize(void) { + int r; + dual_timestamp t; + + r = dual_timestamp_deserialize("1234 5678", &t); + assert_se(r == 0); + assert_se(t.realtime == 1234); + assert_se(t.monotonic == 5678); + + r = dual_timestamp_deserialize("1234x 5678", &t); + assert_se(r == -EINVAL); + + r = dual_timestamp_deserialize("1234 5678y", &t); + assert_se(r == -EINVAL); + + r = dual_timestamp_deserialize("-1234 5678", &t); + assert_se(r == -EINVAL); + + r = dual_timestamp_deserialize("1234 -5678", &t); + assert_se(r == -EINVAL); + + /* Check that output wasn't modified. */ + assert_se(t.realtime == 1234); + assert_se(t.monotonic == 5678); + + r = dual_timestamp_deserialize("+123 567", &t); + assert_se(r == 0); + assert_se(t.realtime == 123); + assert_se(t.monotonic == 567); + + /* Check that we get "infinity" on overflow. */ + r = dual_timestamp_deserialize("18446744073709551617 0", &t); + assert_se(r == 0); + assert_se(t.realtime == USEC_INFINITY); + assert_se(t.monotonic == 0); +} + int main(int argc, char *argv[]) { uintmax_t x; @@ -288,6 +325,7 @@ int main(int argc, char *argv[]) { test_usec_sub(); test_format_timestamp(); test_format_timestamp_utc(); + test_dual_timestamp_deserialize(); /* Ensure time_t is signed */ assert_cc((time_t) -1 < (time_t) 1); From 2da03cbf9d1f83fc15890ac2f70f98af15ceb924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 13 May 2017 16:23:30 -0400 Subject: [PATCH 5/5] udev-rules: add helper function for logging Avoid repeating the same conditional four times. Error messages are capitalized. --- src/udev/udev-rules.c | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c index a1b2513794..294a322547 100644 --- a/src/udev/udev-rules.c +++ b/src/udev/udev-rules.c @@ -474,6 +474,13 @@ static int add_token(struct udev_rules *rules, struct token *token) { return 0; } +static void log_unknown_owner(int error, const char *entity, const char *owner) { + if (IN_SET(abs(error), ENOENT, ESRCH)) + log_error("Specified %s '%s' unknown", entity, owner); + else + log_error_errno(error, "Error resolving %s '%s': %m", entity, owner); +} + static uid_t add_uid(struct udev_rules *rules, const char *owner) { unsigned int i; uid_t uid = 0; @@ -489,12 +496,8 @@ static uid_t add_uid(struct udev_rules *rules, const char *owner) { } } r = get_user_creds(&owner, &uid, NULL, NULL, NULL); - if (r < 0) { - if (r == -ENOENT || r == -ESRCH) - log_error("specified user '%s' unknown", owner); - else - log_error_errno(r, "error resolving user '%s': %m", owner); - } + if (r < 0) + log_unknown_owner(r, "user", owner); /* grow buffer if needed */ if (rules->uids_cur+1 >= rules->uids_max) { @@ -536,12 +539,8 @@ static gid_t add_gid(struct udev_rules *rules, const char *group) { } } r = get_group_creds(&group, &gid); - if (r < 0) { - if (r == -ENOENT || r == -ESRCH) - log_error("specified group '%s' unknown", group); - else - log_error_errno(r, "error resolving group '%s': %m", group); - } + if (r < 0) + log_unknown_owner(r, "group", group); /* grow buffer if needed */ if (rules->gids_cur+1 >= rules->gids_max) { @@ -2119,11 +2118,7 @@ void udev_rules_apply_to_event(struct udev_rules *rules, event->owner_set = true; r = get_user_creds(&ow, &event->uid, NULL, NULL, NULL); if (r < 0) { - if (r == -ENOENT || r == -ESRCH) - log_error("specified user '%s' unknown", owner); - else - log_error_errno(r, "error resolving user '%s': %m", owner); - + log_unknown_owner(r, "user", owner); event->uid = 0; } log_debug("OWNER %u %s:%u", @@ -2145,11 +2140,7 @@ void udev_rules_apply_to_event(struct udev_rules *rules, event->group_set = true; r = get_group_creds(&gr, &event->gid); if (r < 0) { - if (r == -ENOENT || r == -ESRCH) - log_error("specified group '%s' unknown", group); - else - log_error_errno(r, "error resolving group '%s': %m", group); - + log_unknown_owner(r, "group", group); event->gid = 0; } log_debug("GROUP %u %s:%u",