This is an automated email from the ASF dual-hosted git repository.

reshke pushed a commit to branch REL_2_STABLE
in repository https://gitbox.apache.org/repos/asf/cloudberry.git

commit a289db892e83beb00a6744a93dd9fd82bdf2b268
Author: Heikki Linnakangas <[email protected]>
AuthorDate: Mon May 11 05:13:51 2026 -0700

    Fix integer overflow in array_agg(), when the array grows too large
    
    If you accumulate many arrays full of NULLs, you could overflow
    'nitems', before reaching the MaxAllocSize limit on the allocations.
    Add an explicit check that the number of items doesn't grow too large.
    With more than MaxArraySize items, getting the final result with
    makeArrayResultArr() would fail anyway, so better to error out early.
    
    Reported-by: Xint Code
    Author: Heikki Linnakangas <[email protected]>
    Reviewed-by: Tom Lane <[email protected]>
    Backpatch-through: 14
    Security: CVE-2026-6473
---
 src/backend/utils/adt/arrayfuncs.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/backend/utils/adt/arrayfuncs.c 
b/src/backend/utils/adt/arrayfuncs.c
index 6d00be72b16..c116a1783c2 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -5445,6 +5445,7 @@ accumArrayResultArr(ArrayBuildStateArr *astate,
                                ndatabytes;
        char       *data;
        int                     i;
+       int                     newnitems;
 
        /*
         * We disallow accumulating null subarrays.  Another plausible 
definition
@@ -5474,6 +5475,14 @@ accumArrayResultArr(ArrayBuildStateArr *astate,
        nitems = ArrayGetNItems(ndims, dims);
        ndatabytes = ARR_SIZE(arg) - ARR_DATA_OFFSET(arg);
 
+       /* Check that the array doesn't grow too large */
+       newnitems = astate->nitems + nitems;
+       if (newnitems > MaxArraySize)
+               ereport(ERROR,
+                               (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
+                                errmsg("array size exceeds the maximum allowed 
(%zu)",
+                                               MaxArraySize)));
+
        if (astate->ndims == 0)
        {
                /* First input; check/save the dimensionality info */
@@ -5539,8 +5548,6 @@ accumArrayResultArr(ArrayBuildStateArr *astate,
        /* Deal with null bitmap if needed */
        if (astate->nullbitmap || ARR_HASNULL(arg))
        {
-               int                     newnitems = astate->nitems + nitems;
-
                if (astate->nullbitmap == NULL)
                {
                        /*
@@ -5564,7 +5571,7 @@ accumArrayResultArr(ArrayBuildStateArr *astate,
                                                  nitems);
        }
 
-       astate->nitems += nitems;
+       astate->nitems = newnitems;
        astate->dims[0] += 1;
 
        MemoryContextSwitchTo(oldcontext);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to