From: Serhiy Storchaka Date: Wed, 6 May 2015 06:53:07 +0000 (+0300) Subject: Issue #24009: Got rid of using rare "y#" format unit in TextIOWrapper.tell(). X-Git-Tag: v3.5.0b1~236 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=008d88b46218ea618455c89cba74132be223c1a4;p=python Issue #24009: Got rid of using rare "y#" format unit in TextIOWrapper.tell(). Parsed value should be bytes, not general robuffer, this is required in other places. --- diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index c45f70dc21..c962c0ba08 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -2262,7 +2262,6 @@ _io_TextIOWrapper_tell_impl(textio *self) Py_ssize_t skip_bytes, skip_back; PyObject *saved_state = NULL; char *input, *input_end; - char *dec_buffer; Py_ssize_t dec_buffer_len; int dec_flags; @@ -2327,14 +2326,24 @@ _io_TextIOWrapper_tell_impl(textio *self) goto fail; #define DECODER_GETSTATE() do { \ + PyObject *dec_buffer; \ PyObject *_state = PyObject_CallMethodObjArgs(self->decoder, \ _PyIO_str_getstate, NULL); \ if (_state == NULL) \ goto fail; \ - if (!PyArg_ParseTuple(_state, "y#i", &dec_buffer, &dec_buffer_len, &dec_flags)) { \ + if (!PyArg_ParseTuple(_state, "Oi", &dec_buffer, &dec_flags)) { \ Py_DECREF(_state); \ goto fail; \ } \ + if (!PyBytes_Check(dec_buffer)) { \ + PyErr_Format(PyExc_TypeError, \ + "decoder getstate() should have returned a bytes " \ + "object, not '%.200s'", \ + Py_TYPE(dec_buffer)->tp_name); \ + Py_DECREF(_state); \ + goto fail; \ + } \ + dec_buffer_len = PyBytes_GET_SIZE(dec_buffer); \ Py_DECREF(_state); \ } while (0)