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.
This commit is contained in:
Christoph M. Becker 2019-11-25 14:05:15 +01:00
parent b48f2625b5
commit 18172303f4
2 changed files with 10 additions and 1 deletions

3
NEWS
View file

@ -39,6 +39,9 @@ PHP NEWS
. Fixed bug #78982 (pdo_pgsql returns dead persistent connection). (SATŌ . Fixed bug #78982 (pdo_pgsql returns dead persistent connection). (SATŌ
Kentarō) Kentarō)
- Shmop:
. Fixed bug #78538 (shmop memory leak). (cmb)
18 Dec 2019, PHP 7.3.13 18 Dec 2019, PHP 7.3.13
- Bcmath: - Bcmath:

View file

@ -721,6 +721,7 @@ TSRM_API void *shmat(int key, const void *shmaddr, int flags)
TSRM_API int shmdt(const void *shmaddr) TSRM_API int shmdt(const void *shmaddr)
{/*{{{*/ {/*{{{*/
shm_pair *shm = shm_get(0, (void*)shmaddr); shm_pair *shm = shm_get(0, (void*)shmaddr);
int ret;
if (!shm->segment) { if (!shm->segment) {
return -1; return -1;
@ -730,7 +731,12 @@ TSRM_API int shmdt(const void *shmaddr)
shm->descriptor->shm_lpid = getpid(); shm->descriptor->shm_lpid = getpid();
shm->descriptor->shm_nattch--; 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) TSRM_API int shmctl(int key, int cmd, struct shmid_ds *buf)