Fix volatile vs. pointer confusion
authorPeter Eisentraut <[email protected]>
Thu, 14 Mar 2019 07:25:25 +0000 (08:25 +0100)
committerPeter Eisentraut <[email protected]>
Thu, 14 Mar 2019 07:42:48 +0000 (08:42 +0100)
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/hstore_plpython/hstore_plpython.c
contrib/jsonb_plpython/jsonb_plpython.c

index 2f24090ff3eadae849fb5b0cdd8a51f1831189ec..93c39d294dd439f4fa7752283fe643ac4a4d2dc6 100644 (file)
@@ -128,7 +128,7 @@ Datum
 plpython_to_hstore(PG_FUNCTION_ARGS)
 {
    PyObject   *dict;
-   volatile PyObject *items_v = NULL;
+   PyObject *volatile items = NULL;
    int32       pcount;
    HStore     *out;
 
@@ -139,14 +139,13 @@ plpython_to_hstore(PG_FUNCTION_ARGS)
                 errmsg("not a Python mapping")));
 
    pcount = PyMapping_Size(dict);
-   items_v = PyMapping_Items(dict);
+   items = PyMapping_Items(dict);
 
    PG_TRY();
    {
        int32       buflen;
        int32       i;
        Pairs      *pairs;
-       PyObject   *items = (PyObject *) items_v;
 
        pairs = palloc(pcount * sizeof(*pairs));
 
@@ -177,14 +176,14 @@ plpython_to_hstore(PG_FUNCTION_ARGS)
                pairs[i].isnull = false;
            }
        }
-       Py_DECREF(items_v);
+       Py_DECREF(items);
 
        pcount = hstoreUniquePairs(pairs, pcount, &buflen);
        out = hstorePairs(pairs, pcount, buflen);
    }
    PG_CATCH();
    {
-       Py_DECREF(items_v);
+       Py_DECREF(items);
        PG_RE_THROW();
    }
    PG_END_TRY();
index f44d364c97c374e1aa35913c5ca55086114c20ea..1bc984d5c4d9dbaacaa3675c2da2d7d0e8f4b657 100644 (file)
@@ -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();