You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudberry.apache.org by re...@apache.org on 2026/06/04 09:05:39 UTC

(cloudberry) 15/22: Fix integer overflow in array_agg(), when the array grows too large

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 <he...@iki.fi>
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 <he...@iki.fi>
    Reviewed-by: Tom Lane <tg...@sss.pgh.pa.us>
    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: commits-unsubscribe@cloudberry.apache.org
For additional commands, e-mail: commits-help@cloudberry.apache.org