diff options
author | Wayne Davison <wayned@samba.org> | 2014-06-15 17:30:09 -0700 |
---|---|---|
committer | Wayne Davison <wayned@samba.org> | 2014-06-15 17:53:34 -0700 |
commit | aa4c6db04379322551e3b3ae5f84108f7564864f (patch) | |
tree | ee6ac15b5eeabe5d65ee03349e2abf9db8b03798 | |
parent | edb0d9c79205a5d8840719462cd69b98642cfbf2 (diff) | |
download | android_external_rsync-aa4c6db04379322551e3b3ae5f84108f7564864f.tar.gz android_external_rsync-aa4c6db04379322551e3b3ae5f84108f7564864f.tar.bz2 android_external_rsync-aa4c6db04379322551e3b3ae5f84108f7564864f.zip |
Make sure cmp_time() doesn't mess up due to a time_t overflow.
Fixes bug 10643.
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | util.c | 15 |
2 files changed, 11 insertions, 7 deletions
@@ -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). @@ -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> |