[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);
}