From abbb206c8d15f8d5d4be1123d9e95aaff2e5c72a Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Thu, 30 Jan 2020 13:41:06 -0500 Subject: [PATCH] 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 --- libxcmd/input.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) 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; } -- 2.47.3