Ensure that slots are zeroed before use
authorDaniel Gustafsson <dgustafsson@postgresql.org>
Tue, 26 Oct 2021 08:40:08 +0000 (10:40 +0200)
committerDaniel Gustafsson <dgustafsson@postgresql.org>
Tue, 26 Oct 2021 08:40:08 +0000 (10:40 +0200)
The previous coding relied on the memory for the slots being zeroed
elsewhere, which while it was true in this case is not an contract
which is guaranteed to hold.  Explicitly clear the tts_isnull array
to ensure that the slots are filled from a known state.

Backpatch to v14 where the catalog multi-inserts were introduced.

Reviewed-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://postgr.es/m/CAJ7c6TP0AowkUgNL6zcAK-s5HYsVHVBRWfu69FRubPpfwZGM9A@mail.gmail.com
Backpatch-through: 14

src/backend/catalog/heap.c
src/backend/catalog/pg_shdepend.c

index 5898203972b2250d5f268febf560e6461b073246..81cc39fb70eb177f05657ec774a6e0824529a0cb 100644 (file)
@@ -764,6 +764,9 @@ InsertPgAttributeTuples(Relation pg_attribute_rel,
 
        ExecClearTuple(slot[slotCount]);
 
+       memset(slot[slotCount]->tts_isnull, false,
+              slot[slotCount]->tts_tupleDescriptor->natts * sizeof(bool));
+
        if (new_rel_oid != InvalidOid)
            slot[slotCount]->tts_values[Anum_pg_attribute_attrelid - 1] = ObjectIdGetDatum(new_rel_oid);
        else
index 56a9a7662fd4f0279efbb5591405fc2d3536317c..8453d8fefd7251f86b21f58c16855f9927886189 100644 (file)
@@ -903,6 +903,9 @@ copyTemplateDependencies(Oid templateDbId, Oid newDbId)
 
        ExecClearTuple(slot[slot_stored_count]);
 
+       memset(slot[slot_stored_count]->tts_isnull, false,
+              slot[slot_stored_count]->tts_tupleDescriptor->natts * sizeof(bool));
+
        shdep = (Form_pg_shdepend) GETSTRUCT(tup);
 
        slot[slot_stored_count]->tts_values[Anum_pg_shdepend_dbid - 1] = ObjectIdGetDatum(newDbId);