]> granicus.if.org Git - postgresql/commitdiff
Fix volatile vs. pointer confusion
authorPeter Eisentraut <peter@eisentraut.org>
Thu, 14 Mar 2019 07:25:25 +0000 (08:25 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Fri, 15 Mar 2019 07:38:45 +0000 (08:38 +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

index b184324ebf0d90c058ff0376bcfd1e066b8e2f4b..25328322364350f60019b06118ceffb0a216fae3 100644 (file)
@@ -124,7 +124,7 @@ Datum
 plpython_to_hstore(PG_FUNCTION_ARGS)
 {
        PyObject   *dict;
-       volatile PyObject *items_v = NULL;
+       PyObject *volatile items = NULL;
        int32           pcount;
        HStore     *out;
 
@@ -135,14 +135,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));
 
@@ -173,14 +172,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();