Issue 13083: _sre: getstring() releases the buffer before using it (original) (raw)

getstring() of the _sre module contains the following code:

...
buffer = Py_TYPE(string)->tp_as_buffer;
if (!buffer || !buffer->bf_getbuffer ||
    (*buffer->bf_getbuffer)(string, &view, PyBUF_SIMPLE) < 0) {
        PyErr_SetString(PyExc_TypeError, "expected string or buffer");
        return NULL;
}

/* determine buffer size */
bytes = view.len;
ptr = view.buf;

/* Release the buffer immediately --- possibly dangerous
   but doing something else would require some re-factoring
*/
PyBuffer_Release(&view);
...

getstring() is used to initialize a state or a pattern. State and pattern have destructors (pattern_dealloc() and state_fini()), so it should be possible to keep the view active and call PyBuffer_Release() in the destructor.