mirror of
https://github.com/PyMySQL/mysqlclient.git
synced 2025-08-15 11:10:58 +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];
|
||||
if (maxrows) {
|
||||
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;
|
||||
PyObject_GC_Track(r);
|
||||
} else {
|
||||
if (self->use) {
|
||||
maxrows = 1000;
|
||||
|
Reference in New Issue
Block a user