mirror of
https://github.com/postgres/postgres.git
synced 2025-05-18 17:41:14 +03:00
[ Patch to 7.4.X.]
In several places PL/Python was calling PyObject_Str() and then PyString_AsString() without checking if the former had returned NULL to indicate an error. PyString_AsString() doesn't expect a NULL argument, so passing one causes a segmentation fault. This patch adds checks for NULL and raises errors via PLy_elog(), which prints details of the underlying Python exception. The patch also adds regression tests for these checks. All tests pass on my Solaris 9 box running HEAD and Python 2.4.1.
This commit is contained in:
parent
8fb4451a4d
commit
6a2c659b31
@ -29,7 +29,7 @@
|
|||||||
* MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
* MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.41.2.1 2004/01/04 00:14:55 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.41.2.2 2005/09/25 03:18:16 momjian Exp $
|
||||||
*
|
*
|
||||||
*********************************************************************
|
*********************************************************************
|
||||||
*/
|
*/
|
||||||
@ -561,6 +561,8 @@ PLy_modify_tuple(PLyProcedure * proc, PyObject * pltd, TriggerData *tdata,
|
|||||||
if (plval != Py_None && !tupdesc->attrs[atti]->attisdropped)
|
if (plval != Py_None && !tupdesc->attrs[atti]->attisdropped)
|
||||||
{
|
{
|
||||||
plstr = PyObject_Str(plval);
|
plstr = PyObject_Str(plval);
|
||||||
|
if (!plstr)
|
||||||
|
PLy_elog(ERROR, "function \"%s\" could not modify tuple", proc->proname);
|
||||||
src = PyString_AsString(plstr);
|
src = PyString_AsString(plstr);
|
||||||
|
|
||||||
modvalues[i] = FunctionCall3(&proc->result.out.r.atts[atti].typfunc,
|
modvalues[i] = FunctionCall3(&proc->result.out.r.atts[atti].typfunc,
|
||||||
@ -847,6 +849,8 @@ PLy_function_handler(FunctionCallInfo fcinfo, PLyProcedure * proc)
|
|||||||
{
|
{
|
||||||
fcinfo->isnull = false;
|
fcinfo->isnull = false;
|
||||||
plrv_so = PyObject_Str(plrv);
|
plrv_so = PyObject_Str(plrv);
|
||||||
|
if (!plrv_so)
|
||||||
|
PLy_elog(ERROR, "function \"%s\" could not create return value", proc->proname);
|
||||||
plrv_sc = PyString_AsString(plrv_so);
|
plrv_sc = PyString_AsString(plrv_so);
|
||||||
rv = FunctionCall3(&proc->result.out.d.typfunc,
|
rv = FunctionCall3(&proc->result.out.d.typfunc,
|
||||||
PointerGetDatum(plrv_sc),
|
PointerGetDatum(plrv_sc),
|
||||||
@ -2117,7 +2121,9 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, int limit)
|
|||||||
char *sv;
|
char *sv;
|
||||||
|
|
||||||
PyObject *so = PyObject_Str(list);
|
PyObject *so = PyObject_Str(list);
|
||||||
|
if (!so)
|
||||||
|
PLy_elog(ERROR, "function \"%s\" could not execute plan",
|
||||||
|
PLy_procedure_name(PLy_last_procedure));
|
||||||
sv = PyString_AsString(so);
|
sv = PyString_AsString(so);
|
||||||
PLy_exception_set(PLy_exc_spi_error,
|
PLy_exception_set(PLy_exc_spi_error,
|
||||||
"Expected sequence of %d arguments, got %d. %s",
|
"Expected sequence of %d arguments, got %d. %s",
|
||||||
@ -2166,6 +2172,9 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, int limit)
|
|||||||
if (elem != Py_None)
|
if (elem != Py_None)
|
||||||
{
|
{
|
||||||
so = PyObject_Str(elem);
|
so = PyObject_Str(elem);
|
||||||
|
if (!so)
|
||||||
|
PLy_elog(ERROR, "function \"%s\" could not execute plan",
|
||||||
|
PLy_procedure_name(PLy_last_procedure));
|
||||||
sv = PyString_AsString(so);
|
sv = PyString_AsString(so);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2693,7 +2702,13 @@ PLy_traceback(int *xlevel)
|
|||||||
else
|
else
|
||||||
vstr = "Unknown";
|
vstr = "Unknown";
|
||||||
|
|
||||||
estr = PyString_AsString(eob);
|
/*
|
||||||
|
* I'm not sure what to do if eob is NULL here -- we can't call
|
||||||
|
* PLy_elog because that function calls us, so we could end up
|
||||||
|
* with infinite recursion. I'm not even sure if eob could be
|
||||||
|
* NULL here -- would an Assert() be more appropriate?
|
||||||
|
*/
|
||||||
|
estr = eob ? PyString_AsString(eob) : "Unknown Exception";
|
||||||
xstr = PLy_printf("%s: %s", estr, vstr);
|
xstr = PLy_printf("%s: %s", estr, vstr);
|
||||||
|
|
||||||
Py_DECREF(eob);
|
Py_DECREF(eob);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user