]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 5 Jul 2024 07:08:21 +0000 (09:08 +0200)
[ Upstream commit 3b84adf460381169c085e4bc09e7b57e9e16db0a ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/udf/udftime.c

index fce4ad976c8c29a179a8c81096569d1e778edd21..26169b1f482c3ba34a3ed42e1d7baf83d3b99813 100644 (file)
@@ -60,13 +60,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