aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2010-12-06 22:56:12 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2010-12-06 22:56:12 -0500
commit0ae63a4fb2db1131e0715810199de0c0a8e7c2d8 (patch)
tree1492fc203aa7a6f792fffc295d2349eec8614532
parent8a6eb2ee9895b88311d01fd0d54fb380304d3df6 (diff)
downloadpostgresql-0ae63a4fb2db1131e0715810199de0c0a8e7c2d8.tar.gz
postgresql-0ae63a4fb2db1131e0715810199de0c0a8e7c2d8.zip
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.
-rw-r--r--src/backend/nodes/copyfuncs.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 244f80751dd..8cb209ace13 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/parsenodes.h"
#include "nodes/plannodes.h"
#include "nodes/relation.h"
@@ -2684,6 +2685,9 @@ copyObject(void *from)
if (from == NULL)
return NULL;
+ /* Guard against stack overflow due to overly complex expressions */
+ check_stack_depth();
+
switch (nodeTag(from))
{
/*