From 5ec8b01c30e7ea34bb42592ad9d34d4b02ea593d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 21 Apr 2025 11:34:36 -0400 Subject: [PATCH] MemoryContextCreate: assert parent is valid and different from node. The case of "node == parent" might seem impossible, since we just allocated the new node. But it's possible if parent is a dangling reference to a recently-deleted context. In fact, given aset.c's habit of recycling contexts, it's actually rather likely if that's so. If we'd had this assertion before, it would have simplified debugging a recently-identified walsender issue. Reported-by: Anthonin Bonnefoy Author: Tom Lane Discussion: https://postgr.es/m/CAO6_XqoJA7-_G6t7Uqe5nWF3nj+QBGn4F6Ptp=rUGDr0zo+KvA@mail.gmail.com --- src/backend/utils/mmgr/mcxt.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/backend/utils/mmgr/mcxt.c b/src/backend/utils/mmgr/mcxt.c index 68f1cbcf9c2..506f2902986 100644 --- a/src/backend/utils/mmgr/mcxt.c +++ b/src/backend/utils/mmgr/mcxt.c @@ -1181,6 +1181,10 @@ MemoryContextCreate(MemoryContext node, /* Creating new memory contexts is not allowed in a critical section */ Assert(CritSectionCount == 0); + /* Validate parent, to help prevent crazy context linkages */ + Assert(parent == NULL || MemoryContextIsValid(parent)); + Assert(node != parent); + /* Initialize all standard fields of memory context header */ node->type = tag; node->isReset = true;