New submission from Kristján Valur Jónsson <krist...@ccpgames.com>:
The new "s*" code for PyArg_ParseTuple is used to fill a Py_buffer object from the arguments. This object must be relased using PyBuffer_Release() after use. However, if the object in the tuple does not support the new buffer interface, the old buffer interface is queried and the Py_buffer object is manually filled in. For this case, the source object is _not_ increfed and buffer.obj remains set to 0. This causes different semantics in the function for objects that are passed in: If the Py_buffer interface is supported directly, then it is safe for the function to store this and release this at a later time. If it isn't supported, then no extra reference to the object is got and the function cannot safely keep the Py_buffer object around. The Fix is as follows: Change line 1402 of getargs.c from: PyBuffer_FillInfo(view, NULL, buf, count, 1, 0); to PyBuffer_FillInfo(view, arg, buf, count, 1, 0); ---------- messages: 122445 nosy: krisvale priority: normal severity: normal status: open title: PyArg_ParseTuple("s*") does not always incref object type: behavior versions: Python 2.7, Python 3.2 _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue10538> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com