diff --git a/src/basic/selinux-util.c b/src/basic/selinux-util.c index 380285d573..139e6e21e3 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_use(void) { 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/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/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-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-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/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/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/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 ce8efce3d5..097f8c1a4b 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; @@ -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-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; } 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/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(); 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); 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..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) { @@ -814,7 +813,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'; @@ -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", @@ -2536,19 +2527,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); }