aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Smirnov <[email protected]>2024-03-27 16:27:55 +0300
committerJan Kara <[email protected]>2024-04-10 13:10:12 +0200
commit3b84adf460381169c085e4bc09e7b57e9e16db0a (patch)
tree55a1b62160e32e17cb33f76096015ef09cdb9679
parent3e90417f41f41a7d4a6d5ee0ca216698e9ab4381 (diff)
udf: udftime: prevent overflow in udf_disk_stamp_to_time()
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 <[email protected]> Signed-off-by: Roman Smirnov <[email protected]> Reviewed-by: Sergey Shtylyov <[email protected]> Signed-off-by: Jan Kara <[email protected]> Message-Id: <[email protected]>
-rw-r--r--fs/udf/udftime.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/fs/udf/udftime.c b/fs/udf/udftime.c
index 758163af39c2..78ecc633606f 100644
--- a/fs/udf/udftime.c
+++ b/fs/udf/udftime.c
@@ -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