From 1226d932b4dadc39ba2f9a488e4d784443ea6a78 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 14 Mar 2019 08:25:25 +0100 Subject: Fix volatile vs. pointer confusion Variables used after a longjmp() need to be declared volatile. In case of a pointer, it's the pointer itself that needs to be declared volatile, not the pointed-to value. So we need PyObject *volatile items; instead of volatile PyObject *items; /* wrong */ Discussion: https://www.postgresql.org/message-id/flat/f747368d-9e1a-c46a-ac76-3c27da32e8e4%402ndquadrant.com --- contrib/jsonb_plpython/jsonb_plpython.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'contrib/jsonb_plpython') diff --git a/contrib/jsonb_plpython/jsonb_plpython.c b/contrib/jsonb_plpython/jsonb_plpython.c index f44d364c97c..1bc984d5c4d 100644 --- a/contrib/jsonb_plpython/jsonb_plpython.c +++ b/contrib/jsonb_plpython/jsonb_plpython.c @@ -237,17 +237,14 @@ PLyMapping_ToJsonbValue(PyObject *obj, JsonbParseState **jsonb_state) JsonbValue *out = NULL; /* We need it volatile, since we use it after longjmp */ - volatile PyObject *items_v = NULL; + PyObject *volatile items = NULL; pcount = PyMapping_Size(obj); - items_v = PyMapping_Items(obj); + items = PyMapping_Items(obj); PG_TRY(); { Py_ssize_t i; - PyObject *items; - - items = (PyObject *) items_v; pushJsonbValue(jsonb_state, WJB_BEGIN_OBJECT, NULL); @@ -279,7 +276,7 @@ PLyMapping_ToJsonbValue(PyObject *obj, JsonbParseState **jsonb_state) } PG_CATCH(); { - Py_DECREF(items_v); + Py_DECREF(items); PG_RE_THROW(); } PG_END_TRY(); -- cgit v1.2.3