From fb4f97e996de465bfd0304505c1d996aa42ed095 Mon Sep 17 00:00:00 2001 From: Marat Abrarov Date: Fri, 27 Feb 2026 14:00:46 +0300 Subject: [PATCH] file_win32: fix UB when preparing args for CreateFileMappingA Signed-off-by: Marat Abrarov --- src/cio_file_win32.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/cio_file_win32.c b/src/cio_file_win32.c index 43b7a24..b84094f 100644 --- a/src/cio_file_win32.c +++ b/src/cio_file_win32.c @@ -18,6 +18,7 @@ */ #include +#include #include #include @@ -76,6 +77,8 @@ int cio_file_native_map(struct cio_file *cf, size_t map_size) DWORD desired_access; size_t file_size; size_t actual_map_size; + DWORD actual_map_size_high; + DWORD actual_map_size_low; int ret; if (cf == NULL) { @@ -131,10 +134,18 @@ int cio_file_native_map(struct cio_file *cf, size_t map_size) /* CreateFileMappingA requires size as two DWORDs (high and low) */ /* Use actual_map_size to ensure consistency */ +#if SIZE_MAX > MAXDWORD + actual_map_size_high = (DWORD)((actual_map_size >> (sizeof(DWORD) * CHAR_BIT)) + & 0xFFFFFFFFUL); + actual_map_size_low = (DWORD)(actual_map_size & 0xFFFFFFFFUL); +#else + actual_map_size_high = 0; + actual_map_size_low = (DWORD)actual_map_size; +#endif cf->backing_mapping = CreateFileMappingA(cf->backing_file, NULL, desired_protection, - (DWORD)(actual_map_size >> 32), - (DWORD)(actual_map_size & 0xFFFFFFFFUL), + actual_map_size_high, + actual_map_size_low, NULL); if (cf->backing_mapping == NULL) {