From eb72e5e921388fcdacc4d54f89c8d308180acc74 Mon Sep 17 00:00:00 2001 From: Hayato Kuroda Date: Wed, 19 Feb 2025 11:37:26 +0900 Subject: [PATCH] Prohibit slot operations while in the single user mode --- src/backend/replication/slotfuncs.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c index 8be4b8c65b..cbfadfa428 100644 --- a/src/backend/replication/slotfuncs.c +++ b/src/backend/replication/slotfuncs.c @@ -17,6 +17,7 @@ #include "access/xlogrecovery.h" #include "access/xlogutils.h" #include "funcapi.h" +#include "miscadmin.h" #include "replication/logical.h" #include "replication/slot.h" #include "replication/slotsync.h" @@ -73,6 +74,10 @@ pg_create_physical_replication_slot(PG_FUNCTION_ARGS) HeapTuple tuple; Datum result; + if (!IsUnderPostmaster) + elog(ERROR, + "slot operation is prohibited in the single user mode"); + if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) elog(ERROR, "return type must be a row type"); @@ -179,6 +184,11 @@ pg_create_logical_replication_slot(PG_FUNCTION_ARGS) Datum values[2]; bool nulls[2]; + if (!IsUnderPostmaster) + elog(ERROR, + "slot operation is prohibited in the single user mode"); + + if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) elog(ERROR, "return type must be a row type"); @@ -515,6 +525,10 @@ pg_replication_slot_advance(PG_FUNCTION_ARGS) Assert(!MyReplicationSlot); + if (!IsUnderPostmaster) + elog(ERROR, + "slot operation is prohibited in the single user mode"); + CheckSlotPermissions(); if (XLogRecPtrIsInvalid(moveto)) @@ -612,6 +626,11 @@ copy_replication_slot(FunctionCallInfo fcinfo, bool logical_slot) TupleDesc tupdesc; HeapTuple tuple; + if (!IsUnderPostmaster) + elog(ERROR, + "slot operation is prohibited in the single user mode"); + + if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) elog(ERROR, "return type must be a row type"); @@ -866,6 +885,10 @@ pg_sync_replication_slots(PG_FUNCTION_ARGS) char *err; StringInfoData app_name; + if (!IsUnderPostmaster) + elog(ERROR, + "slot operation is prohibited in the single user mode"); + CheckSlotPermissions(); if (!RecoveryInProgress()) -- 2.43.5