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]