Re: Assert in pageinspect with NULL pages - Mailing list pgsql-hackers

From Justin Pryzby
Subject Re: Assert in pageinspect with NULL pages
Date
Msg-id 20220218030020.GA1137@telsasoft.com
Whole thread Raw
In response to Assert in pageinspect with NULL pages  (Daria Lepikhova <d.lepikhova@postgrespro.ru>)
Responses Re: Assert in pageinspect with NULL pages
Re: Assert in pageinspect with NULL pages
List pgsql-hackers
BRIN can also crash if passed a non-brin index.

I've been sitting on this one for awhile.  Feel free to include it in your
patchset.

commit 08010a6037fc4e24a9ba05e5386e766f4310d35e
Author: Justin Pryzby <pryzbyj@telsasoft.com>
Date:   Tue Jan 19 00:25:15 2021 -0600

    pageinspect: brin_page_items(): check that given relation is not only an index, but a brin one

diff --git a/contrib/pageinspect/brinfuncs.c b/contrib/pageinspect/brinfuncs.c
index f1e64a39ef2..3de6dd943ef 100644
--- a/contrib/pageinspect/brinfuncs.c
+++ b/contrib/pageinspect/brinfuncs.c
@@ -16,6 +16,7 @@
 #include "access/brin_tuple.h"
 #include "access/htup_details.h"
 #include "catalog/index.h"
+#include "catalog/pg_am.h"
 #include "catalog/pg_type.h"
 #include "funcapi.h"
 #include "lib/stringinfo.h"
@@ -59,7 +60,7 @@ brin_page_type(PG_FUNCTION_ARGS)
     if (raw_page_size != BLCKSZ)
         ereport(ERROR,
                 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-                 errmsg("input page too small"),
+                 errmsg("input page wrong size"),
                  errdetail("Expected size %d, got %d",
                            BLCKSZ, raw_page_size)));
 
@@ -97,7 +98,7 @@ verify_brin_page(bytea *raw_page, uint16 type, const char *strtype)
     if (raw_page_size != BLCKSZ)
         ereport(ERROR,
                 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-                 errmsg("input page too small"),
+                 errmsg("input page wrong size"),
                  errdetail("Expected size %d, got %d",
                            BLCKSZ, raw_page_size)));
 
@@ -169,7 +170,14 @@ brin_page_items(PG_FUNCTION_ARGS)
     MemoryContextSwitchTo(oldcontext);
 
     indexRel = index_open(indexRelid, AccessShareLock);
-    bdesc = brin_build_desc(indexRel);
+
+    /* Must be a BRIN index */
+    if (indexRel->rd_rel->relkind != RELKIND_INDEX ||
+            indexRel->rd_rel->relam != BRIN_AM_OID)
+        ereport(ERROR,
+                (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                 errmsg("\"%s\" is not a BRIN index",
+                     RelationGetRelationName(indexRel))));
 
     /* minimally verify the page we got */
     page = verify_brin_page(raw_page, BRIN_PAGETYPE_REGULAR, "regular");
@@ -178,6 +186,7 @@ brin_page_items(PG_FUNCTION_ARGS)
      * Initialize output functions for all indexed datatypes; simplifies
      * calling them later.
      */
+    bdesc = brin_build_desc(indexRel);
     columns = palloc(sizeof(brin_column_state *) * RelationGetDescr(indexRel)->natts);
     for (attno = 1; attno <= bdesc->bd_tupdesc->natts; attno++)
     {



pgsql-hackers by date:

Previous
From: Ajin Cherian
Date:
Subject: Re: Logical replication timeout problem
Next
From: Joseph Koshakow
Date:
Subject: Fix formatting of Interval output