]> granicus.if.org Git - python/commitdiff
Move assertion inside _PyTime_ObjectToTimeval()
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 1 Sep 2015 22:50:43 +0000 (00:50 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 1 Sep 2015 22:50:43 +0000 (00:50 +0200)
Change also _PyTime_FromSeconds() assertion to ensure that the _PyTime_t type
is used.

Modules/_datetimemodule.c
Python/pytime.c

index 7e4be5baac94dfc0f1ba5b81b152cbeb2faefc36..5cff3f8ffc1a853682635cb17d5a3b315de5aec5 100644 (file)
@@ -4100,7 +4100,6 @@ datetime_from_timestamp(PyObject *cls, TM_FUNC f, PyObject *timestamp,
     if (_PyTime_ObjectToTimeval(timestamp,
                                 &timet, &us, _PyTime_ROUND_FLOOR) == -1)
         return NULL;
-    assert(0 <= us && us <= 999999);
 
     return datetime_from_timet_and_us(cls, f, timet, (int)us, tzinfo);
 }
index 17ef197225697c971871364905fb3dc50c6fd494..fcac68a389c3e4a523a511f00d69cca5736c3502 100644 (file)
@@ -101,7 +101,8 @@ static int
 _PyTime_ObjectToDenominator(PyObject *obj, time_t *sec, long *numerator,
                             double denominator, _PyTime_round_t round)
 {
-    assert(denominator <= LONG_MAX);
+    assert(denominator <= (double)LONG_MAX);
+
     if (PyFloat_Check(obj)) {
         double d = PyFloat_AsDouble(obj);
         return _PyTime_DoubleToDenominator(d, sec, numerator,
@@ -149,14 +150,20 @@ int
 _PyTime_ObjectToTimespec(PyObject *obj, time_t *sec, long *nsec,
                          _PyTime_round_t round)
 {
-    return _PyTime_ObjectToDenominator(obj, sec, nsec, 1e9, round);
+    int res;
+    res = _PyTime_ObjectToDenominator(obj, sec, nsec, 1e9, round);
+    assert(0 <= *nsec && *nsec < SEC_TO_NS );
+    return res;
 }
 
 int
 _PyTime_ObjectToTimeval(PyObject *obj, time_t *sec, long *usec,
                         _PyTime_round_t round)
 {
-    return _PyTime_ObjectToDenominator(obj, sec, usec, 1e6, round);
+    int res;
+    res = _PyTime_ObjectToDenominator(obj, sec, usec, 1e6, round);
+    assert(0 <= *usec && *usec < SEC_TO_US );
+    return res;
 }
 
 static void
@@ -170,12 +177,13 @@ _PyTime_t
 _PyTime_FromSeconds(int seconds)
 {
     _PyTime_t t;
+    t = (_PyTime_t)seconds;
     /* ensure that integer overflow cannot happen, int type should have 32
        bits, whereas _PyTime_t type has at least 64 bits (SEC_TO_MS takes 30
        bits). */
-    assert((seconds >= 0 && seconds <= _PyTime_MAX / SEC_TO_NS)
-           || (seconds < 0 && seconds >= _PyTime_MIN / SEC_TO_NS));
-    t = (_PyTime_t)seconds * SEC_TO_NS;
+    assert((t >= 0 && t <= _PyTime_MAX / SEC_TO_NS)
+           || (t < 0 && t >= _PyTime_MIN / SEC_TO_NS));
+    t *= SEC_TO_NS;
     return t;
 }