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:
Jason Fried
2020-02-05 03:38:25 -08:00
committed by GitHub
parent 18163d7022
commit c67dbd41f1

View File

@ -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;