]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib/timeutils: ISO_8601_BUFSIZ too small
authorJ William Piggott <elseifthen@gmx.com>
Tue, 26 Sep 2017 00:56:06 +0000 (20:56 -0400)
committerKarel Zak <kzak@redhat.com>
Thu, 14 Dec 2017 14:32:24 +0000 (15:32 +0100)
Although iso-8601 specifies years as 4 digits, it allows
them to be wider.

The current POSIX year width is limited by 'int tm_year'
at 10 digits plus a negative sign.

That, and the possibility of nanosecond time makes the
widest POSIX iso-8601 time 41 characters. Plus the \0
string terminator yields a buffer size of 42.

Before truncated output:
/sbin/hwclock --utc --noadjfile --predict --date '-2147483765 years'
-2147481748-09-25 20:29:45.0000

Patched:
./hwclock --utc --noadjfile --predict --date '-2147483765 years'
-2147481748-09-25 20:17:21.000000-0456

./hwclock --utc --noadjfile --predict --date '-2147483766 years'
hwclock: invalid date '-2147483766 years'

Comparable to coreutils 'date' command:
date -Ins --date '-2147483765 years'
-2147481748-09-25T19:49:31,578899297-0456

date -Ins --date '-2147483766 years'
date: invalid date '-2147483766 years'

The 'date' output illustrates the full 41 character POSIX iso-8601

Signed-off-by: J William Piggott <elseifthen@gmx.com>
include/timeutils.h

index 874f853b768f43a40dbc9374a9eb70941cbf726e..edd42f7fe8098eb3584997612c8adc2106c862c1 100644 (file)
@@ -65,7 +65,7 @@ enum {
        ISO_8601_GMTIME         = (1 << 7)
 };
 
-#define ISO_8601_BUFSIZ        32
+#define ISO_8601_BUFSIZ        42
 
 int strtimeval_iso(struct timeval *tv, int flags, char *buf, size_t bufsz);
 int strtm_iso(struct tm *tm, int flags, char *buf, size_t bufsz);