]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix off-by-one Asserts in FreePageBtreeInsertInternal/Leaf.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 23 Oct 2025 16:32:06 +0000 (12:32 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 23 Oct 2025 16:32:46 +0000 (12:32 -0400)
These two functions expect there to be room to insert another item
in the FreePageBtree's array, but their assertions were too weak
to guarantee that.  This has little practical effect granting that
the callers are not buggy, but it seems to be misleading late-model
Coverity into complaining about possible array overrun.

Author: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/799984.1761150474@sss.pgh.pa.us
Backpatch-through: 13

src/backend/utils/mmgr/freepage.c

index 77f16f9b21bfed1945a2646325dd6608938cb745..8c8951c94c3dd050ec0b603879129f8f56151e01 100644 (file)
@@ -894,14 +894,14 @@ FreePageBtreeGetRecycled(FreePageManager *fpm)
 }
 
 /*
- * Insert an item into an internal page.
+ * Insert an item into an internal page (there must be room).
  */
 static void
 FreePageBtreeInsertInternal(char *base, FreePageBtree *btp, Size index,
                                                        Size first_page, FreePageBtree *child)
 {
        Assert(btp->hdr.magic == FREE_PAGE_INTERNAL_MAGIC);
-       Assert(btp->hdr.nused <= FPM_ITEMS_PER_INTERNAL_PAGE);
+       Assert(btp->hdr.nused < FPM_ITEMS_PER_INTERNAL_PAGE);
        Assert(index <= btp->hdr.nused);
        memmove(&btp->u.internal_key[index + 1], &btp->u.internal_key[index],
                        sizeof(FreePageBtreeInternalKey) * (btp->hdr.nused - index));
@@ -911,14 +911,14 @@ FreePageBtreeInsertInternal(char *base, FreePageBtree *btp, Size index,
 }
 
 /*
- * Insert an item into a leaf page.
+ * Insert an item into a leaf page (there must be room).
  */
 static void
 FreePageBtreeInsertLeaf(FreePageBtree *btp, Size index, Size first_page,
                                                Size npages)
 {
        Assert(btp->hdr.magic == FREE_PAGE_LEAF_MAGIC);
-       Assert(btp->hdr.nused <= FPM_ITEMS_PER_LEAF_PAGE);
+       Assert(btp->hdr.nused < FPM_ITEMS_PER_LEAF_PAGE);
        Assert(index <= btp->hdr.nused);
        memmove(&btp->u.leaf_key[index + 1], &btp->u.leaf_key[index],
                        sizeof(FreePageBtreeLeafKey) * (btp->hdr.nused - index));