From a65b29794a394afdea78a3ee367ca8fd373788e3 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 6 Dec 2010 22:55:51 -0500 Subject: [PATCH] Add a stack overflow check to copyObject(). There are some code paths, such as SPI_execute(), where we invoke copyObject() on raw parse trees before doing parse analysis on them. Since the bison grammar is capable of building heavily nested parsetrees while itself using only minimal stack depth, this means that copyObject() can be the front-line function that hits stack overflow before anything else does. Accordingly, it had better have a check_stack_depth() call. I did a bit of performance testing and found that this slows down copyObject() by only a few percent, so the hit ought to be negligible in the context of complete processing of a query. Per off-list report from Toshihide Katayama. Back-patch to all supported branches. --- src/backend/nodes/copyfuncs.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index 6e6844bade..5f83e4fc98 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -22,6 +22,7 @@ #include "postgres.h" +#include "miscadmin.h" #include "nodes/plannodes.h" #include "nodes/relation.h" #include "utils/datum.h" @@ -3570,6 +3571,9 @@ copyObject(void *from) if (from == NULL) return NULL; + /* Guard against stack overflow due to overly complex expressions */ + check_stack_depth(); + switch (nodeTag(from)) { /* -- 2.11.0