From 2d94ee5f20b1d5c1933dcec099f8cbbc5951a2fb Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Tue, 15 Nov 2022 15:37:32 +0100 Subject: [PATCH] Avoid undefined behavior in Windows ftok(3) emulation `.nFileIndexHigh` is a unsigned 32bit number. Casting that to `__int64` and shifting left by 32bits triggers undefined behavior if the most significant bit of `.nFileIndexHigh` is set. We could avoid that by casting to `(__uint64)`, but in that case the whole clause doesn't have an effect anymore, so we drop it altogether. Closes GH-9958. --- NEWS | 1 + win32/ftok.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index bde353a2488..976f031effe 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,7 @@ PHP NEWS . Fixed bug GH-9918 (License information for xxHash is not included in README.REDIST.BINS file). (Akama Hitoshi) . Fixed bug GH-9650 (Can't initialize heap: [0x000001e7]). (Michael Voříšek) + . Fixed potentially undefined behavior in Windows ftok(3) emulation. (cmb) - MBString: . Fixed bug GH-9535 (The behavior of mb_strcut in mbstring has been changed in diff --git a/win32/ftok.c b/win32/ftok.c index 3a545375fa0..76e47ec48e1 100644 --- a/win32/ftok.c +++ b/win32/ftok.c @@ -51,7 +51,7 @@ ftok(const char *pathname, int proj_id) return (key_t)-1; } - ret = (key_t) ((proj_id & 0xff) << 24 | (st.st_dev & 0xff) << 16 | ((bhfi.nFileIndexLow | (__int64)bhfi.nFileIndexHigh << 32) & 0xffff)); + ret = (key_t) ((proj_id & 0xff) << 24 | (st.st_dev & 0xff) << 16 | (bhfi.nFileIndexLow & 0xffff)); CloseHandle(fh); PHP_WIN32_IOUTIL_CLEANUP_W()