Re: Re[2]: BUG #17561: Server crashes on executing row() with very long argument list
Richard Guo <guofenglinux@gmail.com>
From: Richard Guo <guofenglinux@gmail.com>
To: Егор Чиндяскин <kyzevan23@mail.ru>
Cc: Tom Lane <tgl@sss.pgh.pa.us>, Alvaro Herrera <alvherre@alvh.no-ip.org>, PostgreSQL mailing lists <pgsql-bugs@lists.postgresql.org>
Date: 2022-08-01T10:33:31Z
Lists: pgsql-bugs
On Mon, Aug 1, 2022 at 6:03 PM Richard Guo <guofenglinux@gmail.com> wrote:
>
> On Mon, Aug 1, 2022 at 3:17 PM Егор Чиндяскин <kyzevan23@mail.ru> wrote:
>
>> Thank you, Tom! The fix works for that case, but there is another one.
>> I got server crashed while executing the following script:
>>
>> (echo "SELECT * FROM json_to_record('{\"0\":0
>> ";for((i=1;i<100001;i++));do echo ",\"$i\":$i";done; echo "}') as x("; echo
>> "\"0\" int";for((i=1;i<100001;i++));do echo ",\"$i\" int";done;echo ")") |
>> psql
>>
>
> Thanks for the report! This is another place that we construct a tupdesc
> with more than MaxAttrNumber attributes, via RangeFunctions this time.
>
> Regarding the fix, how about we check the length of coldeflist against
> MaxTupleAttributeNumber in transformRangeFunction()?
>
I mean something like this:
diff --git a/src/backend/parser/parse_clause.c
b/src/backend/parser/parse_clause.c
index 5a18107e79..a74a07667d 100644
--- a/src/backend/parser/parse_clause.c
+++ b/src/backend/parser/parse_clause.c
@@ -629,6 +629,15 @@ transformRangeFunction(ParseState *pstate,
RangeFunction *r)
*/
if (r->coldeflist)
{
+ /* Disallow more columns than will fit in a tuple */
+ if (list_length(r->coldeflist) > MaxTupleAttributeNumber)
+ ereport(ERROR,
+ (errcode(ERRCODE_TOO_MANY_COLUMNS),
+ errmsg("Function returning RECORD
can have at most %d entries",
+
MaxTupleAttributeNumber),
+ parser_errposition(pstate,
+
exprLocation((Node *) r->coldeflist))));
+
if (list_length(funcexprs) != 1)
{
if (r->is_rowsfrom)
Thanks
Richard
Commits
-
Check maximum number of columns in function RTEs, too.
- d947a8bd5606 14.5 landed
- d54fc7e67651 10.22 landed
- adc3ae6eb313 15.0 landed
- 83f1793d6096 16.0 landed
- 5d280bc89336 12.12 landed
- 51d8b52fcf8c 11.17 landed
- 331f8b851c98 13.8 landed
-
In transformRowExpr(), check for too many columns in the row.
- e6e804aa2726 15.0 landed
- fd96d14d950f 16.0 landed
- e6a48014df39 10.22 landed
- d79f00e821ed 12.12 landed
- ba2002d02cf4 13.8 landed
- 8df167baa7c7 14.5 landed
- 8dea18372f55 11.17 landed