summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2014-06-15 17:30:09 -0700
committerWayne Davison <wayned@samba.org>2014-06-15 17:53:34 -0700
commitaa4c6db04379322551e3b3ae5f84108f7564864f (patch)
treeee6ac15b5eeabe5d65ee03349e2abf9db8b03798
parentedb0d9c79205a5d8840719462cd69b98642cfbf2 (diff)
downloadrsync-aa4c6db04379322551e3b3ae5f84108f7564864f.tar.gz
Make sure cmp_time() doesn't mess up due to a time_t overflow.
Fixes bug 10643.
-rw-r--r--NEWS3
-rw-r--r--util.c15
2 files changed, 11 insertions, 7 deletions
diff --git a/NEWS b/NEWS
index 9ad83068..a65b3bb3 100644
--- 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 bd537ae9..05aa86a0 100644
--- 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>