udf: udftime: prevent overflow in udf_disk_stamp_to_time()
authorRoman Smirnov <r.smirnov@omp.ru>
Wed, 27 Mar 2024 13:27:55 +0000 (16:27 +0300)
committerJan Kara <jack@suse.cz>
Wed, 10 Apr 2024 11:10:12 +0000 (13:10 +0200)
An overflow can occur in a situation where src.centiseconds
takes the value of 255. This situation is unlikely, but there
is no validation check anywere in the code.

Found by Linux Verification Center (linuxtesting.org) with Svace.

Suggested-by: Jan Kara <jack@suse.cz>
Signed-off-by: Roman Smirnov <r.smirnov@omp.ru>
Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru>
Signed-off-by: Jan Kara <jack@suse.cz>
Message-Id: <20240327132755.13945-1-r.smirnov@omp.ru>

fs/udf/udftime.c

index 758163af39c2620186158df8cf8f96dc7f331ad8..78ecc633606fb345c69a9981ca135432769d3ed6 100644 (file)
@@ -46,13 +46,18 @@ udf_disk_stamp_to_time(struct timespec64 *dest, struct timestamp src)
        dest->tv_sec = mktime64(year, src.month, src.day, src.hour, src.minute,
                        src.second);
        dest->tv_sec -= offset * 60;
-       dest->tv_nsec = 1000 * (src.centiseconds * 10000 +
-                       src.hundredsOfMicroseconds * 100 + src.microseconds);
+
        /*
         * Sanitize nanosecond field since reportedly some filesystems are
         * recorded with bogus sub-second values.
         */
-       dest->tv_nsec %= NSEC_PER_SEC;
+       if (src.centiseconds < 100 && src.hundredsOfMicroseconds < 100 &&
+           src.microseconds < 100) {
+               dest->tv_nsec = 1000 * (src.centiseconds * 10000 +
+                       src.hundredsOfMicroseconds * 100 + src.microseconds);
+       } else {
+               dest->tv_nsec = 0;
+       }
 }
 
 void