[Python-checkins] CVS: python/dist/src/Python getargs.c,2.31,2.32

Guido van Rossum python-dev@python.org
Mon, 8 May 2000 10:02:44 -0400 (EDT)


Update of /projects/cvsroot/python/dist/src/Python
In directory eric:/projects/python/develop/guido/src/Python

Modified Files:
	getargs.c 
Log Message:
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.


Index: getargs.c
===================================================================
RCS file: /projects/cvsroot/python/dist/src/Python/getargs.c,v
retrieving revision 2.31
retrieving revision 2.32
diff -C2 -r2.31 -r2.32
*** getargs.c	2000/05/03 15:15:57	2.31
--- getargs.c	2000/05/08 14:02:41	2.32
***************
*** 472,475 ****
--- 472,485 ----
  			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;
***************
*** 483,486 ****
--- 493,506 ----
  			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;
***************
*** 494,497 ****
--- 514,527 ----
  			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;
***************
*** 573,578 ****
  		{
  			if (*format == '#') { /* any buffer-like object */
! 			        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;
--- 603,608 ----
  		{
  			if (*format == '#') { /* any buffer-like object */
! 				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;
***************
*** 590,596 ****
  				format++;
  			} else {
! 			        char **p = va_arg(*p_va, char **);
  			
! 			        if (PyString_Check(arg))
  				    *p = PyString_AS_STRING(arg);
  				else if (PyUnicode_Check(arg)) {
--- 620,626 ----
  				format++;
  			} else {
! 				char **p = va_arg(*p_va, char **);
  			
! 				if (PyString_Check(arg))
  				    *p = PyString_AS_STRING(arg);
  				else if (PyUnicode_Check(arg)) {
***************
*** 611,616 ****
  		{
  			if (*format == '#') { /* any buffer-like object */
! 			        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;
--- 641,646 ----
  		{
  			if (*format == '#') { /* any buffer-like object */
! 				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;
***************
*** 633,639 ****
  				format++;
  			} else {
! 			        char **p = va_arg(*p_va, char **);
  			
! 			        if (arg == Py_None)
  				  *p = 0;
  				else if (PyString_Check(arg))
--- 663,669 ----
  				format++;
  			} else {
! 				char **p = va_arg(*p_va, char **);
  			
! 				if (arg == Py_None)
  				  *p = 0;
  				else if (PyString_Check(arg))
***************
*** 781,786 ****
  		{
  			if (*format == '#') { /* any buffer-like object */
! 			        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;
--- 811,816 ----
  		{
  			if (*format == '#') { /* any buffer-like object */
! 				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;
***************
*** 800,806 ****
  				format++;
  			} else {
! 			        Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
  			
! 			        if (PyUnicode_Check(arg))
  				    *p = PyUnicode_AS_UNICODE(arg);
  				else
--- 830,836 ----
  				format++;
  			} else {
! 				Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
  			
! 				if (PyUnicode_Check(arg))
  				    *p = PyUnicode_AS_UNICODE(arg);
  				else
***************
*** 851,855 ****
  					*p = arg;
  				else
! 				         return "(unspecified)";
  				
  			}
--- 881,885 ----
  					*p = arg;
  				else
! 					return "(unspecified)";
  				
  			}
***************
*** 1162,1166 ****
  			if (!match) {
  				sprintf(msgbuf,
! 		         "%s is an invalid keyword argument for this function",
  					ks);
  				PyErr_SetString(PyExc_TypeError, msgbuf);
--- 1192,1196 ----
  			if (!match) {
  				sprintf(msgbuf,
! 			"%s is an invalid keyword argument for this function",
  					ks);
  				PyErr_SetString(PyExc_TypeError, msgbuf);