Commit 36ae29c7 authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #26198: Fixed error messages for some argument parsing errors.

Fixed the documented about buffer overflow error for "es#" and "et#" format
units.
parent b59b04dd
...@@ -136,7 +136,8 @@ area. Also, you won't have to release any memory yourself, except with the ...@@ -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 :c:func:`PyArg_ParseTuple` will use this location as the buffer and
interpret the initial value of *\*buffer_length* as the buffer size. It 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 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 In both cases, *\*buffer_length* is set to the length of the encoded data
without the trailing NUL byte. without the trailing NUL byte.
......
...@@ -346,7 +346,7 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags) ...@@ -346,7 +346,7 @@ vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)
flags, levels, msgbuf, flags, levels, msgbuf,
sizeof(msgbuf), &freelist); sizeof(msgbuf), &freelist);
if (msg) { if (msg) {
seterror(i+1, msg, levels, fname, msg); seterror(i+1, msg, levels, fname, message);
return cleanreturn(0, freelist); return cleanreturn(0, freelist);
} }
} }
...@@ -533,9 +533,17 @@ converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize) ...@@ -533,9 +533,17 @@ converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize)
{ {
assert(expected != NULL); assert(expected != NULL);
assert(arg != NULL); assert(arg != NULL);
if (expected[0] == '(') {
PyOS_snprintf(msgbuf, bufsize,
"%.100s", expected);
strncpy(msgbuf, expected, bufsize);
msgbuf[bufsize-1] = '\0';
}
else {
PyOS_snprintf(msgbuf, bufsize, PyOS_snprintf(msgbuf, bufsize,
"must be %.50s, not %.50s", expected, "must be %.50s, not %.50s", expected,
arg == Py_None ? "None" : arg->ob_type->tp_name); arg == Py_None ? "None" : arg->ob_type->tp_name);
}
return msgbuf; return msgbuf;
} }
...@@ -753,7 +761,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, ...@@ -753,7 +761,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
else if (PyLong_Check(arg)) else if (PyLong_Check(arg))
ival = PyLong_AsUnsignedLongMask(arg); ival = PyLong_AsUnsignedLongMask(arg);
else else
return converterr("integer<k>", arg, msgbuf, bufsize); return converterr("an integer", arg, msgbuf, bufsize);
*p = ival; *p = ival;
break; break;
} }
...@@ -781,7 +789,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, ...@@ -781,7 +789,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
else if (PyLong_Check(arg)) else if (PyLong_Check(arg))
ival = PyLong_AsUnsignedLongLongMask(arg); ival = PyLong_AsUnsignedLongLongMask(arg);
else else
return converterr("integer<K>", arg, msgbuf, bufsize); return converterr("an integer", arg, msgbuf, bufsize);
*p = ival; *p = ival;
break; break;
} }
...@@ -1127,9 +1135,11 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, ...@@ -1127,9 +1135,11 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
} else { } else {
if (size + 1 > BUFFER_LEN) { if (size + 1 > BUFFER_LEN) {
Py_DECREF(s); Py_DECREF(s);
return converterr( PyErr_Format(PyExc_TypeError,
"(buffer overflow)", "encoded string too long "
arg, msgbuf, bufsize); "(%zd, maximum length %zd)",
(Py_ssize_t)size, (Py_ssize_t)(BUFFER_LEN-1));
return "";
} }
} }
memcpy(*buffer, memcpy(*buffer,
...@@ -1154,7 +1164,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, ...@@ -1154,7 +1164,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
!= size) { != size) {
Py_DECREF(s); Py_DECREF(s);
return converterr( return converterr(
"encoded string without NULL bytes", "encoded string without null bytes",
arg, msgbuf, bufsize); arg, msgbuf, bufsize);
} }
*buffer = PyMem_NEW(char, size + 1); *buffer = PyMem_NEW(char, size + 1);
...@@ -1261,7 +1271,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, ...@@ -1261,7 +1271,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
break; break;
} }
case 'w': { /* memory buffer, read-write access */ case 'w': { /* memory buffer, read-write access */
void **p = va_arg(*p_va, void **); void **p = va_arg(*p_va, void **);
void *res; void *res;
...@@ -1353,7 +1362,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, ...@@ -1353,7 +1362,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
} }
default: default:
return converterr("impossible<bad format char>", arg, msgbuf, bufsize); return converterr("(impossible<bad format char>)", arg, msgbuf, bufsize);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment