From 3d79d37e475c3704cd5e9a8b35e671903a516213 Mon Sep 17 00:00:00 2001
From: "Christoph M. Becker"
Date: Mon, 25 Nov 2019 14:05:15 +0100
Subject: [PATCH] Fix #78538: shmop memory leak
If the descriptor's refcount drops to zero, we have to unmap the
respective file view, to avoid leaking memory.
---
TSRM/tsrm_win32.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c
index 06ca965d641b2..cb2520e294bc9 100644
--- a/TSRM/tsrm_win32.c
+++ b/TSRM/tsrm_win32.c
@@ -721,6 +721,7 @@ TSRM_API void *shmat(int key, const void *shmaddr, int flags)
TSRM_API int shmdt(const void *shmaddr)
{/*{{{*/
shm_pair *shm = shm_get(0, (void*)shmaddr);
+ int ret;
if (!shm->segment) {
return -1;
@@ -730,7 +731,12 @@ TSRM_API int shmdt(const void *shmaddr)
shm->descriptor->shm_lpid = getpid();
shm->descriptor->shm_nattch--;
- return UnmapViewOfFile(shm->addr) ? 0 : -1;
+ ret = UnmapViewOfFile(shm->addr) ? 0 : -1;
+ if (!ret && shm->descriptor->shm_nattch descriptor) ? 0 : -1;
+ shm->descriptor = NULL;
+ }
+ return ret;
}/*}}}*/
TSRM_API int shmctl(int key, int cmd, struct shmid_ds *buf)