diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2020-05-05 09:31:17 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2020-05-05 11:38:29 +0200 |
commit | f33cf52faf733f5a6441a533f83e9b1cf2018245 (patch) | |
tree | 1e95600ddf3429a25ca8a6b7feea59f9f255c557 /TSRM | |
parent | c40a494406aa3606be964b24d224ec4eb0c936e8 (diff) | |
download | php-git-f33cf52faf733f5a6441a533f83e9b1cf2018245.tar.gz |
Fix #79566: Private SHM is not private on Windows
We map the POSIX semantics of `IPC_PRIVATE` by creating unnamed file
mapping objects on Windows. While that is not particularly useful for
ext/shmop, which is the only bundled extension which uses `shmget()`,
it may be useful for external extensions.
Diffstat (limited to 'TSRM')
-rw-r--r-- | TSRM/tsrm_win32.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c index cb2520e294..6cedaa8360 100644 --- a/TSRM/tsrm_win32.c +++ b/TSRM/tsrm_win32.c @@ -616,14 +616,16 @@ TSRM_API int shmget(key_t key, size_t size, int flags) {/*{{{*/ shm_pair *shm; char shm_segment[26], shm_info[29]; - HANDLE shm_handle, info_handle; + HANDLE shm_handle = NULL, info_handle = NULL; BOOL created = FALSE; - snprintf(shm_segment, sizeof(shm_segment), "TSRM_SHM_SEGMENT:%d", key); - snprintf(shm_info, sizeof(shm_info), "TSRM_SHM_DESCRIPTOR:%d", key); + if (key != IPC_PRIVATE) { + snprintf(shm_segment, sizeof(shm_segment), "TSRM_SHM_SEGMENT:%d", key); + snprintf(shm_info, sizeof(shm_info), "TSRM_SHM_DESCRIPTOR:%d", key); - shm_handle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm_segment); - info_handle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm_info); + shm_handle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm_segment); + info_handle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm_info); + } if (!shm_handle && !info_handle) { if (flags & IPC_CREAT) { @@ -634,8 +636,8 @@ TSRM_API int shmget(key_t key, size_t size, int flags) DWORD high = 0; DWORD low = size; #endif - shm_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, high, low, shm_segment); - info_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(shm->descriptor), shm_info); + shm_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, high, low, key == IPC_PRIVATE ? NULL : shm_segment); + info_handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(shm->descriptor), key == IPC_PRIVATE ? NULL : shm_info); created = TRUE; } if (!shm_handle || !info_handle) { |