@@ -635,7 +635,6 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
635635 else { /* any buffer-like object */
636636 char * buf ;
637637 int count = convertbuffer (arg , p , & buf );
638-
639638 if (count < 0 )
640639 return converterr (buf , arg , msgbuf );
641640 * q = count ;
@@ -936,22 +935,29 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
936935
937936 case 't' : { /* 8-bit character buffer, read-only access */
938937 const char * * p = va_arg (* p_va , const char * * );
939- char * buf ;
938+ PyBufferProcs * pb = arg -> ob_type -> tp_as_buffer ;
940939 int count ;
941940
942941 if (* format ++ != '#' )
943942 return converterr (
944943 "invalid use of 't' format character" ,
945944 arg , msgbuf );
946945 if (!PyType_HasFeature (arg -> ob_type ,
947- Py_TPFLAGS_HAVE_GETCHARBUFFER ))
946+ Py_TPFLAGS_HAVE_GETCHARBUFFER ) ||
947+ pb == NULL || pb -> bf_getcharbuffer == NULL ||
948+ pb -> bf_getsegcount == NULL )
948949 return converterr (
949950 "string or read-only character buffer" ,
950951 arg , msgbuf );
951952
952- count = convertbuffer (arg , (void * * )p , & buf );
953+ if (pb -> bf_getsegcount (arg , NULL ) != 1 )
954+ return converterr (
955+ "string or single-segment read-only buffer" ,
956+ arg , msgbuf );
957+
958+ count = pb -> bf_getcharbuffer (arg , 0 , p );
953959 if (count < 0 )
954- return converterr (buf , arg , msgbuf );
960+ return converterr ("(unspecified)" , arg , msgbuf );
955961 * va_arg (* p_va , int * ) = count ;
956962 break ;
957963 }
0 commit comments