]> granicus.if.org Git - postgresql/commitdiff
Fix RelationIdGetRelation calls that weren't bothering with error checks.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 8 Sep 2019 21:00:29 +0000 (17:00 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 8 Sep 2019 21:00:53 +0000 (17:00 -0400)
Some of these are quite old, but that doesn't make them not bugs.
We'd rather report a failure via elog than SIGSEGV.

While at it, uniformly spell the error check as !RelationIsValid(rel)
rather than a bare rel == NULL test.  The machine code is the same
but it seems better to be consistent.

Coverity complained about this today, not sure why, because the
mistake is in fact old.

src/backend/access/heap/heapam.c
src/backend/replication/logical/reorderbuffer.c

index 28f00158a60c7511bec73217ca470214b174981f..8ebf86f68780efdfd47b1461c309aae013a66c36 100644 (file)
@@ -8128,6 +8128,9 @@ ExtractReplicaIdentity(Relation relation, HeapTuple tp, bool key_changed, bool *
 
        idx_rel = RelationIdGetRelation(replidindex);
 
+       if (!RelationIsValid(idx_rel))
+               elog(ERROR, "could not open relation with OID %u", replidindex);
+
        /* deform tuple, so we have fast access to columns */
        heap_deform_tuple(tp, desc, values, nulls);
 
index 7da681154cd508edd9f3dc0e20cc19811b574e60..9da04daca7e6268f6d3f1ff9f3b727d7168ac6ed 100644 (file)
@@ -1553,7 +1553,7 @@ ReorderBufferCommit(ReorderBuffer *rb, TransactionId xid,
 
                                        relation = RelationIdGetRelation(reloid);
 
-                                       if (relation == NULL)
+                                       if (!RelationIsValid(relation))
                                                elog(ERROR, "could not open relation with OID %u (for filenode \"%s\")",
                                                         reloid,
                                                         relpathperm(change->data.tp.relnode,
@@ -1671,7 +1671,7 @@ ReorderBufferCommit(ReorderBuffer *rb, TransactionId xid,
 
                                                        relation = RelationIdGetRelation(relid);
 
-                                                       if (relation == NULL)
+                                                       if (!RelationIsValid(relation))
                                                                elog(ERROR, "could not open relation with OID %u", relid);
 
                                                        if (!RelationIsLogicallyLogged(relation))
@@ -3031,6 +3031,10 @@ ReorderBufferToastReplace(ReorderBuffer *rb, ReorderBufferTXN *txn,
        desc = RelationGetDescr(relation);
 
        toast_rel = RelationIdGetRelation(relation->rd_rel->reltoastrelid);
+       if (!RelationIsValid(toast_rel))
+               elog(ERROR, "could not open relation with OID %u",
+                        relation->rd_rel->reltoastrelid);
+
        toast_desc = RelationGetDescr(toast_rel);
 
        /* should we allocate from stack instead? */