Issue 7608: PyUnicode_FromFormatV handles %R and %S incorrectly. (original) (raw)

It seems PyUnicode_FromFormatV wrongly assumes that the return value of PyObject_Str and PyObject_Repr is a unicode object. It looks like the %S and %R feature was backported from 3.x without updating the code for 2.x.

PyObject * PyUnicode_FromFormatV(const char *format, va_list vargs) { ... case 'S': { PyObject *obj = va_arg(count, PyObject *); PyObject str; assert(obj); str = PyObject_Str(obj); if (!str) goto fail; n += PyUnicode_GET_SIZE(str); / Remember the str and switch to the next slot */ *callresult++ = str; break; } case 'R': { PyObject *obj = va_arg(count, PyObject *); PyObject repr; assert(obj); repr = PyObject_Repr(obj); if (!repr) goto fail; n += PyUnicode_GET_SIZE(repr); / Remember the repr and switch to the next slot */ *callresult++ = repr; break; } ... }