Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Fix poorly thought-through code from commit 5c3c3cd0a3046339.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 11 Apr 2016 04:28:44 +0000 (00:28 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 11 Apr 2016 04:28:44 +0000 (00:28 -0400)
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

index f136e8ece8bef416c55e95e61353ee8b0ebe677a..16d508943f04c1527b8ae1d8d7de519d2381d9db 100644 (file)
@@ -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)