Fix RelationIdGetRelation calls that weren't bothering with error checks.
authorTom Lane
Sun, 8 Sep 2019 21:00:29 +0000 (17:00 -0400)
committerTom Lane
Sun, 8 Sep 2019 21:00:54 +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 d00f4f23e5f61d9fbcf1e2a15b8a4cb07a1ebdd6..f8914f778c0f59dcc77d3e29d55cbb7c29f434e2 100644 (file)
@@ -7976,6 +7976,10 @@ 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);
+
    idx_desc = RelationGetDescr(idx_rel);
 
    /* deform tuple, so we have fast access to columns */
index 392757001f9b634d3888301ff20676025a31d2d9..be441c7c7d6e5155e485872fbef28ec9c6b28f51 100644 (file)
@@ -1561,7 +1561,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,
@@ -2969,6 +2969,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? */