mirror of
https://github.com/postgres/postgres.git
synced 2026-05-27 20:27:28 -04:00
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 <heikki.linnakangas@iki.fi> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Backpatch-through: 14 Security: CVE-2026-6473
This commit is contained in:
parent
b2869ebc43
commit
6d68fcb28f
1 changed files with 10 additions and 3 deletions
|
|
@ -5576,6 +5576,7 @@ accumArrayResultArr(ArrayBuildStateArr *astate,
|
|||
ndatabytes;
|
||||
char *data;
|
||||
int i;
|
||||
int newnitems;
|
||||
|
||||
/*
|
||||
* We disallow accumulating null subarrays. Another plausible definition
|
||||
|
|
@ -5605,6 +5606,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 */
|
||||
|
|
@ -5670,8 +5679,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)
|
||||
{
|
||||
/*
|
||||
|
|
@ -5695,7 +5702,7 @@ accumArrayResultArr(ArrayBuildStateArr *astate,
|
|||
nitems);
|
||||
}
|
||||
|
||||
astate->nitems += nitems;
|
||||
astate->nitems = newnitems;
|
||||
astate->dims[0] += 1;
|
||||
|
||||
MemoryContextSwitchTo(oldcontext);
|
||||
|
|
|
|||
Loading…
Reference in a new issue