Fixed use of Python object with refcount 0 in cursor_init

Caused segfault running test_cursor.CursorTests.test_invalid_name under
Python 3.4 built in debug mode.
This commit is contained in:
Daniele Varrazzo 2014-04-04 19:16:41 +01:00
parent 81443c3a65
commit ca98167ae4
2 changed files with 15 additions and 11 deletions

1
NEWS
View File

@ -25,6 +25,7 @@ What's new in psycopg 2.5.3
(:ticket:`#203`).
- Don't segfault using poorly defined cursor subclasses which forgot to call
the superclass init (:ticket:`#195`).
- Fixed possible segfault in named cursors creation.
- Fixed debug build on Windows, thanks to James Emerton.

View File

@ -1899,31 +1899,34 @@ cursor_init(PyObject *obj, PyObject *args, PyObject *kwargs)
{
PyObject *conn;
PyObject *name = Py_None;
const char *cname;
PyObject *bname = NULL;
const char *cname = NULL;
int rv = -1;
static char *kwlist[] = {"conn", "name", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|O", kwlist,
&connectionType, &conn, &name)) {
return -1;
goto exit;
}
if (name == Py_None) {
cname = NULL;
} else {
if (name != Py_None) {
Py_INCREF(name); /* for ensure_bytes */
if (!(name = psycopg_ensure_bytes(name))) {
if (!(bname = psycopg_ensure_bytes(name))) {
/* name has had a ref stolen */
return -1;
goto exit;
}
Py_DECREF(name);
if (!(cname = Bytes_AsString(name))) {
return -1;
if (!(cname = Bytes_AsString(bname))) {
goto exit;
}
}
return cursor_setup((cursorObject *)obj, (connectionObject *)conn, cname);
rv = cursor_setup((cursorObject *)obj, (connectionObject *)conn, cname);
exit:
Py_XDECREF(bname);
return rv;
}
static PyObject *