From: Darrick J. Wong Date: Thu, 30 Jan 2020 18:41:06 +0000 (-0500) Subject: xfs_io: fix integer over/underflow handling in timespec_from_string X-Git-Tag: v5.5.0-rc1~53 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=abbb206c8d15f8d5d4be1123d9e95aaff2e5c72a;p=thirdparty%2Fxfsprogs-dev.git xfs_io: fix integer over/underflow handling in timespec_from_string When we're filling out the struct timespec, make sure we detect when the string value cannot be represented by a (potentially 32-bit) seconds field in struct timespec. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig Signed-off-by: Eric Sandeen --- diff --git a/libxcmd/input.c b/libxcmd/input.c index d232d4f35..137856e3b 100644 --- a/libxcmd/input.c +++ b/libxcmd/input.c @@ -183,19 +183,30 @@ timestr( int timespec_from_string( - const char * secs, - const char * nsecs, - struct timespec * ts) + const char *secs, + const char *nsecs, + struct timespec *ts) { - char* p; + char *p; + unsigned long long int ll; + if (!secs || !nsecs || !ts) return 1; - ts->tv_sec = strtoull(secs, &p, 0); + + ll = strtoull(secs, &p, 0); if (*p) return 1; - ts->tv_nsec = strtoull(nsecs, &p, 0); + ts->tv_sec = ll; + if ((unsigned long long int)ts->tv_sec != ll) + return 1; + + ll = strtoull(nsecs, &p, 0); if (*p) return 1; + ts->tv_nsec = ll; + if ((unsigned long long int)ts->tv_nsec != ll) + return 1; + return 0; }