postgrespro.git / summary / log / commit / refs

commit    581a55889ba7f76dd87a270e37e5137f684bfdb7
Author:   Peter Eisentraut <peter@eisentraut.org>
Date:     Thu Nov 07 08:54:09 2019 +0000

    Fix nested error handling in PG_FINALLY
    
    We need to pop the error stack before running the user-supplied
    PG_FINALLY code.  Otherwise an error in the cleanup code would end up
    at the same sigsetjmp() invocation and result in an infinite error
    handling loop.
    
    Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
    Discussion: https://www.postgresql.org/message-id/flat/95a822c3-728b-af0e-d7e5-71890507ae0c%402ndquadrant.com


src/backend/utils/adt/xml.c | 2 +- src/include/utils/elog.h | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 3bc1716431..1ec16f49b2 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -3868,7 +3868,7 @@ xml_xmlnodetoxmltype(xmlNodePtr cur, PgXmlErrorContext *xmlerrcxt) result = xmlBuffer_to_xmltype(buf); } - PG_FINALLY() + PG_FINALLY(); { if (nodefree) nodefree(cur_copy); diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h index 853c2e0709..47412a831f 100644 --- a/src/include/utils/elog.h +++ b/src/include/utils/elog.h @@ -338,14 +338,16 @@ extern PGDLLIMPORT ErrorContextCallback *error_context_stack; } \ else \ _do_rethrow = true; \ - { + { \ + PG_exception_stack = _save_exception_stack; \ + error_context_stack = _save_context_stack #define PG_END_TRY() \ } \ - PG_exception_stack = _save_exception_stack; \ - error_context_stack = _save_context_stack; \ if (_do_rethrow) \ PG_RE_THROW(); \ + PG_exception_stack = _save_exception_stack; \ + error_context_stack = _save_context_stack; \ } while (0) /* [parent: a0c96856e8b3]