From f73b2bbbdcb387aa90ff619fe03d1924ed82b868 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 11 Apr 2016 00:28:44 -0400 Subject: [PATCH] Fix poorly thought-through code from commit 5c3c3cd0a3046339. It's not entirely clear to me whether PyString_AsString can return null (looks like the answer might vary between Python 2 and 3). But in any case, this code's attempt to cope with the possibility was quite broken, because pstrdup() neither allows a null argument nor ever returns a null. Moreover, the code below this point assumes that "message" is a palloc'd string, which would not be the case for a dgettext result. Fix both problems by doing the pstrdup step separately. --- src/pl/plpython/plpy_plpymodule.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/pl/plpython/plpy_plpymodule.c b/src/pl/plpython/plpy_plpymodule.c index f136e8ece8..16d508943f 100644 --- a/src/pl/plpython/plpy_plpymodule.c +++ b/src/pl/plpython/plpy_plpymodule.c @@ -424,11 +424,12 @@ PLy_output(volatile int level, PyObject *self, PyObject *args, PyObject *kw) else so = PyObject_Str(args); - if (so == NULL || ((message = pstrdup(PyString_AsString(so))) == NULL)) + if (so == NULL || ((message = PyString_AsString(so)) == NULL)) { level = ERROR; message = dgettext(TEXTDOMAIN, "could not parse error message in plpy.elog"); } + message = pstrdup(message); Py_XDECREF(so); @@ -444,7 +445,8 @@ PLy_output(volatile int level, PyObject *self, PyObject *args, PyObject *kw) if (PyTuple_Size(args) != 0) PLy_elog(ERROR, "the message is already specified"); - pfree(message); + if (message) + pfree(message); message = object_to_string(value); } else if (strcmp(keyword, "detail") == 0) -- 2.40.0