Skip to content

Commit d57b7cc

Browse files
committed
Add missing check_stack_depth() to some recursive functions
Reported-by: Egor Chindyaskin, Alexander Lakhin Discussion: https://postgr.es/m/1672760457.940462079%40f306.i.mail.ru
1 parent eb49e1b commit d57b7cc

File tree

5 files changed

+30
-0
lines changed

5 files changed

+30
-0
lines changed

src/backend/catalog/dependency.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
#include "commands/trigger.h"
7777
#include "commands/typecmds.h"
7878
#include "funcapi.h"
79+
#include "miscadmin.h"
7980
#include "nodes/nodeFuncs.h"
8081
#include "parser/parsetree.h"
8182
#include "rewrite/rewriteRemove.h"
@@ -524,6 +525,12 @@ findDependentObjects(const ObjectAddress *object,
524525
if (stack_address_present_add_flags(object, objflags, stack))
525526
return;
526527

528+
/*
529+
* since this function recurses, it could be driven to stack overflow,
530+
* because of the deep dependency tree, not only due to dependency loops.
531+
*/
532+
check_stack_depth();
533+
527534
/*
528535
* It's also possible that the target object has already been completely
529536
* processed and put into targetObjects. If so, again we just add the

src/backend/catalog/heap.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,9 @@ CheckAttributeType(const char *attname,
552552
char att_typtype = get_typtype(atttypid);
553553
Oid att_typelem;
554554

555+
/* since this function recurses, it could be driven to stack overflow */
556+
check_stack_depth();
557+
555558
if (att_typtype == TYPTYPE_PSEUDO)
556559
{
557560
/*

src/backend/commands/tablecmds.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7035,6 +7035,9 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel,
70357035
ObjectAddress address;
70367036
TupleDesc tupdesc;
70377037

7038+
/* since this function recurses, it could be driven to stack overflow */
7039+
check_stack_depth();
7040+
70387041
/* At top level, permission check was done in ATPrepCmd, else do it */
70397042
if (recursing)
70407043
ATSimplePermissions((*cmd)->subtype, rel, ATT_TABLE | ATT_FOREIGN_TABLE);
@@ -9083,6 +9086,10 @@ ATExecDropColumn(List **wqueue, Relation rel, const char *colName,
90839086

90849087
/* Initialize addrs on the first invocation */
90859088
Assert(!recursing || addrs != NULL);
9089+
9090+
/* since this function recurses, it could be driven to stack overflow */
9091+
check_stack_depth();
9092+
90869093
if (!recursing)
90879094
addrs = new_object_addresses();
90889095

@@ -11636,6 +11643,9 @@ ATExecAlterConstrRecurse(Constraint *cmdcon, Relation conrel, Relation tgrel,
1163611643
Oid refrelid;
1163711644
bool changed = false;
1163811645

11646+
/* since this function recurses, it could be driven to stack overflow */
11647+
check_stack_depth();
11648+
1163911649
currcon = (Form_pg_constraint) GETSTRUCT(contuple);
1164011650
conoid = currcon->oid;
1164111651
refrelid = currcon->confrelid;
@@ -12716,6 +12726,9 @@ dropconstraint_internal(Relation rel, HeapTuple constraintTup, DropBehavior beha
1271612726
/* Guard against stack overflow due to overly deep inheritance tree. */
1271712727
check_stack_depth();
1271812728

12729+
/* since this function recurses, it could be driven to stack overflow */
12730+
check_stack_depth();
12731+
1271912732
/* At top level, permission check was done in ATPrepCmd, else do it */
1272012733
if (recursing)
1272112734
ATSimplePermissions(AT_DropConstraint, rel, ATT_TABLE | ATT_FOREIGN_TABLE);

src/backend/optimizer/util/clauses.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2423,6 +2423,10 @@ static Node *
24232423
eval_const_expressions_mutator(Node *node,
24242424
eval_const_expressions_context *context)
24252425
{
2426+
2427+
/* since this function recurses, it could be driven to stack overflow */
2428+
check_stack_depth();
2429+
24262430
if (node == NULL)
24272431
return NULL;
24282432
switch (nodeTag(node))

src/backend/utils/adt/jsonpath_exec.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1674,6 +1674,9 @@ executeBoolItem(JsonPathExecContext *cxt, JsonPathItem *jsp,
16741674
JsonPathBool res;
16751675
JsonPathBool res2;
16761676

1677+
/* since this function recurses, it could be driven to stack overflow */
1678+
check_stack_depth();
1679+
16771680
if (!canHaveNext && jspHasNext(jsp))
16781681
elog(ERROR, "boolean jsonpath item cannot have next item");
16791682

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy