summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS3
-rw-r--r--TSRM/tsrm_win32.c8
2 files changed, 10 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 4f072544c1..87af6d1e0b 100644
--- a/NEWS
+++ b/NEWS
@@ -59,6 +59,9 @@ PHP NEWS
- Session:
. Fixed bug #79031 (Session unserialization problem). (Nikita)
+- Shmop:
+ . Fixed bug #78538 (shmop memory leak). (cmb)
+
- Sqlite3:
. Fixed bug #79056 (sqlite does not respect PKG_CONFIG_PATH during
compilation). (Nikita)
diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c
index e16c946131..40331f122c 100644
--- a/TSRM/tsrm_win32.c
+++ b/TSRM/tsrm_win32.c
@@ -720,6 +720,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;
@@ -729,7 +730,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 <= 0) {
+ ret = UnmapViewOfFile(shm->descriptor) ? 0 : -1;
+ shm->descriptor = NULL;
+ }
+ return ret;
}/*}}}*/
TSRM_API int shmctl(int key, int cmd, struct shmid_ds *buf)