From ca2993c4e46ea04cb3b008dbe948f4570cdf185d Mon Sep 17 00:00:00 2001
From: Andrey Borodin <amborodin@acm.org>
Date: Fri, 12 Feb 2021 10:08:50 +0500
Subject: [PATCH 1/2] Prevent pageinspect from using maxoffset on GiST deleted
 pages

GistPageSetDeleted() sets pd_lower to indicate that page is occupied with
GISTDeletedPageContents. This value can be wrongfully interpreted as non-zero
maxoffset on deleted GiST page by pageinspect functions.
---
 contrib/pageinspect/gistfuncs.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/contrib/pageinspect/gistfuncs.c b/contrib/pageinspect/gistfuncs.c
index d5da1ea839..6e7f8c8e5a 100644
--- a/contrib/pageinspect/gistfuncs.c
+++ b/contrib/pageinspect/gistfuncs.c
@@ -103,6 +103,7 @@ gist_page_items_bytea(PG_FUNCTION_ARGS)
 	MemoryContext oldcontext;
 	Page		page;
 	OffsetNumber offset;
+	OffsetNumber maxoff = InvalidOffsetNumber;
 
 	if (!superuser())
 		ereport(ERROR,
@@ -135,11 +136,14 @@ gist_page_items_bytea(PG_FUNCTION_ARGS)
 
 	page = get_page_from_raw(raw_page);
 
+	/* Maximum offset number may be incorrect on deleted page */
 	if (GistPageIsDeleted(page))
 		elog(NOTICE, "page is deleted");
+	else
+		maxoff = PageGetMaxOffsetNumber(page);
 
 	for (offset = FirstOffsetNumber;
-		 offset <= PageGetMaxOffsetNumber(page);
+		 offset <= maxoff;
 		 offset++)
 	{
 		Datum		values[4];
@@ -187,6 +191,7 @@ gist_page_items(PG_FUNCTION_ARGS)
 	MemoryContext oldcontext;
 	Page		page;
 	OffsetNumber offset;
+	OffsetNumber maxoff = InvalidOffsetNumber;
 
 	if (!superuser())
 		ereport(ERROR,
@@ -222,11 +227,14 @@ gist_page_items(PG_FUNCTION_ARGS)
 
 	page = get_page_from_raw(raw_page);
 
+	/* Maximum offset number may be incorrect on deleted page */
 	if (GistPageIsDeleted(page))
 		elog(NOTICE, "page is deleted");
+	else
+		maxoff = PageGetMaxOffsetNumber(page);
 
 	for (offset = FirstOffsetNumber;
-		 offset <= PageGetMaxOffsetNumber(page);
+		 offset <= maxoff;
 		 offset++)
 	{
 		Datum		values[4];
-- 
2.24.3 (Apple Git-128)

