Browse Source

Merge remote-tracking branch 'teor/bug19483-fix-v2'

Nick Mathewson 8 years ago
parent
commit
a31f55b16b
2 changed files with 27 additions and 4 deletions
  1. 10 4
      src/common/util.c
  2. 17 0
      src/test/test_util.c

+ 10 - 4
src/common/util.c

@@ -1451,11 +1451,14 @@ tv_udiff(const struct timeval *start, const struct timeval *end)
    * between 0 and TV_USEC_PER_SEC. */
   udiff = secdiff*1000000 + ((int64_t)end->tv_usec - (int64_t)start->tv_usec);
 
+  /* Some compilers are smart enough to work out this is a no-op on L64 */
+#if SIZEOF_LONG < 8
   if (udiff > (int64_t)LONG_MAX || udiff < (int64_t)LONG_MIN) {
     return LONG_MAX;
-  } else {
-    return (long)udiff;
   }
+#endif
+
+  return (long)udiff;
 }
 
 /** Return the number of milliseconds elapsed between *start and *end.
@@ -1507,11 +1510,14 @@ tv_mdiff(const struct timeval *start, const struct timeval *end)
       ((int64_t)end->tv_usec - (int64_t)start->tv_usec + 500 + 1000000) / 1000
       - 1000;
 
+  /* Some compilers are smart enough to work out this is a no-op on L64 */
+#if SIZEOF_LONG < 8
   if (mdiff > (int64_t)LONG_MAX || mdiff < (int64_t)LONG_MIN) {
     return LONG_MAX;
-  } else {
-    return (long)mdiff;
   }
+#endif
+
+  return (long)mdiff;
 }
 
 /**

+ 17 - 0
src/test/test_util.c

@@ -303,6 +303,23 @@ test_util_time(void *arg)
   tt_int_op(1005000L,OP_EQ, tv_udiff(&end, &start));
   tt_int_op(1005L,OP_EQ, tv_mdiff(&end, &start));
 
+  /* Negative tv_sec values, these will break on platforms where tv_sec is
+   * unsigned */
+
+  end.tv_sec = -10;
+
+  tt_int_op(-15005000L,OP_EQ, tv_udiff(&start, &end));
+  tt_int_op(-15005L,OP_EQ, tv_mdiff(&start, &end));
+  tt_int_op(15005000L,OP_EQ, tv_udiff(&end, &start));
+  tt_int_op(15005L,OP_EQ, tv_mdiff(&end, &start));
+
+  start.tv_sec = -100;
+
+  tt_int_op(89995000L,OP_EQ, tv_udiff(&start, &end));
+  tt_int_op(89995L,OP_EQ, tv_mdiff(&start, &end));
+  tt_int_op(-89995000L,OP_EQ, tv_udiff(&end, &start));
+  tt_int_op(-89995L,OP_EQ, tv_mdiff(&end, &start));
+
   /* Test that tv_usec values round away from zero when converted to msec */
   start.tv_sec = 0;
   start.tv_usec = 0;