From 4e277b424a5312cdee468d92078a5359f3e7d4e7 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Thu, 24 Sep 2026 18:20:32 +0300 Subject: [PATCH] Fix ShmemInitStruct() reattachment in single-user mode ShmemInitStruct() only looked for an existing allocation when IsUnderPostmaster was true. Because of that, you could not reattach to an existing shmem area in a standalone backend. Usually, you only call ShmemInitStruct() for the same shmem area once in a process and hold onto the returned pointer, but there was no rule that you couldn't call it twice for the same area if you wanted to, and before commit 283e823f9d, it worked. To fix, check for an existing allocation regardless of process type, like the old implementation did. Author: Ayush Tiwari Reviewed-by: Ashutosh Bapat Discusssion: https://www.postgresql.org/message-id/CAJTYsWXREGXCnWdZJsXt8pT2UY_Y2GSx+HOUu2X3s8YDCLj0_A@mail.gmail.com Backpatch-through: 19 --- src/backend/storage/ipc/shmem.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c index 6037f469acd..0e827344462 100644 --- a/src/backend/storage/ipc/shmem.c +++ b/src/backend/storage/ipc/shmem.c @@ -1131,12 +1131,8 @@ ShmemInitStruct(const char *name, Size size, bool *foundPtr) LWLockAcquire(ShmemIndexLock, LW_EXCLUSIVE); - /* - * During postmaster startup, look up the existing entry if any. - */ - *foundPtr = false; - if (IsUnderPostmaster) - *foundPtr = AttachShmemIndexEntry(&request, true); + /* Look up the existing entry if any */ + *foundPtr = AttachShmemIndexEntry(&request, true); /* Initialize it if not found */ if (!*foundPtr)