aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/error/elog.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index d91a85cb2d7..d1d1632bdd4 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -1743,7 +1743,21 @@ CopyErrorData(void)
newedata = (ErrorData *) palloc(sizeof(ErrorData));
memcpy(newedata, edata, sizeof(ErrorData));
- /* Make copies of separately-allocated fields */
+ /*
+ * Make copies of separately-allocated strings. Note that we copy even
+ * theoretically-constant strings such as filename. This is because those
+ * could point into JIT-created code segments that might get unloaded at
+ * transaction cleanup. In some cases we need the copied ErrorData to
+ * survive transaction boundaries, so we'd better copy those strings too.
+ */
+ if (newedata->filename)
+ newedata->filename = pstrdup(newedata->filename);
+ if (newedata->funcname)
+ newedata->funcname = pstrdup(newedata->funcname);
+ if (newedata->domain)
+ newedata->domain = pstrdup(newedata->domain);
+ if (newedata->context_domain)
+ newedata->context_domain = pstrdup(newedata->context_domain);
if (newedata->message)
newedata->message = pstrdup(newedata->message);
if (newedata->detail)
@@ -1756,6 +1770,8 @@ CopyErrorData(void)
newedata->context = pstrdup(newedata->context);
if (newedata->backtrace)
newedata->backtrace = pstrdup(newedata->backtrace);
+ if (newedata->message_id)
+ newedata->message_id = pstrdup(newedata->message_id);
if (newedata->schema_name)
newedata->schema_name = pstrdup(newedata->schema_name);
if (newedata->table_name)