summaryrefslogtreecommitdiffstats
path: root/Modules/_sqlite/cursor.c
diff options
context:
space:
mode:
authorErlend Egeberg Aasland <erlend.aasland@innova.no>2021-03-04 09:50:25 (GMT)
committerGitHub <noreply@github.com>2021-03-04 09:50:25 (GMT)
commite161ec5dd7ba9355eb06757b9304019ac53cdf69 (patch)
tree424f0e45c595f358569763e3cfd67004bc6d9185 /Modules/_sqlite/cursor.c
parentc61ec7e6b892313cd3ecbaf02227bacb9d5ddaa2 (diff)
downloadcpython-e161ec5dd7ba9355eb06757b9304019ac53cdf69.zip
cpython-e161ec5dd7ba9355eb06757b9304019ac53cdf69.tar.gz
cpython-e161ec5dd7ba9355eb06757b9304019ac53cdf69.tar.bz2
bpo-43369: sqlite3_column_{text,blob} failures now raise MemoryError (GH-24723)
Diffstat (limited to 'Modules/_sqlite/cursor.c')
-rw-r--r--Modules/_sqlite/cursor.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c
index 764eec5..dfaa557 100644
--- a/Modules/_sqlite/cursor.c
+++ b/Modules/_sqlite/cursor.c
@@ -262,6 +262,7 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self)
if (!row)
return NULL;
+ sqlite3 *db = self->connection->db;
for (i = 0; i < numcols; i++) {
if (self->connection->detect_types
&& self->row_cast_map != NULL
@@ -280,17 +281,19 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self)
* See https://sqlite.org/c3ref/column_blob.html for details.
*/
if (converter != Py_None) {
- const char *blob = (const char*)sqlite3_column_blob(self->statement->st, i);
+ const void *blob = sqlite3_column_blob(self->statement->st, i);
+ if (blob == NULL && sqlite3_errcode(db) == SQLITE_NOMEM) {
+ PyErr_NoMemory();
+ goto error;
+ }
+
nbytes = sqlite3_column_bytes(self->statement->st, i);
- if (!blob) {
- converted = Py_NewRef(Py_None);
- } else {
- item = PyBytes_FromStringAndSize(blob, nbytes);
- if (!item)
- goto error;
- converted = PyObject_CallOneArg(converter, item);
- Py_DECREF(item);
+ item = PyBytes_FromStringAndSize(blob, nbytes);
+ if (item == NULL) {
+ goto error;
}
+ converted = PyObject_CallOneArg(converter, item);
+ Py_DECREF(item);
} else {
Py_BEGIN_ALLOW_THREADS
coltype = sqlite3_column_type(self->statement->st, i);
@@ -303,6 +306,11 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self)
converted = PyFloat_FromDouble(sqlite3_column_double(self->statement->st, i));
} else if (coltype == SQLITE_TEXT) {
const char *text = (const char*)sqlite3_column_text(self->statement->st, i);
+ if (text == NULL && sqlite3_errcode(db) == SQLITE_NOMEM) {
+ PyErr_NoMemory();
+ goto error;
+ }
+
nbytes = sqlite3_column_bytes(self->statement->st, i);
if (self->connection->text_factory == (PyObject*)&PyUnicode_Type) {
converted = PyUnicode_FromStringAndSize(text, nbytes);
@@ -332,7 +340,12 @@ _pysqlite_fetch_one_row(pysqlite_Cursor* self)
}
} else {
/* coltype == SQLITE_BLOB */
- const char *blob = sqlite3_column_blob(self->statement->st, i);
+ const void *blob = sqlite3_column_blob(self->statement->st, i);
+ if (blob == NULL && sqlite3_errcode(db) == SQLITE_NOMEM) {
+ PyErr_NoMemory();
+ goto error;
+ }
+
nbytes = sqlite3_column_bytes(self->statement->st, i);
converted = PyBytes_FromStringAndSize(blob, nbytes);
}