mirror of
https://github.com/psycopg/psycopg2.git
synced 2024-11-23 01:16:34 +03:00
First half of 8.1.4 securiy patch.
This commit is contained in:
parent
750806c806
commit
9299073649
|
@ -125,10 +125,17 @@ class SQL_IN(object):
|
||||||
def __init__(self, seq):
|
def __init__(self, seq):
|
||||||
self._seq = seq
|
self._seq = seq
|
||||||
|
|
||||||
|
def prepare(self, conn):
|
||||||
|
self._conn = conn
|
||||||
|
|
||||||
def getquoted(self):
|
def getquoted(self):
|
||||||
# this is the important line: note how every object in the
|
# this is the important line: note how every object in the
|
||||||
# list is adapted and then how getquoted() is called on it
|
# list is adapted and then how getquoted() is called on it
|
||||||
qobjs = [str(_A(o).getquoted()) for o in self._seq]
|
pobjs = [_A(o) for o in self._seq]
|
||||||
|
for obj in pobjs:
|
||||||
|
if hasattr(obj, 'prepare'):
|
||||||
|
obj.prepare(self._conn)
|
||||||
|
qobjs = [str(o.getquoted()) for o in pobjs]
|
||||||
return '(' + ', '.join(qobjs) + ')'
|
return '(' + ', '.join(qobjs) + ')'
|
||||||
|
|
||||||
__str__ = getquoted
|
__str__ = getquoted
|
||||||
|
|
|
@ -38,10 +38,19 @@
|
||||||
/** the quoting code */
|
/** the quoting code */
|
||||||
|
|
||||||
#ifndef PSYCOPG_OWN_QUOTING
|
#ifndef PSYCOPG_OWN_QUOTING
|
||||||
#define qstring_escape PQescapeString
|
static size_t
|
||||||
|
qstring_escape(char *to, char *from, size_t len, PGconn *conn)
|
||||||
|
{
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
if (conn)
|
||||||
|
return PQescapeStringConn(conn, to, from, len, &err);
|
||||||
|
else
|
||||||
|
return PQescapeString(to, from, len);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
static size_t
|
static size_t
|
||||||
qstring_escape(char *to, char *from, size_t len)
|
qstring_escape(char *to, char *from, size_t len, PGconn *conn)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
|
@ -134,7 +143,8 @@ qstring_quote(qstringObject *self)
|
||||||
}
|
}
|
||||||
|
|
||||||
Py_BEGIN_ALLOW_THREADS;
|
Py_BEGIN_ALLOW_THREADS;
|
||||||
len = qstring_escape(buffer+1, s, len);
|
len = qstring_escape(buffer+1, s, len,
|
||||||
|
((connectionObject*)self->conn)->pgconn);
|
||||||
buffer[0] = '\'' ; buffer[len+1] = '\'';
|
buffer[0] = '\'' ; buffer[len+1] = '\'';
|
||||||
Py_END_ALLOW_THREADS;
|
Py_END_ALLOW_THREADS;
|
||||||
|
|
||||||
|
@ -179,7 +189,13 @@ qstring_prepare(qstringObject *self, PyObject *args)
|
||||||
self->encoding = strdup(conn->encoding);
|
self->encoding = strdup(conn->encoding);
|
||||||
Dprintf("qstring_prepare: set encoding to %s", conn->encoding);
|
Dprintf("qstring_prepare: set encoding to %s", conn->encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Py_XDECREF(self->conn);
|
||||||
|
if (conn) {
|
||||||
|
self->conn = (PyObject*)conn;
|
||||||
|
Py_INCREF(self->conn);
|
||||||
|
}
|
||||||
|
|
||||||
Py_INCREF(Py_None);
|
Py_INCREF(Py_None);
|
||||||
return Py_None;
|
return Py_None;
|
||||||
}
|
}
|
||||||
|
@ -217,7 +233,7 @@ static PyMethodDef qstringObject_methods[] = {
|
||||||
{"getquoted", (PyCFunction)qstring_getquoted, METH_VARARGS,
|
{"getquoted", (PyCFunction)qstring_getquoted, METH_VARARGS,
|
||||||
"getquoted() -> wrapped object value as SQL-quoted string"},
|
"getquoted() -> wrapped object value as SQL-quoted string"},
|
||||||
{"prepare", (PyCFunction)qstring_prepare, METH_VARARGS,
|
{"prepare", (PyCFunction)qstring_prepare, METH_VARARGS,
|
||||||
"prepare(conn) -> set encoding to conn->encoding"},
|
"prepare(conn) -> set encoding to conn->encoding and store conn"},
|
||||||
{"__conform__", (PyCFunction)qstring_conform, METH_VARARGS, NULL},
|
{"__conform__", (PyCFunction)qstring_conform, METH_VARARGS, NULL},
|
||||||
{NULL} /* Sentinel */
|
{NULL} /* Sentinel */
|
||||||
};
|
};
|
||||||
|
@ -231,6 +247,7 @@ qstring_setup(qstringObject *self, PyObject *str, char *enc)
|
||||||
self, ((PyObject *)self)->ob_refcnt);
|
self, ((PyObject *)self)->ob_refcnt);
|
||||||
|
|
||||||
self->buffer = NULL;
|
self->buffer = NULL;
|
||||||
|
self->conn = NULL;
|
||||||
|
|
||||||
/* FIXME: remove this orrible strdup */
|
/* FIXME: remove this orrible strdup */
|
||||||
if (enc) self->encoding = strdup(enc);
|
if (enc) self->encoding = strdup(enc);
|
||||||
|
@ -250,6 +267,8 @@ qstring_dealloc(PyObject* obj)
|
||||||
|
|
||||||
Py_XDECREF(self->wrapped);
|
Py_XDECREF(self->wrapped);
|
||||||
Py_XDECREF(self->buffer);
|
Py_XDECREF(self->buffer);
|
||||||
|
Py_XDECREF(self->conn);
|
||||||
|
|
||||||
if (self->encoding) free(self->encoding);
|
if (self->encoding) free(self->encoding);
|
||||||
|
|
||||||
Dprintf("qstring_dealloc: deleted qstring object at %p, refcnt = %d",
|
Dprintf("qstring_dealloc: deleted qstring object at %p, refcnt = %d",
|
||||||
|
|
|
@ -36,6 +36,8 @@ typedef struct {
|
||||||
PyObject *wrapped;
|
PyObject *wrapped;
|
||||||
PyObject *buffer;
|
PyObject *buffer;
|
||||||
char *encoding;
|
char *encoding;
|
||||||
|
|
||||||
|
PyObject *conn;
|
||||||
} qstringObject;
|
} qstringObject;
|
||||||
|
|
||||||
/* functions exported to psycopgmodule.c */
|
/* functions exported to psycopgmodule.c */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user