From ca2993c4e46ea04cb3b008dbe948f4570cdf185d Mon Sep 17 00:00:00 2001 From: Andrey Borodin 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)