mirror of https://github.com/python/cpython
Trent Mick <trentm@activestate.com>:
Limit the 'b' formatter of PyArg_ParseTuple to valid values of an unsigned char, i.e. [0,UCHAR_MAX]. It is expected that this is the common usage of 'b'. An OverflowError is raised if the parsed value is outside this range.
This commit is contained in:
parent
a69ef82643
commit
230cae7474
|
@ -465,28 +465,28 @@ convertsimple1(arg, p_format, p_va)
|
||||||
|
|
||||||
switch (c) {
|
switch (c) {
|
||||||
|
|
||||||
case 'b': /* byte -- very short int */
|
case 'b': /* unsigned byte -- very short int */
|
||||||
{
|
{
|
||||||
char *p = va_arg(*p_va, char *);
|
char *p = va_arg(*p_va, char *);
|
||||||
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) {
|
else if (ival < 0) {
|
||||||
PyErr_SetString(PyExc_OverflowError,
|
PyErr_SetString(PyExc_OverflowError,
|
||||||
"byte integer is less than minimum");
|
"unsigned byte integer is less than minimum");
|
||||||
return "integer<b>";
|
return "integer<b>";
|
||||||
}
|
}
|
||||||
else if (ival > CHAR_MAX && ival >= 256) {
|
else if (ival > UCHAR_MAX) {
|
||||||
PyErr_SetString(PyExc_OverflowError,
|
PyErr_SetString(PyExc_OverflowError,
|
||||||
"byte integer is greater than maximum");
|
"unsigned byte integer is greater than maximum");
|
||||||
return "integer<b>";
|
return "integer<b>";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
*p = (char) ival;
|
*p = (unsigned char) ival;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'h': /* short int */
|
case 'h': /* signed short int */
|
||||||
{
|
{
|
||||||
short *p = va_arg(*p_va, short *);
|
short *p = va_arg(*p_va, short *);
|
||||||
long ival = PyInt_AsLong(arg);
|
long ival = PyInt_AsLong(arg);
|
||||||
|
@ -494,12 +494,12 @@ convertsimple1(arg, p_format, p_va)
|
||||||
return "integer<h>";
|
return "integer<h>";
|
||||||
else if (ival < SHRT_MIN) {
|
else if (ival < SHRT_MIN) {
|
||||||
PyErr_SetString(PyExc_OverflowError,
|
PyErr_SetString(PyExc_OverflowError,
|
||||||
"short integer is less than minimum");
|
"signed short integer is less than minimum");
|
||||||
return "integer<h>";
|
return "integer<h>";
|
||||||
}
|
}
|
||||||
else if (ival > SHRT_MAX) {
|
else if (ival > SHRT_MAX) {
|
||||||
PyErr_SetString(PyExc_OverflowError,
|
PyErr_SetString(PyExc_OverflowError,
|
||||||
"short integer is greater than maximum");
|
"signed short integer is greater than maximum");
|
||||||
return "integer<h>";
|
return "integer<h>";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -507,7 +507,7 @@ convertsimple1(arg, p_format, p_va)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 'i': /* int */
|
case 'i': /* signed int */
|
||||||
{
|
{
|
||||||
int *p = va_arg(*p_va, int *);
|
int *p = va_arg(*p_va, int *);
|
||||||
long ival = PyInt_AsLong(arg);
|
long ival = PyInt_AsLong(arg);
|
||||||
|
@ -515,12 +515,12 @@ convertsimple1(arg, p_format, p_va)
|
||||||
return "integer<i>";
|
return "integer<i>";
|
||||||
else if (ival < INT_MIN) {
|
else if (ival < INT_MIN) {
|
||||||
PyErr_SetString(PyExc_OverflowError,
|
PyErr_SetString(PyExc_OverflowError,
|
||||||
"integer is less than minimum");
|
"signed integer is less than minimum");
|
||||||
return "integer<i>";
|
return "integer<i>";
|
||||||
}
|
}
|
||||||
else if (ival > INT_MAX) {
|
else if (ival > INT_MAX) {
|
||||||
PyErr_SetString(PyExc_OverflowError,
|
PyErr_SetString(PyExc_OverflowError,
|
||||||
"integer is greater than maximum");
|
"signed integer is greater than maximum");
|
||||||
return "integer<i>";
|
return "integer<i>";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue