From: Thomas Munro Date: Sat, 1 Feb 2020 01:29:13 +0000 (+1300) Subject: Fix memory leak on DSM slot exhaustion. X-Git-Tag: REL9_4_26~7 X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=95936c795b9f086c2b413b5150d2993ac30354fa;p=postgresql.git Fix memory leak on DSM slot exhaustion. If we attempt to create a DSM segment when no slots are available, we should return the memory to the operating system. Previously we did that if the DSM_CREATE_NULL_IF_MAXSEGMENTS flag was passed in, but we didn't do it if an error was raised. Repair. Back-patch to 9.4, where DSM segments arrived. Author: Thomas Munro Reviewed-by: Robert Haas Reported-by: Julian Backes Discussion: https://postgr.es/m/CA%2BhUKGKAAoEw-R4om0d2YM4eqT1eGEi6%3DQot-3ceDR-SLiWVDw%40mail.gmail.com --- diff --git a/src/backend/storage/ipc/dsm.c b/src/backend/storage/ipc/dsm.c index 0e5a0c399f3..ed0b1f15f7c 100644 --- a/src/backend/storage/ipc/dsm.c +++ b/src/backend/storage/ipc/dsm.c @@ -496,9 +496,18 @@ dsm_create(Size size) /* Verify that we can support an additional mapping. */ if (nitems >= dsm_control->maxitems) + { + LWLockRelease(DynamicSharedMemoryControlLock); + dsm_impl_op(DSM_OP_DESTROY, seg->handle, 0, &seg->impl_private, + &seg->mapped_address, &seg->mapped_size, WARNING); + if (seg->resowner != NULL) + ResourceOwnerForgetDSM(seg->resowner, seg); + dlist_delete(&seg->node); + pfree(seg); ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_RESOURCES), errmsg("too many dynamic shared memory segments"))); + } /* Enter the handle into a new array slot. */ dsm_control->item[nitems].handle = seg->handle;