From: Yu Watanabe Date: Thu, 18 Jun 2020 04:48:45 +0000 (+0900) Subject: udev: udev_event_apply_format() always make buf NUL terminated X-Git-Tag: v246-rc1~137^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5eb6ef8b452ef15788cc0c7d176be38a2cef8ca2;p=thirdparty%2Fsystemd.git udev: udev_event_apply_format() always make buf NUL terminated The return value of udev_event_apply_format() is always ignored. So, the destination buffer must be always NUL terminated. --- diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c index 309cfebc8d2..b468ce9c034 100644 --- a/src/udev/udev-event.c +++ b/src/udev/udev-event.c @@ -437,9 +437,9 @@ null_terminate: return 0; } -ssize_t udev_event_apply_format(UdevEvent *event, - const char *src, char *dest, size_t size, - bool replace_whitespace) { +size_t udev_event_apply_format(UdevEvent *event, + const char *src, char *dest, size_t size, + bool replace_whitespace) { const char *s = src; int r; @@ -455,9 +455,10 @@ ssize_t udev_event_apply_format(UdevEvent *event, ssize_t subst_len; r = get_subst_type(&s, false, &type, attr); - if (r < 0) - return log_device_warning_errno(event->dev, r, "Invalid format string, ignoring: %s", src); - if (r == 0) { + if (r < 0) { + log_device_warning_errno(event->dev, r, "Invalid format string, ignoring: %s", src); + break; + } else if (r == 0) { if (size < 2) /* need space for this char and the terminating NUL */ break; *dest++ = *s++; @@ -466,10 +467,12 @@ ssize_t udev_event_apply_format(UdevEvent *event, } subst_len = udev_event_subst_format(event, type, attr, dest, size); - if (subst_len < 0) - return log_device_warning_errno(event->dev, subst_len, - "Failed to substitute variable '$%s' or apply format '%%%c', ignoring: %m", - format_type_to_string(type), format_type_to_char(type)); + if (subst_len < 0) { + log_device_warning_errno(event->dev, subst_len, + "Failed to substitute variable '$%s' or apply format '%%%c', ignoring: %m", + format_type_to_string(type), format_type_to_char(type)); + break; + } /* FORMAT_SUBST_RESULT handles spaces itself */ if (replace_whitespace && type != FORMAT_SUBST_RESULT) diff --git a/src/udev/udev-event.h b/src/udev/udev-event.h index a78cea440da..a0193ffef35 100644 --- a/src/udev/udev-event.h +++ b/src/udev/udev-event.h @@ -48,9 +48,9 @@ UdevEvent *udev_event_new(sd_device *dev, usec_t exec_delay_usec, sd_netlink *rt UdevEvent *udev_event_free(UdevEvent *event); DEFINE_TRIVIAL_CLEANUP_FUNC(UdevEvent*, udev_event_free); -ssize_t udev_event_apply_format(UdevEvent *event, - const char *src, char *dest, size_t size, - bool replace_whitespace); +size_t udev_event_apply_format(UdevEvent *event, + const char *src, char *dest, size_t size, + bool replace_whitespace); int udev_check_format(const char *value, size_t *offset, const char **hint); int udev_event_spawn(UdevEvent *event, usec_t timeout_usec, diff --git a/src/udev/udevadm-test.c b/src/udev/udevadm-test.c index 8b348098990..3f8bdc28120 100644 --- a/src/udev/udevadm-test.c +++ b/src/udev/udevadm-test.c @@ -151,7 +151,7 @@ int test_main(int argc, char *argv[], void *userdata) { ORDERED_HASHMAP_FOREACH_KEY(val, cmd, event->run_list, i) { char program[UTIL_PATH_SIZE]; - udev_event_apply_format(event, cmd, program, sizeof(program), false); + (void) udev_event_apply_format(event, cmd, program, sizeof(program), false); printf("run: '%s'\n", program); }