From 05617cb91fd6062c96542c7057ddf25b80fef5f1 Mon Sep 17 00:00:00 2001 From: Daniel Lehman Date: Tue, 15 Mar 2022 10:15:13 -0700 Subject: [PATCH 2/2] kernelbase: Check for invalid value in FileTimeToSystemTime. Signed-off-by: Daniel Lehman --- dlls/kernel32/tests/time.c | 2 -- dlls/kernelbase/file.c | 8 +++++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/dlls/kernel32/tests/time.c b/dlls/kernel32/tests/time.c index fdef78a44661..ee818a0e4a1e 100644 --- a/dlls/kernel32/tests/time.c +++ b/dlls/kernel32/tests/time.c @@ -400,11 +400,9 @@ static void test_FileTimeToSystemTime(void) ft.dwLowDateTime = -1; SetLastError(0xdeadbeef); ret = FileTimeToSystemTime(&ft, &st); - todo_wine { ok(!ret, "expected failure\n"); ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError()); - } } static void test_FileTimeToLocalFileTime(void) diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c index c6dc904044a4..f04ac1445abb 100644 --- a/dlls/kernelbase/file.c +++ b/dlls/kernelbase/file.c @@ -3874,8 +3874,14 @@ BOOL WINAPI DECLSPEC_HOTPATCH FileTimeToLocalFileTime( const FILETIME *utc, FILE BOOL WINAPI DECLSPEC_HOTPATCH FileTimeToSystemTime( const FILETIME *ft, SYSTEMTIME *systime ) { TIME_FIELDS tf; + const LARGE_INTEGER *li = (const LARGE_INTEGER *)ft; - RtlTimeToTimeFields( (const LARGE_INTEGER *)ft, &tf ); + if (li->QuadPart < 0) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + RtlTimeToTimeFields( li, &tf ); systime->wYear = tf.Year; systime->wMonth = tf.Month; systime->wDay = tf.Day; -- 2.27.0