From: Peter Geoghegan Date: Thu, 6 Aug 2020 22:25:49 +0000 (-0700) Subject: amcheck: Sanitize metapage's allequalimage field. X-Git-Tag: REL_14_BETA1~1865 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c254d8d7b20bf629420b407a5451c3b32d1a7b0b;p=thirdparty%2Fpostgresql.git amcheck: Sanitize metapage's allequalimage field. This will be helpful if it ever proves necessary to revoke an opclass's support for deduplication. Backpatch: 13-, where nbtree deduplication was introduced. --- diff --git a/contrib/amcheck/verify_nbtree.c b/contrib/amcheck/verify_nbtree.c index c9f9e755dcc..384a8ac747e 100644 --- a/contrib/amcheck/verify_nbtree.c +++ b/contrib/amcheck/verify_nbtree.c @@ -305,8 +305,20 @@ bt_index_check_internal(Oid indrelid, bool parentcheck, bool heapallindexed, errmsg("index \"%s\" lacks a main relation fork", RelationGetRelationName(indrel)))); - /* Check index, possibly against table it is an index on */ + /* Extract metadata from metapage, and sanitize it in passing */ _bt_metaversion(indrel, &heapkeyspace, &allequalimage); + if (allequalimage && !heapkeyspace) + ereport(ERROR, + (errcode(ERRCODE_INDEX_CORRUPTED), + errmsg("index \"%s\" metapage has equalimage field set on unsupported nbtree version", + RelationGetRelationName(indrel)))); + if (allequalimage && !_bt_allequalimage(indrel, false)) + ereport(ERROR, + (errcode(ERRCODE_INDEX_CORRUPTED), + errmsg("index \"%s\" metapage incorrectly indicates that deduplication is safe", + RelationGetRelationName(indrel)))); + + /* Check index, possibly against table it is an index on */ bt_check_every_level(indrel, heaprel, heapkeyspace, parentcheck, heapallindexed, rootdescend); }