From 1824f9e56284ba8ca3ccd16e476250ec08e4846f Mon Sep 17 00:00:00 2001
From: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Date: Thu, 8 Oct 2026 06:33:42 +0000
Subject: [PATCH v1] xlogreader: Treat any negative segment descriptor as
 closed

The segment_close() callback is required to set ws_file to a negative value after
closing a WAL segment. XLogReaderFree() only treated -1 as closed, so it could
call segment_close() again if another negative sentinel was used.

Test for a nonnegative descriptor instead, matching the documented callback
convention.

Author: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Reviewed-by:
Discussion: https://postgr.es/m/asNr203eue0R4zpZ@bdtpg
---
 src/backend/access/transam/xlogreader.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
 100.0% src/backend/access/transam/

diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c
index cc61f830982..1db5ca48c3f 100644
--- a/src/backend/access/transam/xlogreader.c
+++ b/src/backend/access/transam/xlogreader.c
@@ -175,7 +175,7 @@ XLogReaderFree(XLogReaderState *state)
 											 &state->reset_cb);
 #endif
 
-	if (state->seg.ws_file != -1)
+	if (state->seg.ws_file >= 0)
 		state->routine.segment_close(state);
 
 	if (state->decode_buffer && state->free_decode_buffer)
-- 
2.34.1

