aboutsummaryrefslogtreecommitdiff
path: root/contrib/hstore_plpython
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2019-04-06 17:54:29 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2019-04-06 17:54:29 -0400
commit9e360f0e8327bcf4b7c5ce957024fdff8f95f7de (patch)
tree711fd8b72f19017ee54e43ed8def208911441e1e /contrib/hstore_plpython
parent46e3442c9ec858071d60a1c0fae2e9868aeaa0c8 (diff)
downloadpostgresql-9e360f0e8327bcf4b7c5ce957024fdff8f95f7de.tar.gz
postgresql-9e360f0e8327bcf4b7c5ce957024fdff8f95f7de.zip
Avoid Python memory leaks in hstore_plpython and jsonb_plpython.
Fix some places where we might fail to do Py_DECREF() on a Python object (thereby leaking it for the rest of the session). Almost all of the risks were in error-recovery paths, which we don't really expect to hit anyway. Hence, while this is definitely a bug fix, it doesn't quite seem worth back-patching. Nikita Glukhov, Michael Paquier, Tom Lane Discussion: https://postgr.es/m/28053a7d-10d8-fc23-b05c-b4749c873f63@postgrespro.ru
Diffstat (limited to 'contrib/hstore_plpython')
-rw-r--r--contrib/hstore_plpython/hstore_plpython.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/contrib/hstore_plpython/hstore_plpython.c b/contrib/hstore_plpython/hstore_plpython.c
index 93c39d294dd..93705f0d54c 100644
--- a/contrib/hstore_plpython/hstore_plpython.c
+++ b/contrib/hstore_plpython/hstore_plpython.c
@@ -128,9 +128,9 @@ Datum
plpython_to_hstore(PG_FUNCTION_ARGS)
{
PyObject *dict;
- PyObject *volatile items = NULL;
- int32 pcount;
- HStore *out;
+ PyObject *volatile items;
+ Py_ssize_t pcount;
+ HStore *volatile out;
dict = (PyObject *) PG_GETARG_POINTER(0);
if (!PyMapping_Check(dict))
@@ -144,7 +144,7 @@ plpython_to_hstore(PG_FUNCTION_ARGS)
PG_TRY();
{
int32 buflen;
- int32 i;
+ Py_ssize_t i;
Pairs *pairs;
pairs = palloc(pcount * sizeof(*pairs));
@@ -176,7 +176,6 @@ plpython_to_hstore(PG_FUNCTION_ARGS)
pairs[i].isnull = false;
}
}
- Py_DECREF(items);
pcount = hstoreUniquePairs(pairs, pcount, &buflen);
out = hstorePairs(pairs, pcount, buflen);
@@ -188,5 +187,7 @@ plpython_to_hstore(PG_FUNCTION_ARGS)
}
PG_END_TRY();
+ Py_DECREF(items);
+
PG_RETURN_POINTER(out);
}