]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Fix a Y2038 bug by replacing `Int32x32To64` with regular multiplication (#2471)
authorSilent <CookiePLMonster@users.noreply.github.com>
Wed, 1 Jan 2025 16:31:35 +0000 (17:31 +0100)
committerGitHub <noreply@github.com>
Wed, 1 Jan 2025 16:31:35 +0000 (08:31 -0800)
`Int32x32To64` macro internally truncates the arguments to int32, while
`time_t` is 64-bit on most/all modern platforms. Therefore, usage of
this macro creates a Year 2038 bug.

I detailed this issue a while ago in a writeup, and spotted the same
issue in this repository when updating the list of affected
repositories:
<https://cookieplmonster.github.io/2022/02/17/year-2038-problem/>

A few more notes:
1. I changed all uses of `Int32x32To64` en masse, even though at least
one of them was technically OK and used with int32 parameters only. IMO
better safe than sorry.
2. This is untested, but it's a small enough change that I hope the CI
success is a good enough indicator.

cpio/cpio_windows.c
libarchive/archive_write_disk_windows.c
test_utils/test_main.c

index a619c6889bd98bf1d1b596a8270c175052a9954d..267b379753d90a64b65a1ccb192ebc3a2a1dd101 100644 (file)
@@ -171,7 +171,7 @@ cpio_CreateFile(const char *path, DWORD dwDesiredAccess, DWORD dwShareMode,
        return (handle);
 }
 
-#define WINTIME(sec, usec)     ((Int32x32To64(sec, 10000000) + EPOC_TIME) + (usec * 10))
+#define WINTIME(sec, usec)     (((sec * 10000000LL) + EPOC_TIME) + (usec * 10))
 static int
 __hutimes(HANDLE handle, const struct __timeval *times)
 {
index 3cdfaaec92bc56d450096e3e74de8f3b13612a8b..472fd7310dbf878e62940aa7c834e2f2c6d6c4bb 100644 (file)
@@ -2606,7 +2606,7 @@ set_times(struct archive_write_disk *a,
     time_t ctime_sec, long ctime_nanos)
 {
 #define EPOC_TIME ARCHIVE_LITERAL_ULL(116444736000000000)
-#define WINTIME(sec, nsec) ((Int32x32To64(sec, 10000000) + EPOC_TIME)\
+#define WINTIME(sec, nsec) (((sec * 10000000LL) + EPOC_TIME)\
         + ((nsec)/100))
 
        HANDLE hw = 0;
index 1a0c2e0eb18598808f0018925145efc47211ec7c..d2000432645e7e3199a5a30d393ee4c78548f324 100644 (file)
@@ -2108,7 +2108,7 @@ assertion_utimes(const char *file, int line, const char *pathname,
        int r;
 
 #if defined(_WIN32) && !defined(__CYGWIN__)
-#define WINTIME(sec, nsec) ((Int32x32To64(sec, 10000000) + EPOC_TIME)\
+#define WINTIME(sec, nsec) (((sec * 10000000LL) + EPOC_TIME)\
         + (((nsec)/1000)*10))
        HANDLE h;
        ULARGE_INTEGER wintm;