]> granicus.if.org Git - postgresql/commitdiff
Add stack depth checks to key recursive functions in backend/nodes/*.c.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 10 Dec 2018 16:12:43 +0000 (11:12 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 10 Dec 2018 16:12:43 +0000 (11:12 -0500)
Although copyfuncs.c has a check_stack_depth call in its recursion,
equalfuncs.c, outfuncs.c, and readfuncs.c lacked one.  This seems
unwise.

Likewise fix planstate_tree_walker(), in branches where that exists.

Discussion: https://postgr.es/m/30253.1544286631@sss.pgh.pa.us

src/backend/nodes/equalfuncs.c
src/backend/nodes/nodeFuncs.c
src/backend/nodes/outfuncs.c
src/backend/nodes/readfuncs.c

index 1eb679926af9f0f1ab412f11278711756e6ccae0..a7e1694e23b62d0a23878be9b4e526046e506021 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "postgres.h"
 
+#include "miscadmin.h"
 #include "nodes/extensible.h"
 #include "nodes/relation.h"
 #include "utils/datum.h"
@@ -2732,6 +2733,9 @@ equal(const void *a, const void *b)
        if (nodeTag(a) != nodeTag(b))
                return false;
 
+       /* Guard against stack overflow due to overly complex expressions */
+       check_stack_depth();
+
        switch (nodeTag(a))
        {
                        /*
index cd391673511693217ef97099a8d3bcf2cbd8face..8c6989229cb680054e62f8da5f9bf1f59ad37bb5 100644 (file)
@@ -3623,6 +3623,9 @@ planstate_tree_walker(PlanState *planstate,
        Plan       *plan = planstate->plan;
        ListCell   *lc;
 
+       /* Guard against stack overflow due to overly complex plan trees */
+       check_stack_depth();
+
        /* initPlan-s */
        if (planstate_walk_subplans(planstate->initPlan, walker, context))
                return true;
index f8d43dbf993ac94d6efdad0854f61f4e4525965a..96cefabb8f8796c88b4ddd68abd7ac36f191e701 100644 (file)
@@ -26,6 +26,7 @@
 #include <ctype.h>
 
 #include "lib/stringinfo.h"
+#include "miscadmin.h"
 #include "nodes/extensible.h"
 #include "nodes/plannodes.h"
 #include "nodes/relation.h"
@@ -3276,6 +3277,9 @@ _outForeignKeyCacheInfo(StringInfo str, const ForeignKeyCacheInfo *node)
 void
 outNode(StringInfo str, const void *obj)
 {
+       /* Guard against stack overflow due to overly complex expressions */
+       check_stack_depth();
+
        if (obj == NULL)
                appendStringInfoString(str, "<>");
        else if (IsA(obj, List) ||IsA(obj, IntList) || IsA(obj, OidList))
index da71dbb733207ebe201d5deca035f0f6400f5dc3..0c8b258945bbdbb7d100011e23cb7a0f75538ef0 100644 (file)
@@ -29,6 +29,7 @@
 #include <math.h>
 
 #include "fmgr.h"
+#include "miscadmin.h"
 #include "nodes/extensible.h"
 #include "nodes/parsenodes.h"
 #include "nodes/plannodes.h"
@@ -2262,6 +2263,9 @@ parseNodeString(void)
 
        READ_TEMP_LOCALS();
 
+       /* Guard against stack overflow due to overly complex expressions */
+       check_stack_depth();
+
        token = pg_strtok(&length);
 
 #define MATCH(tokname, namelen) \