Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4819e97

Browse files
committed
Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
convertbuffer() uses the buffer interface's getreadbuffer(), but 't' should use getcharbuffer().
1 parent de7c192 commit 4819e97

1 file changed

Lines changed: 11 additions & 5 deletions

File tree

Python/getargs.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)