postgres.git / summary / log / commit / refs

commit    c4252ec43cd95b20b278f023c3616eb39dcd2b8b
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Wed Apr 30 17:46:25 2014 +0000
First released in: 9.4.0, 8.4.22, 9.0.18, 9.1.14, 9.2.9, 9.3.5

    Check for interrupts and stack overflow during rule/view dumps.
    
    Since ruleutils.c recurses, it could be driven to stack overflow by
    deeply nested constructs.  Very large queries might also take long
    enough to deparse that a check for interrupts seems like a good idea.
    Stick appropriate tests into a couple of key places.
    
    Noted by Greg Stark.  Back-patch to all supported branches.


src/backend/utils/adt/ruleutils.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 11b573c0982..c3ab5746c46 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -35,6 +35,7 @@ #include "commands/tablespace.h" #include "executor/spi.h" #include "funcapi.h" +#include "miscadmin.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "optimizer/clauses.h" @@ -2416,6 +2417,10 @@ get_query_def(Query *query, StringInfo buf, List *parentnamespace, deparse_context context; deparse_namespace dpns; + /* Guard against excessively long or deeply-nested queries */ + CHECK_FOR_INTERRUPTS(); + check_stack_depth(); + /* * Before we begin to examine the query, acquire locks on referenced * relations, and fix up deleted columns in JOIN RTEs. This ensures @@ -2866,6 +2871,10 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context, StringInfo buf = context->buf; bool need_paren; + /* Guard against excessively long or deeply-nested queries */ + CHECK_FOR_INTERRUPTS(); + check_stack_depth(); + if (IsA(setOp, RangeTblRef)) { RangeTblRef *rtr = (RangeTblRef *) setOp; @@ -4512,6 +4521,10 @@ get_rule_expr(Node *node, deparse_context *context, if (node == NULL) return; + /* Guard against excessively long or deeply-nested queries */ + CHECK_FOR_INTERRUPTS(); + check_stack_depth(); + /* * Each level of get_rule_expr must emit an indivisible term * (parenthesized if necessary) to ensure result is reparsed into the same [parent: c06b7219a0a4]