[Python-checkins] python/nondist/sandbox/datetime obj_delta.c,1.6,1.7

tim_one@users.sourceforge.net tim_one@users.sourceforge.net
Mon, 25 Nov 2002 21:37:11 -0800


Update of /cvsroot/python/python/nondist/sandbox/datetime
In directory sc8-pr-cvs1:/tmp/cvs-serv32615

Modified Files:
	obj_delta.c 
Log Message:
delta_add:  Catch C long+long overflow (it's certainly possible, and
can't be ignored).


Index: obj_delta.c
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/datetime/obj_delta.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** obj_delta.c	26 Nov 2002 05:11:25 -0000	1.6
--- obj_delta.c	26 Nov 2002 05:37:09 -0000	1.7
***************
*** 19,29 ****
  		if (PyType_IsSubtype(right_type, &PyDateTime_DeltaType)) {
  			/* delta + delta */
! 			/* XXX Overflow checking is needed here. */
! 			const long days = GET_TD_DAYS(delta) +
! 					  GET_TD_DAYS(right);
  			const long seconds = GET_TD_SECONDS(delta) +
  					     GET_TD_SECONDS(right);
  			const long microseconds = GET_TD_MICROSECONDS(delta) +
  						  GET_TD_MICROSECONDS(right);
  			return new_delta(days, seconds, microseconds);
  		}
--- 19,38 ----
  		if (PyType_IsSubtype(right_type, &PyDateTime_DeltaType)) {
  			/* delta + delta */
! 			/* seconds and microseconds can't overflow, due to
! 			 * the invariant bounds on them.
! 			 */
  			const long seconds = GET_TD_SECONDS(delta) +
  					     GET_TD_SECONDS(right);
  			const long microseconds = GET_TD_MICROSECONDS(delta) +
  						  GET_TD_MICROSECONDS(right);
+ 			/* But days can overflow. */
+ 			const long days1 = GET_TD_DAYS(delta);
+ 			const long days2 = GET_TD_DAYS(right);
+ 			const long days = days1 + days2;
+ 			if (SIGNED_ADD_OVERFLOWED(days, days1, days2)) {
+ 				PyErr_SetString(PyExc_OverflowError,
+ 						"timedelta addition");
+ 				return NULL;
+ 			}
  			return new_delta(days, seconds, microseconds);
  		}