aboutsummaryrefslogtreecommitdiff
path: root/src/pl/plpython/plpy_plpymodule.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-04-11 00:28:44 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2016-04-11 00:28:44 -0400
commitf73b2bbbdcb387aa90ff619fe03d1924ed82b868 (patch)
tree04bfcb4415bb50c9e1ed0fd298d2eafd0ed219d7 /src/pl/plpython/plpy_plpymodule.c
parent074050f16a2db9b5ebe5c9f8fdb211cbb810e746 (diff)
downloadpostgresql-f73b2bbbdcb387aa90ff619fe03d1924ed82b868.tar.gz
postgresql-f73b2bbbdcb387aa90ff619fe03d1924ed82b868.zip
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.
Diffstat (limited to 'src/pl/plpython/plpy_plpymodule.c')
-rw-r--r--src/pl/plpython/plpy_plpymodule.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/pl/plpython/plpy_plpymodule.c b/src/pl/plpython/plpy_plpymodule.c
index f136e8ece8b..16d508943f0 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)