mirror of
https://github.com/postgres/postgres.git
synced 2025-07-26 01:22:12 +03:00
PL/Python: Fix potential NULL pointer dereference
After d0aa965c0a
, one error path in
PLy_spi_execute_fetch_result() could result in the variable "result"
being dereferenced after being set to NULL. Rearrange the code a bit to
fix that.
Also add another SPI_freetuptable() call so that that is cleared in all
error paths.
discovered by John Naylor <jcnaylor@gmail.com> via scan-build
ideas and review by Tom Lane
This commit is contained in:
@ -361,7 +361,10 @@ PLy_spi_execute_fetch_result(SPITupleTable *tuptable, uint64 rows, int status)
|
|||||||
|
|
||||||
result = (PLyResultObject *) PLy_result_new();
|
result = (PLyResultObject *) PLy_result_new();
|
||||||
if (!result)
|
if (!result)
|
||||||
|
{
|
||||||
|
SPI_freetuptable(tuptable);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
Py_DECREF(result->status);
|
Py_DECREF(result->status);
|
||||||
result->status = PyInt_FromLong(status);
|
result->status = PyInt_FromLong(status);
|
||||||
|
|
||||||
@ -411,12 +414,7 @@ PLy_spi_execute_fetch_result(SPITupleTable *tuptable, uint64 rows, int status)
|
|||||||
|
|
||||||
Py_DECREF(result->rows);
|
Py_DECREF(result->rows);
|
||||||
result->rows = PyList_New(rows);
|
result->rows = PyList_New(rows);
|
||||||
if (!result->rows)
|
if (result->rows)
|
||||||
{
|
|
||||||
Py_DECREF(result);
|
|
||||||
result = NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
PLy_input_setup_tuple(&ininfo, tuptable->tupdesc,
|
PLy_input_setup_tuple(&ininfo, tuptable->tupdesc,
|
||||||
exec_ctx->curr_proc);
|
exec_ctx->curr_proc);
|
||||||
@ -455,6 +453,13 @@ PLy_spi_execute_fetch_result(SPITupleTable *tuptable, uint64 rows, int status)
|
|||||||
|
|
||||||
MemoryContextDelete(cxt);
|
MemoryContextDelete(cxt);
|
||||||
SPI_freetuptable(tuptable);
|
SPI_freetuptable(tuptable);
|
||||||
|
|
||||||
|
/* in case PyList_New() failed above */
|
||||||
|
if (!result->rows)
|
||||||
|
{
|
||||||
|
Py_DECREF(result);
|
||||||
|
result = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (PyObject *) result;
|
return (PyObject *) result;
|
||||||
|
Reference in New Issue
Block a user