]> 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/outfuncs.c
src/backend/nodes/readfuncs.c

index d48f7f66014bb8c9b652eabc1ee79ae5fdf77467..08ae7d2bf32a182a4642dc1b7922069d599aa8c2 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "postgres.h"
 
+#include "miscadmin.h"
 #include "nodes/relation.h"
 #include "utils/datum.h"
 
@@ -2514,6 +2515,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 9c16a1f4ea9d4a913267767b50a75016e16db2cf..fd63db5c0d17f23e6c7fe1e4880bc502c115560a 100644 (file)
@@ -24,6 +24,7 @@
 #include <ctype.h>
 
 #include "lib/stringinfo.h"
+#include "miscadmin.h"
 #include "nodes/plannodes.h"
 #include "nodes/relation.h"
 #include "utils/datum.h"
@@ -2757,6 +2758,9 @@ _outConstraint(StringInfo str, const Constraint *node)
 static 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 1ec4f3c69565020e5ed007b660e720249ca2411a..6498541d4acc5850099692a5dc9d297ced0e3c38 100644 (file)
@@ -28,6 +28,7 @@
 
 #include <math.h>
 
+#include "miscadmin.h"
 #include "nodes/parsenodes.h"
 #include "nodes/readfuncs.h"
 
@@ -1292,6 +1293,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) \