From a0b480f85e7394c270f9a98d535950fbc9519d39 Mon Sep 17 00:00:00 2001 From: totaj Date: Tue, 10 Oct 2023 15:50:49 +0800 Subject: [PATCH] Fix json stack overflow. --- src/common/backend/utils/adt/json.cpp | 4 ++++ src/test/regress/expected/json.out | 5 +++++ src/test/regress/sql/json.sql | 2 ++ 3 files changed, 11 insertions(+) diff --git a/src/common/backend/utils/adt/json.cpp b/src/common/backend/utils/adt/json.cpp index 47d40d1d3..621cedd28 100644 --- a/src/common/backend/utils/adt/json.cpp +++ b/src/common/backend/utils/adt/json.cpp @@ -394,6 +394,8 @@ static void parse_object(JsonLexContext *lex, JsonSemAction *sem) json_struct_action oend = sem->object_end; JsonTokenType tok; + check_stack_depth(); + if (ostart != NULL) { (*ostart) (sem->semstate); } @@ -469,6 +471,8 @@ static void parse_array(JsonLexContext *lex, JsonSemAction *sem) json_struct_action astart = sem->array_start; json_struct_action aend = sem->array_end; + check_stack_depth(); + if (astart != NULL) { (*astart) (sem->semstate); } diff --git a/src/test/regress/expected/json.out b/src/test/regress/expected/json.out index 91a62280e..aaffa34db 100644 --- a/src/test/regress/expected/json.out +++ b/src/test/regress/expected/json.out @@ -1214,6 +1214,11 @@ CONTEXT: referenced column: json_object select json_object('{a,b,"","d e f"}','{1,2,3,"a b c"}'); ERROR: empty value not allowed for object key CONTEXT: referenced column: json_object +-- execced max stack depath +select json_in(REPEAT('{"a":[', 100000)::cstring); +ERROR: stack depth limit exceeded +HINT: Increase the configuration parameter "max_stack_depth" (currently 2048kB), after ensuring the platform's stack depth limit is adequate. +CONTEXT: referenced column: json_in -- json_to_record and json_to_recordset select * from json_to_record('{"a":1,"b":"foo","c":"bar"}',true) as x(a int, b text, d text); diff --git a/src/test/regress/sql/json.sql b/src/test/regress/sql/json.sql index ff815e1f6..9251af860 100644 --- a/src/test/regress/sql/json.sql +++ b/src/test/regress/sql/json.sql @@ -418,6 +418,8 @@ select json_object('{a,b,NULL,"d e f"}','{1,2,3,"a b c"}'); select json_object('{a,b,"","d e f"}','{1,2,3,"a b c"}'); +-- execced max stack depath +select json_in(REPEAT('{"a":[', 100000)::cstring); -- json_to_record and json_to_recordset