]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Avoid reference to nonexistent array element in ExecInitAgg().
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 2 Jan 2023 21:17:00 +0000 (16:17 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 2 Jan 2023 21:17:00 +0000 (16:17 -0500)
When considering an empty grouping set, we fetched
phasedata->eqfunctions[-1].  Because the eqfunctions array is
palloc'd, that would always be an aset pointer in released versions,
and thus the code accidentally failed to malfunction (since it would
do nothing unless it found a null pointer).  Nonetheless this seems
like trouble waiting to happen, so add a check for length == 0.

It's depressing that our valgrind testing did not catch this.
Maybe we should reconsider the choice to not mark that word NOACCESS?

Richard Guo

Discussion: https://postgr.es/m/CAMbWs4-vZuuPOZsKOYnSAaPYGKhmacxhki+vpOKk0O7rymccXQ@mail.gmail.com

src/backend/executor/nodeAgg.c

index 139b2bd5f9b007cdc44a961bd305c67d1d4ae168..d1ec337b30230fb81192e4fa3d592f10b6bf9594 100644 (file)
@@ -3486,6 +3486,11 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)
                                {
                                        int                     length = phasedata->gset_lengths[i];
 
+                                       /* nothing to do for empty grouping set */
+                                       if (length == 0)
+                                               continue;
+
+                                       /* if we already had one of this length, it'll do */
                                        if (phasedata->eqfunctions[length - 1] != NULL)
                                                continue;