1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-13 07:41:39 +03:00

Patch some corner-case bugs in pl/python.

Dave Malcolm of Red Hat is working on a static code analysis tool for
Python-related C code.  It reported a number of problems in plpython,
most of which were failures to check for NULL results from object-creation
functions, so would only be an issue in very-low-memory situations.

Patch in HEAD and 9.1.  We could go further back but it's not clear that
these issues are important enough to justify the work.

Jan Urbański
This commit is contained in:
Tom Lane
2012-03-13 15:26:36 -04:00
parent 5a264d4aa0
commit 0cb4a0bfb8

View File

@ -2345,6 +2345,8 @@ PLyList_FromArray(PLyDatumToOb *arg, Datum d)
length = ARR_DIMS(array)[0];
lbound = ARR_LBOUND(array)[0];
list = PyList_New(length);
if (list == NULL)
PLy_elog(ERROR, "could not create new list");
for (i = 0; i < length; i++)
{
@ -3664,7 +3666,7 @@ PLy_spi_execute_query(char *query, long limit)
int rv;
volatile MemoryContext oldcontext;
volatile ResourceOwner oldowner;
PyObject *ret;
PyObject *ret = NULL;
oldcontext = CurrentMemoryContext;
oldowner = CurrentResourceOwner;
@ -3727,6 +3729,7 @@ PLy_spi_execute_query(char *query, long limit)
if (rv < 0)
{
Py_XDECREF(ret);
PLy_exception_set(PLy_exc_spi_error,
"SPI_execute failed: %s",
SPI_result_code_string(rv));
@ -3967,7 +3970,13 @@ PLy_generate_spi_exceptions(PyObject *mod, PyObject *base)
PyObject *sqlstate;
PyObject *dict = PyDict_New();
if (dict == NULL)
PLy_elog(ERROR, "could not generate SPI exceptions");
sqlstate = PyString_FromString(unpack_sql_state(exception_map[i].sqlstate));
if (sqlstate == NULL)
PLy_elog(ERROR, "could not generate SPI exceptions");
PyDict_SetItemString(dict, "sqlstate", sqlstate);
Py_DECREF(sqlstate);
exc = PyErr_NewException(exception_map[i].name, base, dict);
@ -4008,6 +4017,11 @@ PLy_add_exceptions(PyObject *plpy)
PLy_exc_fatal = PyErr_NewException("plpy.Fatal", NULL, NULL);
PLy_exc_spi_error = PyErr_NewException("plpy.SPIError", NULL, NULL);
if (PLy_exc_error == NULL ||
PLy_exc_fatal == NULL ||
PLy_exc_spi_error == NULL)
PLy_elog(ERROR, "could not create the base SPI exceptions");
Py_INCREF(PLy_exc_error);
PyModule_AddObject(plpy, "Error", PLy_exc_error);
Py_INCREF(PLy_exc_fatal);
@ -4124,6 +4138,8 @@ PLy_init_interp(void)
Py_INCREF(mainmod);
PLy_interp_globals = PyModule_GetDict(mainmod);
PLy_interp_safe_globals = PyDict_New();
if (PLy_interp_safe_globals == NULL)
PLy_elog(ERROR, "could not create globals");
PyDict_SetItemString(PLy_interp_globals, "GD", PLy_interp_safe_globals);
Py_DECREF(mainmod);
if (PLy_interp_globals == NULL || PyErr_Occurred())
@ -4164,9 +4180,11 @@ PLy_init_plpy(void)
main_mod = PyImport_AddModule("__main__");
main_dict = PyModule_GetDict(main_mod);
plpy_mod = PyImport_AddModule("plpy");
if (plpy_mod == NULL)
PLy_elog(ERROR, "could not initialize plpy");
PyDict_SetItemString(main_dict, "plpy", plpy_mod);
if (PyErr_Occurred())
elog(ERROR, "could not initialize plpy");
PLy_elog(ERROR, "could not initialize plpy");
}
/* the python interface to the elog function
@ -4232,7 +4250,8 @@ PLy_output(volatile int level, PyObject *self, PyObject *args)
*/
PyObject *o;
PyArg_UnpackTuple(args, "plpy.elog", 1, 1, &o);
if (!PyArg_UnpackTuple(args, "plpy.elog", 1, 1, &o))
PLy_elog(ERROR, "could not unpack arguments in plpy.elog");
so = PyObject_Str(o);
}
else
@ -4554,6 +4573,10 @@ get_source_line(const char *src, int lineno)
const char *next = src;
int current = 0;
/* sanity check */
if (lineno <= 0)
return NULL;
while (current < lineno)
{
s = next;