mirror of
https://github.com/PyMySQL/mysqlclient.git
synced 2025-08-15 19:31:54 +08:00
Add some gc safety around _mysql__fetch_row (#348)
Users of gc.get_referrers() could cause a SystemError to be raised if this function is running in a different python thread.
This commit is contained in:
@ -1373,9 +1373,15 @@ _mysql_ResultObject_fetch_row(
|
|||||||
convert_row = row_converters[how];
|
convert_row = row_converters[how];
|
||||||
if (maxrows) {
|
if (maxrows) {
|
||||||
if (!(r = PyTuple_New(maxrows))) goto error;
|
if (!(r = PyTuple_New(maxrows))) goto error;
|
||||||
rowsadded = _mysql__fetch_row(self, &r, skiprows, maxrows,
|
|
||||||
convert_row);
|
// see: https://docs.python.org/3/library/gc.html#gc.get_referrers
|
||||||
|
// This function can get a reference to the tuple r, and if that
|
||||||
|
// code is preempted while holding a ref to r, the _PyTuple_Resize
|
||||||
|
// will raise a SystemError because the ref count is 2.
|
||||||
|
PyObject_GC_UnTrack(r);
|
||||||
|
rowsadded = _mysql__fetch_row(self, &r, skiprows, maxrows, convert_row);
|
||||||
if (rowsadded == -1) goto error;
|
if (rowsadded == -1) goto error;
|
||||||
|
PyObject_GC_Track(r);
|
||||||
} else {
|
} else {
|
||||||
if (self->use) {
|
if (self->use) {
|
||||||
maxrows = 1000;
|
maxrows = 1000;
|
||||||
|
Reference in New Issue
Block a user