Suppress spurious Coverity warning in prune freeze logic
authorMelanie Plageman <[email protected]>
Thu, 4 Dec 2025 23:55:02 +0000 (18:55 -0500)
committerMelanie Plageman <[email protected]>
Thu, 4 Dec 2025 23:55:02 +0000 (18:55 -0500)
Adjust the prune_freeze_setup() parameter types of new_relfrozen_xid and
new_relmin_mxid to prevent misleading Coverity analysis.
heap_page_prune_and_freeze() compared these values against NULL when
passing them to prune_freeze_setup(), causing Coverity to assume they
could be NULL and flag a possible null-pointer dereference later, even
though it occurs inside a directly related conditional.

Reported-by: Coverity
Author: Melanie Plageman <[email protected]>

src/backend/access/heap/pruneheap.c

index 5af84b4c875dd78ec747ea066f44ca19d022fe3b..ca44225a10edde7986b0fd674f25f33f9eab3d3e 100644 (file)
@@ -158,8 +158,8 @@ typedef struct
 
 /* Local functions */
 static void prune_freeze_setup(PruneFreezeParams *params,
-                                                          TransactionId new_relfrozen_xid,
-                                                          MultiXactId new_relmin_mxid,
+                                                          TransactionId *new_relfrozen_xid,
+                                                          MultiXactId *new_relmin_mxid,
                                                           const PruneFreezeResult *presult,
                                                           PruneState *prstate);
 static void prune_freeze_plan(Oid reloid, Buffer buffer,
@@ -325,8 +325,8 @@ heap_page_prune_opt(Relation relation, Buffer buffer)
  */
 static void
 prune_freeze_setup(PruneFreezeParams *params,
-                                  TransactionId new_relfrozen_xid,
-                                  MultiXactId new_relmin_mxid,
+                                  TransactionId *new_relfrozen_xid,
+                                  MultiXactId *new_relmin_mxid,
                                   const PruneFreezeResult *presult,
                                   PruneState *prstate)
 {
@@ -362,15 +362,15 @@ prune_freeze_setup(PruneFreezeParams *params,
        prstate->pagefrz.freeze_required = false;
        if (prstate->attempt_freeze)
        {
-               prstate->pagefrz.FreezePageRelfrozenXid = new_relfrozen_xid;
-               prstate->pagefrz.NoFreezePageRelfrozenXid = new_relfrozen_xid;
-               prstate->pagefrz.FreezePageRelminMxid = new_relmin_mxid;
-               prstate->pagefrz.NoFreezePageRelminMxid = new_relmin_mxid;
+               Assert(new_relfrozen_xid && new_relmin_mxid);
+               prstate->pagefrz.FreezePageRelfrozenXid = *new_relfrozen_xid;
+               prstate->pagefrz.NoFreezePageRelfrozenXid = *new_relfrozen_xid;
+               prstate->pagefrz.FreezePageRelminMxid = *new_relmin_mxid;
+               prstate->pagefrz.NoFreezePageRelminMxid = *new_relmin_mxid;
        }
        else
        {
-               Assert(new_relfrozen_xid == InvalidTransactionId &&
-                          new_relmin_mxid == InvalidMultiXactId);
+               Assert(!new_relfrozen_xid && !new_relmin_mxid);
                prstate->pagefrz.FreezePageRelminMxid = InvalidMultiXactId;
                prstate->pagefrz.NoFreezePageRelminMxid = InvalidMultiXactId;
                prstate->pagefrz.FreezePageRelfrozenXid = InvalidTransactionId;
@@ -823,12 +823,8 @@ heap_page_prune_and_freeze(PruneFreezeParams *params,
 
        /* Initialize prstate */
        prune_freeze_setup(params,
-                                          new_relfrozen_xid ?
-                                          *new_relfrozen_xid : InvalidTransactionId,
-                                          new_relmin_mxid ?
-                                          *new_relmin_mxid : InvalidMultiXactId,
-                                          presult,
-                                          &prstate);
+                                          new_relfrozen_xid, new_relmin_mxid,
+                                          presult, &prstate);
 
        /*
         * Examine all line pointers and tuple visibility information to determine