Make sure cmp_time() doesn't mess up due to a time_t overflow.
authorWayne Davison <wayned@samba.org>
Mon, 16 Jun 2014 00:30:09 +0000 (17:30 -0700)
committerWayne Davison <wayned@samba.org>
Mon, 16 Jun 2014 00:53:34 +0000 (17:53 -0700)
Fixes bug 10643.

NEWS
util.c

diff --git a/NEWS b/NEWS
index 9ad8306826179c56ac2d77f1850fa5a4bad00a71..a65b3bb3cab66004d521839c9ed05b0d4c1e76fe 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -104,6 +104,9 @@ Changes since 3.1.0:
       inc-recursive copy that is preserving directory times. e.g. using
       --omit-dir-times will avoid these early directories being created.
 
+    - Fix a bug in cmp_time() that would return a wrong result if the 2 times
+      differed by an amount greater than what a time_t can hold.
+
   DEVELOPER RELATED:
 
     - We now include an example systemd file (in packaging/systemd).
diff --git a/util.c b/util.c
index bd537ae9bfa6d2151422a42ee72520b99da294b9..05aa86a0652a7d59e97601dada196446c7bc5cde 100644 (file)
--- a/util.c
+++ b/util.c
@@ -1325,16 +1325,17 @@ char *timestring(time_t t)
 int cmp_time(time_t file1, time_t file2)
 {
        if (file2 > file1) {
-               if (file2 - file1 <= modify_window)
-                       return 0;
-               return -1;
+               /* The final comparison makes sure that modify_window doesn't overflow a
+                * time_t, which would mean that file2 must be in the equality window. */
+               if (!modify_window || (file2 > file1 + modify_window && file1 + modify_window > file1))
+                       return -1;
+       } else if (file1 > file2) {
+               if (!modify_window || (file1 > file2 + modify_window && file2 + modify_window > file2))
+                       return 1;
        }
-       if (file1 - file2 <= modify_window)
-               return 0;
-       return 1;
+       return 0;
 }
 
-
 #ifdef __INSURE__XX
 #include <dlfcn.h>