diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2015-05-06 06:53:07 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-05-06 06:53:07 (GMT) |
commit | 008d88b46218ea618455c89cba74132be223c1a4 (patch) | |
tree | 5e9af6b78aa401dc33a3a5b7a292985984b6a902 /Modules/_io | |
parent | 9749b5a6a36859518c2136e3050a01008b2478eb (diff) | |
download | cpython-008d88b46218ea618455c89cba74132be223c1a4.zip cpython-008d88b46218ea618455c89cba74132be223c1a4.tar.gz cpython-008d88b46218ea618455c89cba74132be223c1a4.tar.bz2 |
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.
Diffstat (limited to 'Modules/_io')
-rw-r--r-- | Modules/_io/textio.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index c45f70d..c962c0b 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) |