]> granicus.if.org Git - python/commitdiff
Undo part of 2.59: 't' case of convertsimple() should not use convertbuffer().
authorJeremy Hylton <jeremy@alum.mit.edu>
Thu, 11 Oct 2001 14:40:37 +0000 (14:40 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Thu, 11 Oct 2001 14:40:37 +0000 (14:40 +0000)
convertbuffer() uses the buffer interface's getreadbuffer(), but 't'
should use getcharbuffer().

Python/getargs.c

index 089aaeafbd79ef86520ad6ec00c1ba8f8abc119b..0acb23a38ebaa8a052131e014a35c42196b8d672 100644 (file)
@@ -635,7 +635,6 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
                        else { /* any buffer-like object */
                                char *buf;
                                int count = convertbuffer(arg, p, &buf);
-
                                if (count < 0)
                                        return converterr(buf, arg, msgbuf);
                                *q = count;
@@ -936,7 +935,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
                
        case 't': { /* 8-bit character buffer, read-only access */
                const char **p = va_arg(*p_va, const char **);
-               char *buf;
+               PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
                int count;
                
                if (*format++ != '#')
@@ -944,14 +943,21 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
                                "invalid use of 't' format character", 
                                arg, msgbuf);
                if (!PyType_HasFeature(arg->ob_type,
-                                      Py_TPFLAGS_HAVE_GETCHARBUFFER))
+                                      Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
+                   pb == NULL || pb->bf_getcharbuffer == NULL ||
+                   pb->bf_getsegcount == NULL)
                        return converterr(
                                "string or read-only character buffer",
                                arg, msgbuf);
 
-               count = convertbuffer(arg, (void **)p, &buf);
+               if (pb->bf_getsegcount(arg, NULL) != 1)
+                       return converterr(
+                               "string or single-segment read-only buffer",
+                               arg, msgbuf);
+
+               count = pb->bf_getcharbuffer(arg, 0, p);
                if (count < 0)
-                       return converterr(buf, arg, msgbuf);
+                       return converterr("(unspecified)", arg, msgbuf);
                *va_arg(*p_va, int *) = count;
                break;
        }