]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
logger: correctly format tv_usec
authorThomas Weißschuh <thomas@t-8ch.de>
Tue, 9 Apr 2024 09:00:26 +0000 (11:00 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 16 Dec 2024 10:14:47 +0000 (11:14 +0100)
tv_usec is an unspecified signed integer type.
The format string %u assumes an unsigned int, which is incorrect.
Especially on 32bit big-endian, where it can lead to invalid values.

Reported-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Link: https://lore.kernel.org/util-linux/afef1b770ad80d50660bb2c53a0a8330b88d1049.camel@physik.fu-berlin.de/
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
(cherry picked from commit 6227b2b0585ee2ccf224cf70c7144296a814a4ab)

misc-utils/logger.c

index e1d270de8df6782bc5c801c185e6f53ea14e5e9b..e928286c2fbb1b533f38cf8769acf0934b7826ea 100644 (file)
@@ -798,12 +798,12 @@ static void syslog_rfc5424_header(struct logger_ctl *const ctl)
                if (localtime_r(&tv.tv_sec, &tm) != NULL) {
                        char fmt[64];
                        const size_t i = strftime(fmt, sizeof(fmt),
-                                                 "%Y-%m-%dT%H:%M:%S.%%06u%z ", &tm);
+                                                 "%Y-%m-%dT%H:%M:%S.%%06jd%z ", &tm);
                        /* patch TZ info to comply with RFC3339 (we left SP at end) */
                        fmt[i - 1] = fmt[i - 2];
                        fmt[i - 2] = fmt[i - 3];
                        fmt[i - 3] = ':';
-                       xasprintf(&time, fmt, tv.tv_usec);
+                       xasprintf(&time, fmt, (intmax_t) tv.tv_usec);
                } else
                        err(EXIT_FAILURE, _("localtime() failed"));
        } else