diff options
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | TSRM/tsrm_win32.c | 8 |
2 files changed, 10 insertions, 1 deletions
@@ -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) |