summaryrefslogtreecommitdiffstats
path: root/Modules/_io/textio.c
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2015-05-06 06:53:07 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2015-05-06 06:53:07 (GMT)
commit008d88b46218ea618455c89cba74132be223c1a4 (patch)
tree5e9af6b78aa401dc33a3a5b7a292985984b6a902 /Modules/_io/textio.c
parent9749b5a6a36859518c2136e3050a01008b2478eb (diff)
downloadcpython-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/textio.c')
-rw-r--r--Modules/_io/textio.c13
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)