summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS1
-rw-r--r--psycopg/cursor_type.c25
2 files changed, 15 insertions, 11 deletions
diff --git a/NEWS b/NEWS
index d652028..d3fae29 100644
--- a/NEWS
+++ b/NEWS
@@ -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.
diff --git a/psycopg/cursor_type.c b/psycopg/cursor_type.c
index 877e339..d729400 100644
--- a/psycopg/cursor_type.c
+++ b/psycopg/cursor_type.c
@@ -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 *