From a5a0ac703666a2e1547bec435d027a4d52169725 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Thu, 23 Jan 2025 16:29:35 +0100 Subject: [PATCH] Fix NULL arithmetic in System V shared memory emulation For the first child process execution, `TWG(shm)` is `NULL`; we need to catch that to avoid undefined behavior. --- TSRM/tsrm_win32.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c index da0ca7f005f58..4550715d5ce71 100644 --- a/TSRM/tsrm_win32.c +++ b/TSRM/tsrm_win32.c @@ -402,19 +402,21 @@ static shm_pair *shm_get(key_t key, void *addr) shm_pair *ptr; shm_pair *newptr; - for (ptr = TWG(shm); ptr < (TWG(shm) + TWG(shm_size)); ptr++) { - if (!ptr->descriptor) { - continue; - } - if (!addr && ptr->descriptor->shm_perm.key == key) { - break; - } else if (ptr->addr == addr) { - break; + if (TWG(shm) != NULL) { + for (ptr = TWG(shm); ptr < (TWG(shm) + TWG(shm_size)); ptr++) { + if (!ptr->descriptor) { + continue; + } + if (!addr && ptr->descriptor->shm_perm.key == key) { + break; + } else if (ptr->addr == addr) { + break; + } } - } - if (ptr < (TWG(shm) + TWG(shm_size))) { - return ptr; + if (ptr < (TWG(shm) + TWG(shm_size))) { + return ptr; + } } newptr = (shm_pair*)realloc((void*)TWG(shm), (TWG(shm_size)+1)*sizeof(shm_pair));