Make sure cmp_time() doesn't mess up due to a time_t overflow.
[rsync.git] / util.c
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>