diff options
author | Peter Eisentraut <peter@eisentraut.org> | 2019-03-14 08:25:25 +0100 |
---|---|---|
committer | Peter Eisentraut <peter@eisentraut.org> | 2019-03-15 08:37:48 +0100 |
commit | a1e9508b964155a81ec9a8e6e12be76796d47097 (patch) | |
tree | 0679380904b76049617f85e5f0fc1721ff7925a3 /contrib/jsonb_plpython/jsonb_plpython.c | |
parent | 5b866005c8b039e7b473ffef1f27b162b0436948 (diff) | |
download | postgresql-a1e9508b964155a81ec9a8e6e12be76796d47097.tar.gz postgresql-a1e9508b964155a81ec9a8e6e12be76796d47097.zip |
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
Diffstat (limited to 'contrib/jsonb_plpython/jsonb_plpython.c')
-rw-r--r-- | contrib/jsonb_plpython/jsonb_plpython.c | 9 |
1 files changed, 3 insertions, 6 deletions
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(); |