diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-02-07 23:05:48 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-02-07 23:05:48 (GMT) |
commit | 36ae29c759fb7854345b61a18958e00635ee8e04 (patch) | |
tree | f3c2eec3b8dc74a237fa630f99bbee2aba82c581 | |
parent | b59b04dd86514cec9e7acd6b2c65e49afaaa3b2a (diff) | |
download | cpython-36ae29c759fb7854345b61a18958e00635ee8e04.zip cpython-36ae29c759fb7854345b61a18958e00635ee8e04.tar.gz cpython-36ae29c759fb7854345b61a18958e00635ee8e04.tar.bz2 |
Issue #26198: Fixed error messages for some argument parsing errors.
Fixed the documented about buffer overflow error for "es#" and "et#" format
units.
-rw-r--r-- | Doc/c-api/arg.rst | 3 | ||||
-rw-r--r-- | Python/getargs.c | 33 |
2 files changed, 23 insertions, 13 deletions
diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst index 8fbdc50..61fe937 100644 --- a/Doc/c-api/arg.rst +++ b/Doc/c-api/arg.rst @@ -136,7 +136,8 @@ area. Also, you won't have to release any memory yourself, except with the :c:func:`PyArg_ParseTuple` will use this location as the buffer and interpret the initial value of *\*buffer_length* as the buffer size. It will then copy the encoded data into the buffer and NUL-terminate it. If - the buffer is not large enough, a :exc:`ValueError` will be set. + the buffer is not large enough, a :exc:`TypeError` will be set. + Note: starting from Python 3.6 a :exc:`ValueError` will be set. In both cases, *\*buffer_length* is set to the length of the encoded data without the trailing NUL byte. diff --git a/Python/getargs.c b/Python/getargs.c index 81a2721..bd15c2e 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -346,7 +346,7 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags) flags, levels, msgbuf, sizeof(msgbuf), &freelist); if (msg) { - seterror(i+1, msg, levels, fname, msg); + seterror(i+1, msg, levels, fname, message); return cleanreturn(0, freelist); } } @@ -533,9 +533,17 @@ converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize) { assert(expected != NULL); assert(arg != NULL); - PyOS_snprintf(msgbuf, bufsize, - "must be %.50s, not %.50s", expected, - arg == Py_None ? "None" : arg->ob_type->tp_name); + if (expected[0] == '(') { + PyOS_snprintf(msgbuf, bufsize, + "%.100s", expected); + strncpy(msgbuf, expected, bufsize); + msgbuf[bufsize-1] = '\0'; + } + else { + PyOS_snprintf(msgbuf, bufsize, + "must be %.50s, not %.50s", expected, + arg == Py_None ? "None" : arg->ob_type->tp_name); + } return msgbuf; } @@ -753,7 +761,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, else if (PyLong_Check(arg)) ival = PyLong_AsUnsignedLongMask(arg); else - return converterr("integer<k>", arg, msgbuf, bufsize); + return converterr("an integer", arg, msgbuf, bufsize); *p = ival; break; } @@ -781,7 +789,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, else if (PyLong_Check(arg)) ival = PyLong_AsUnsignedLongLongMask(arg); else - return converterr("integer<K>", arg, msgbuf, bufsize); + return converterr("an integer", arg, msgbuf, bufsize); *p = ival; break; } @@ -1127,9 +1135,11 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, } else { if (size + 1 > BUFFER_LEN) { Py_DECREF(s); - return converterr( - "(buffer overflow)", - arg, msgbuf, bufsize); + PyErr_Format(PyExc_TypeError, + "encoded string too long " + "(%zd, maximum length %zd)", + (Py_ssize_t)size, (Py_ssize_t)(BUFFER_LEN-1)); + return ""; } } memcpy(*buffer, @@ -1154,7 +1164,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, != size) { Py_DECREF(s); return converterr( - "encoded string without NULL bytes", + "encoded string without null bytes", arg, msgbuf, bufsize); } *buffer = PyMem_NEW(char, size + 1); @@ -1261,7 +1271,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, break; } - case 'w': { /* memory buffer, read-write access */ void **p = va_arg(*p_va, void **); void *res; @@ -1353,7 +1362,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, } default: - return converterr("impossible<bad format char>", arg, msgbuf, bufsize); + return converterr("(impossible<bad format char>)", arg, msgbuf, bufsize); } |