]> granicus.if.org Git - python/commitdiff
Issue #24009: Got rid of using rare "y#" format unit in TextIOWrapper.tell().
authorSerhiy Storchaka <storchaka@gmail.com>
Wed, 6 May 2015 06:53:07 +0000 (09:53 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Wed, 6 May 2015 06:53:07 +0000 (09:53 +0300)
Parsed value should be bytes, not general robuffer, this is required in other
places.

Modules/_io/textio.c

index c45f70dc21e71faab9a2af52e5602fe3d27fab3b..c962c0ba082e59da4f0a4424f767c7136c312bc1 100644 (file)
@@ -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)