Avoid memcpy() with a NULL source pointer and count == 0
authorAlvaro Herrera <[email protected]>
Tue, 1 Dec 2020 14:46:56 +0000 (11:46 -0300)
committerAlvaro Herrera <[email protected]>
Tue, 1 Dec 2020 14:46:56 +0000 (11:46 -0300)
When memcpy() is called on a pointer, the compiler is entitled to assume
that the pointer is not null, which can lead to optimizing nearby code
in potentially undesirable ways.  We still want such optimizations
(gcc's -fdelete-null-pointer-checks) in cases where they're valid.

Related: commit 13bba02271dc.

Backpatch to pg11, where this particular instance appeared.

Reported-by: Ranier Vilela <[email protected]>
Reported-by: Zhihong Yu <[email protected]>
Discussion: https://postgr.es/m/CAEudQApUndmQkr5fLrCKXQ7+ib44i7S+Kk93pyVThS85PnG3bQ@mail.gmail.com
Discussion: https://postgr.es/m/CALNJ-vSdhwSM5f4tnNn1cdLHvXMVe_S+V3nR5GwNrmCPNB2VtQ@mail.gmail.com

src/backend/commands/indexcmds.c

index ca24620fd0b184f14da5d87702286aa89a94801a..d35deb433aad40d769b58c0229389b8b468acb0c 100644 (file)
@@ -1163,15 +1163,17 @@ DefineIndex(Oid relationId,
 
    if (partitioned)
    {
+       PartitionDesc partdesc;
+
        /*
         * Unless caller specified to skip this step (via ONLY), process each
         * partition to make sure they all contain a corresponding index.
         *
         * If we're called internally (no stmt->relation), recurse always.
         */
-       if (!stmt->relation || stmt->relation->inh)
+       partdesc = RelationGetPartitionDesc(rel);
+       if ((!stmt->relation || stmt->relation->inh) && partdesc->nparts > 0)
        {
-           PartitionDesc partdesc = RelationGetPartitionDesc(rel);
            int         nparts = partdesc->nparts;
            Oid        *part_oids = palloc(sizeof(Oid) * nparts);
            bool        invalidate_parent = false;