1. memory leak: ob_refcnt of new ref from (unknown) _mysql_Exception is 1 too high

    Report

    1
    int
    _mysql__fetch_row(
    _mysql_ResultObject *self,
    PyObject **r,
    int skiprows,
    int maxrows,
    _PYFUNC *convert_row)
    {
    unsigned int i;
    MYSQL_ROW row;
    for (i = skiprows; i<(skiprows+maxrows); i++) {
    PyObject *v;
    if (!self->use)
    row = mysql_fetch_row(self->result);
    else {
    Py_BEGIN_ALLOW_THREADS;
    row = mysql_fetch_row(self->result);
    Py_END_ALLOW_THREADS;
    }
    if (!row && mysql_errno(&(((_mysql_ConnectionObject *)(self->conn))->connection))) {
    _mysql_Exception((_mysql_ConnectionObject *)self->conn);
    goto error;
    }
    if (!row) {
    if (MyTuple_Resize(r, i, 0) == -1) goto error;
    break;
    }
    v = convert_row(self, row);
    if (!v) goto error;
    PyTuple_SET_ITEM(*r, i, v);
    }
    return i-skiprows;
    error:
    return -1;
    }
    1. when taking True path

    2. when considering range: -0x80000000 <= value <= -1

      taking False path

    3. releasing the GIL by calling PyEval_SaveThread()

    4. reacquiring the GIL by calling PyEval_RestoreThread()

    5. when treating unknown char * * from _mysql.c:1507 as NULL

      taking True path

      when treating unknown struct PyObject * from _mysql.c:1510 as non-NULL

      when considering range: 1 <= value <= 0xffffffff

      taking True path

    6. when _mysql_Exception() succeeds

      new ref from (unknown) _mysql_Exception was allocated at: _mysql_Exception((_mysql_ConnectionObject *)self->conn);

    7. was expecting final owned ob_refcnt of new ref from (unknown) _mysql_Exception to be 0 since nothing references it but final ob_refcnt is refs: 1 owned

      found 2 similar trace(s) to this