From: Wayne Davison Date: Mon, 16 Jun 2014 00:30:09 +0000 (-0700) Subject: Make sure cmp_time() doesn't mess up due to a time_t overflow. X-Git-Tag: v3.1.1~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aa4c6db04379322551e3b3ae5f84108f7564864f;p=thirdparty%2Frsync.git Make sure cmp_time() doesn't mess up due to a time_t overflow. Fixes bug 10643. --- 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