]> git.ipfire.org Git - thirdparty/rsync.git/commitdiff
Read a 4-byte mtime as unsigned (old-protocol).
authorWayne Davison <wayne@opencoder.net>
Sat, 1 Oct 2022 15:23:47 +0000 (08:23 -0700)
committerWayne Davison <wayne@opencoder.net>
Sun, 2 Oct 2022 16:54:54 +0000 (09:54 -0700)
When conversing with a protocol 29 or earlier rsync, the modtime values
are arriving as 4-byte integers.  This change interprets these short
values as unsigned integers, allowing the time that can be conveyed to
range from 1-Jan-1970 to 7-Feb-2106 instead of the signed range of
13-Dec-1901 to 19-Jan-2038.  Given that we are fast approaching 2038,
any old-protocol transfers will be better served using the unsigned
range rather than the signed.

It is important to keep in mind that protocol 30 & 31 convey the full
8-byte mtime value (plus nanoseconds), allowing for a huge span of time
that is not affected by this change.

flist.c
io.c

diff --git a/flist.c b/flist.c
index 82d686a617963288150470d30495b41565633e9f..65b459b1712be7c88f5498b77b43a8955e70a817 100644 (file)
--- a/flist.c
+++ b/flist.c
@@ -836,7 +836,7 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x
                        }
 #endif
                } else
-                       modtime = read_int(f);
+                       modtime = read_uint(f);
        }
        if (xflags & XMIT_MOD_NSEC)
 #ifndef CAN_SET_NSEC
diff --git a/io.c b/io.c
index f3d802ecafaf87360471f1c38572561a7e4009c7..a99ac0ec5e4d35ff6bc64af616ae5c264d73838e 100644 (file)
--- a/io.c
+++ b/io.c
@@ -1784,6 +1784,13 @@ int32 read_int(int f)
        return num;
 }
 
+uint32 read_uint(int f)
+{
+       char b[4];
+       read_buf(f, b, 4);
+       return IVAL(b, 0);
+}
+
 int32 read_varint(int f)
 {
        union {