Commit 80dc16ba authored by Guido van Rossum's avatar Guido van Rossum

Trent Mick:

Changes the 'b', 'h', and 'i' formatters in PyArg_ParseTuple to raise an
Overflow exception if they overflow (previously they just silently
overflowed).

Changes by Guido: always accept values [0..255] (in addition to
[CHAR_MIN..CHAR_MAX]) for 'b' format; changed some spaces into tabs in
other code.
parent 07bd90e9
...@@ -471,6 +471,16 @@ convertsimple1(arg, p_format, p_va) ...@@ -471,6 +471,16 @@ convertsimple1(arg, p_format, p_va)
long ival = PyInt_AsLong(arg); long ival = PyInt_AsLong(arg);
if (ival == -1 && PyErr_Occurred()) if (ival == -1 && PyErr_Occurred())
return "integer<b>"; return "integer<b>";
else if (ival < CHAR_MIN) {
PyErr_SetString(PyExc_OverflowError,
"byte integer is less than minimum");
return "integer<b>";
}
else if (ival > CHAR_MAX && ival >= 256) {
PyErr_SetString(PyExc_OverflowError,
"byte integer is greater than maximum");
return "integer<b>";
}
else else
*p = (char) ival; *p = (char) ival;
break; break;
...@@ -482,6 +492,16 @@ convertsimple1(arg, p_format, p_va) ...@@ -482,6 +492,16 @@ convertsimple1(arg, p_format, p_va)
long ival = PyInt_AsLong(arg); long ival = PyInt_AsLong(arg);
if (ival == -1 && PyErr_Occurred()) if (ival == -1 && PyErr_Occurred())
return "integer<h>"; return "integer<h>";
else if (ival < SHRT_MIN) {
PyErr_SetString(PyExc_OverflowError,
"short integer is less than minimum");
return "integer<h>";
}
else if (ival > SHRT_MAX) {
PyErr_SetString(PyExc_OverflowError,
"short integer is greater than maximum");
return "integer<h>";
}
else else
*p = (short) ival; *p = (short) ival;
break; break;
...@@ -493,6 +513,16 @@ convertsimple1(arg, p_format, p_va) ...@@ -493,6 +513,16 @@ convertsimple1(arg, p_format, p_va)
long ival = PyInt_AsLong(arg); long ival = PyInt_AsLong(arg);
if (ival == -1 && PyErr_Occurred()) if (ival == -1 && PyErr_Occurred())
return "integer<i>"; return "integer<i>";
else if (ival < INT_MIN) {
PyErr_SetString(PyExc_OverflowError,
"integer is less than minimum");
return "integer<i>";
}
else if (ival > INT_MAX) {
PyErr_SetString(PyExc_OverflowError,
"integer is greater than maximum");
return "integer<i>";
}
else else
*p = ival; *p = ival;
break; break;
...@@ -572,8 +602,8 @@ convertsimple1(arg, p_format, p_va) ...@@ -572,8 +602,8 @@ convertsimple1(arg, p_format, p_va)
case 's': /* string */ case 's': /* string */
{ {
if (*format == '#') { /* any buffer-like object */ if (*format == '#') { /* any buffer-like object */
void **p = (void **)va_arg(*p_va, char **); void **p = (void **)va_arg(*p_va, char **);
PyBufferProcs *pb = arg->ob_type->tp_as_buffer; PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
int *q = va_arg(*p_va, int *); int *q = va_arg(*p_va, int *);
int count; int count;
...@@ -589,9 +619,9 @@ convertsimple1(arg, p_format, p_va) ...@@ -589,9 +619,9 @@ convertsimple1(arg, p_format, p_va)
*q = count; *q = count;
format++; format++;
} else { } else {
char **p = va_arg(*p_va, char **); char **p = va_arg(*p_va, char **);
if (PyString_Check(arg)) if (PyString_Check(arg))
*p = PyString_AS_STRING(arg); *p = PyString_AS_STRING(arg);
else if (PyUnicode_Check(arg)) { else if (PyUnicode_Check(arg)) {
arg = _PyUnicode_AsUTF8String(arg, NULL); arg = _PyUnicode_AsUTF8String(arg, NULL);
...@@ -610,8 +640,8 @@ convertsimple1(arg, p_format, p_va) ...@@ -610,8 +640,8 @@ convertsimple1(arg, p_format, p_va)
case 'z': /* string, may be NULL (None) */ case 'z': /* string, may be NULL (None) */
{ {
if (*format == '#') { /* any buffer-like object */ if (*format == '#') { /* any buffer-like object */
void **p = (void **)va_arg(*p_va, char **); void **p = (void **)va_arg(*p_va, char **);
PyBufferProcs *pb = arg->ob_type->tp_as_buffer; PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
int *q = va_arg(*p_va, int *); int *q = va_arg(*p_va, int *);
int count; int count;
...@@ -632,9 +662,9 @@ convertsimple1(arg, p_format, p_va) ...@@ -632,9 +662,9 @@ convertsimple1(arg, p_format, p_va)
} }
format++; format++;
} else { } else {
char **p = va_arg(*p_va, char **); char **p = va_arg(*p_va, char **);
if (arg == Py_None) if (arg == Py_None)
*p = 0; *p = 0;
else if (PyString_Check(arg)) else if (PyString_Check(arg))
*p = PyString_AsString(arg); *p = PyString_AsString(arg);
...@@ -780,8 +810,8 @@ convertsimple1(arg, p_format, p_va) ...@@ -780,8 +810,8 @@ convertsimple1(arg, p_format, p_va)
case 'u': /* raw unicode buffer (Py_UNICODE *) */ case 'u': /* raw unicode buffer (Py_UNICODE *) */
{ {
if (*format == '#') { /* any buffer-like object */ if (*format == '#') { /* any buffer-like object */
void **p = (void **)va_arg(*p_va, char **); void **p = (void **)va_arg(*p_va, char **);
PyBufferProcs *pb = arg->ob_type->tp_as_buffer; PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
int *q = va_arg(*p_va, int *); int *q = va_arg(*p_va, int *);
int count; int count;
...@@ -799,9 +829,9 @@ convertsimple1(arg, p_format, p_va) ...@@ -799,9 +829,9 @@ convertsimple1(arg, p_format, p_va)
*q = count/(sizeof(Py_UNICODE)); *q = count/(sizeof(Py_UNICODE));
format++; format++;
} else { } else {
Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **); Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
if (PyUnicode_Check(arg)) if (PyUnicode_Check(arg))
*p = PyUnicode_AS_UNICODE(arg); *p = PyUnicode_AS_UNICODE(arg);
else else
return "unicode"; return "unicode";
...@@ -850,7 +880,7 @@ convertsimple1(arg, p_format, p_va) ...@@ -850,7 +880,7 @@ convertsimple1(arg, p_format, p_va)
if ((*pred)(arg)) if ((*pred)(arg))
*p = arg; *p = arg;
else else
return "(unspecified)"; return "(unspecified)";
} }
else if (*format == '&') { else if (*format == '&') {
...@@ -1161,7 +1191,7 @@ vgetargskeywords(args, keywords, format, kwlist, p_va) ...@@ -1161,7 +1191,7 @@ vgetargskeywords(args, keywords, format, kwlist, p_va)
} }
if (!match) { if (!match) {
sprintf(msgbuf, sprintf(msgbuf,
"%s is an invalid keyword argument for this function", "%s is an invalid keyword argument for this function",
ks); ks);
PyErr_SetString(PyExc_TypeError, msgbuf); PyErr_SetString(PyExc_TypeError, msgbuf);
return 0; return 0;
......
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