1. memory leak: ob_refcnt of '*str.44' is 1 too high

    Report

    1
    static PyObject *
    _mysql_escape_string(
    _mysql_ConnectionObject *self,
    PyObject *args)
    {
    PyObject *str;
    char *in, *out;
    int len, size;
    if (!PyArg_ParseTuple(args, "s#:escape_string", &in, &size)) return NULL;
    str = PyUnicode_FromStringAndSize((char *) NULL, size*2+1);
    if (!str) return PyErr_NoMemory();
    out = get_string(str);
    if (!out) return NULL;
    #if MYSQL_VERSION_ID < 32321
    // TODO: we don't support mysql 3.1...
    len = mysql_escape_string(out, in, size);
    #else
    len = mysql_real_escape_string(utf8conn, out, in, size);
    #endif
    if (PyUnicode_Resize(&str, len) < 0) return NULL;
    return (str);
    }
    1. was expecting final owned ob_refcnt of '*str.44' to be 0 since nothing references it but final ob_refcnt is refs: 1 owned

      found 2 similar trace(s) to this

    2. when PyArg_ParseTuple() succeeds

      taking False path

    3. when PyUnicodeUCS4_FromStringAndSize() succeeds

      '*str.44' was allocated at: str = PyUnicode_FromStringAndSize((char *) NULL, size*2+1);

    4. taking False path

    5. when treating unknown char * from _mysql.c:1083 as non-NULL

      taking False path

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

      taking True path

  2. returning (PyObject*)NULL without setting an exception

    Report

    2
    static PyObject *
    _mysql_escape_string(
    _mysql_ConnectionObject *self,
    PyObject *args)
    {
    PyObject *str;
    char *in, *out;
    int len, size;
    if (!PyArg_ParseTuple(args, "s#:escape_string", &in, &size)) return NULL;
    str = PyUnicode_FromStringAndSize((char *) NULL, size*2+1);
    if (!str) return PyErr_NoMemory();
    out = get_string(str);
    if (!out) return NULL;
    #if MYSQL_VERSION_ID < 32321
    // TODO: we don't support mysql 3.1...
    len = mysql_escape_string(out, in, size);
    #else
    len = mysql_real_escape_string(utf8conn, out, in, size);
    #endif
    if (PyUnicode_Resize(&str, len) < 0) return NULL;
    return (str);
    }
    1. found 1 similar trace(s) to this

    2. when PyArg_ParseTuple() succeeds

      taking False path

    3. when PyUnicodeUCS4_FromStringAndSize() succeeds

    4. taking False path

    5. when treating unknown char * from _mysql.c:1083 as non-NULL

      taking False path

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

      taking True path