From f5eea6d2f1e8a8ed81cf177cef320e041bbff90b Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 22 Aug 2022 16:51:52 +0200 Subject: [PATCH 2/5] Change pfree to accept NULL argument --- src/backend/utils/mmgr/README | 6 +++++- src/backend/utils/mmgr/mcxt.c | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/mmgr/README b/src/backend/utils/mmgr/README index 221b4bd343..e552c6ada6 100644 --- a/src/backend/utils/mmgr/README +++ b/src/backend/utils/mmgr/README @@ -66,7 +66,11 @@ pointer, but a valid chunk of which no bytes may be used. However, the chunk might later be repalloc'd larger; it can also be pfree'd without error. Similarly, repalloc allows realloc'ing to zero size. -* pfree and repalloc do not accept a NULL pointer. This is intentional. +* repalloc does not accept a NULL pointer. This is intentional. (As +mentioned above, repalloc does not depend on the current memory +context. But then it needs to know which memory context to do the +allocation in. So the first allocation has to be done outside +repalloc.) The Current Memory Context diff --git a/src/backend/utils/mmgr/mcxt.c b/src/backend/utils/mmgr/mcxt.c index e12be1b9bd..d85e961c1e 100644 --- a/src/backend/utils/mmgr/mcxt.c +++ b/src/backend/utils/mmgr/mcxt.c @@ -1174,7 +1174,12 @@ palloc_extended(Size size, int flags) void pfree(void *pointer) { - MemoryContext context = GetMemoryChunkContext(pointer); + MemoryContext context; + + if (!pointer) + return; + + context = GetMemoryChunkContext(pointer); context->methods->free_p(context, pointer); VALGRIND_MEMPOOL_FREE(context, pointer); -- 2.37.1