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.
diff --git a/Python/getargs.c b/Python/getargs.c
index 0579aff..f949da8 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -471,6 +471,16 @@
 			long ival = PyInt_AsLong(arg);
 			if (ival == -1 && PyErr_Occurred())
 				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
 				*p = (char) ival;
 			break;
@@ -482,6 +492,16 @@
 			long ival = PyInt_AsLong(arg);
 			if (ival == -1 && PyErr_Occurred())
 				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
 				*p = (short) ival;
 			break;
@@ -493,6 +513,16 @@
 			long ival = PyInt_AsLong(arg);
 			if (ival == -1 && PyErr_Occurred())
 				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
 				*p = ival;
 			break;
@@ -572,8 +602,8 @@
 	case 's': /* string */
 		{
 			if (*format == '#') { /* any buffer-like object */
-			        void **p = (void **)va_arg(*p_va, char **);
-			        PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
+				void **p = (void **)va_arg(*p_va, char **);
+				PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
 				int *q = va_arg(*p_va, int *);
 				int count;
 
@@ -589,9 +619,9 @@
 				*q = count;
 				format++;
 			} 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);
 				else if (PyUnicode_Check(arg)) {
 				    arg = _PyUnicode_AsUTF8String(arg, NULL);
@@ -610,8 +640,8 @@
 	case 'z': /* string, may be NULL (None) */
 		{
 			if (*format == '#') { /* any buffer-like object */
-			        void **p = (void **)va_arg(*p_va, char **);
-			        PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
+				void **p = (void **)va_arg(*p_va, char **);
+				PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
 				int *q = va_arg(*p_va, int *);
 				int count;
 
@@ -632,9 +662,9 @@
 				}
 				format++;
 			} 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;
 				else if (PyString_Check(arg))
 				  *p = PyString_AsString(arg);
@@ -780,8 +810,8 @@
 	case 'u': /* raw unicode buffer (Py_UNICODE *) */
 		{
 			if (*format == '#') { /* any buffer-like object */
-			        void **p = (void **)va_arg(*p_va, char **);
-			        PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
+				void **p = (void **)va_arg(*p_va, char **);
+				PyBufferProcs *pb = arg->ob_type->tp_as_buffer;
 				int *q = va_arg(*p_va, int *);
 				int count;
 
@@ -799,9 +829,9 @@
 				*q = count/(sizeof(Py_UNICODE)); 
 				format++;
 			} 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);
 				else
 				  return "unicode";
@@ -850,7 +880,7 @@
 				if ((*pred)(arg)) 
 					*p = arg;
 				else
-				         return "(unspecified)";
+					return "(unspecified)";
 				
 			}
 			else if (*format == '&') {
@@ -1161,7 +1191,7 @@
 			}
 			if (!match) {
 				sprintf(msgbuf,
-		         "%s is an invalid keyword argument for this function",
+			"%s is an invalid keyword argument for this function",
 					ks);
 				PyErr_SetString(PyExc_TypeError, msgbuf);
 				return 0;