The branch, master has been updated via 77dd3047 Mention latest changes. via 25efa108 Complain if the destination arg is empty. via fdf5e577 Read a 4-byte mtime as unsigned (old-protocol). via 19bd0dd3 Use newer protocol to avoid mtime corruption. from ed4b3448 Preparing for release of 3.2.7pre1
https://git.samba.org/?p=rsync.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 77dd3047666fa68ce2acb88f4be0e5ebca83fb50 Author: Wayne Davison <wa...@opencoder.net> Date: Sun Oct 2 09:42:55 2022 -0700 Mention latest changes. commit 25efa10802dd416529d5dbaaac20a485db1f33b2 Author: Wayne Davison <wa...@opencoder.net> Date: Sun Oct 2 09:42:17 2022 -0700 Complain if the destination arg is empty. commit fdf5e577f59cf709eb3559137ce3be1431522d07 Author: Wayne Davison <wa...@opencoder.net> Date: Sat Oct 1 08:23:47 2022 -0700 Read a 4-byte mtime as unsigned (old-protocol). 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. commit 19bd0dd34022d0b8e2ae45f12029602f129c28c1 Author: Wayne Davison <wa...@opencoder.net> Date: Sat Oct 1 08:04:00 2022 -0700 Use newer protocol to avoid mtime corruption. ----------------------------------------------------------------------- Summary of changes: NEWS.md | 26 ++++++++++++++++++++------ flist.c | 2 +- io.c | 7 +++++++ main.c | 15 +++++++++++++-- rsync.1.md | 13 ++++++++++++- testsuite/exclude.test | 2 +- 6 files changed, 54 insertions(+), 11 deletions(-) Changeset truncated at 500 lines: diff --git a/NEWS.md b/NEWS.md index 3b49c2d4..a27d8081 100644 --- a/NEWS.md +++ b/NEWS.md @@ -25,8 +25,8 @@ - Added support for the SHA1 digest in file checksums. While this tends to be overkill, it is available if someone really needs it. This overly-long checksum is at the lowest priority in the normal checksum negotiation list. - See `--checksum-choice` (`--cc`) and the `RSYNC_CHECKSUM_LIST` environment - var for how to customize this. + See [`--checksum-choice`](rsync.1#opt) (`--cc`) and the `RSYNC_CHECKSUM_LIST` + environment var for how to customize this. - Improved the xattr hash table to use a 64-bit key without slowing down the key's computation. This should make extra sure that a collision doesn't @@ -42,15 +42,29 @@ converted. Newer rsync versions will provide more complete json info than older rsync versions. -- The [`use chroot`](rsyncd.conf.5#use_chroot) daemon parameter now defaults to - "unset" so that rsync can use chroot when it works and a sanitized copy when - chroot is not supported (e.g., for a non-root daemon). Explicitly setting - the parameter to true or false (on or off) behaves the same way as before. +- The [`use chroot`](rsyncd.conf.5#) daemon parameter now defaults to "unset" + so that rsync can use chroot when it works and a sanitized copy when chroot + is not supported (e.g., for a non-root daemon). Explicitly setting the + parameter to true or false (on or off) behaves the same way as before. - The `--fuzzy` option was optimized a bit to try to cut down on the amount of computations when considering a big pool of files. The simple heuristic from Kenneth Finnegan resuled in about a 2x speedup. +- If rsync is forced to use protocol 29 or before (perhaps due to talking to an + rsync before 3.0.0), the modify time of a file is limited to 4-bytes. Rsync + now interprets this value as an unsigned integer so that a current year past + 2038 can continue to be represented. This does mean that years prior to 1970 + cannot be represented in an older protocol, but this trade-off seems like the + rigth choice given that (1) 2038 is very rapidly approaching, and (2) newer + protocols support a much wider range of old and new dates. + +- The rsync client now treats an empty destination arg as an error, just like + it does for an empty source arg. This doesn't affect a `host:` arg (which is + treated the same as `host:.`) since the arg is not completely empty. The use + of [`--old-args`](rsync.1#opt) (including via `RSYNC_OLD_ARGS`) allows the + prior behavior of treating an empty destination arg as a ".". + ### PACKAGING RELATED: - The checksum code now uses openssl's EVP methods, which gets rid of various diff --git a/flist.c b/flist.c index 82d686a6..65b459b1 100644 --- 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 f3d802ec..a99ac0ec 100644 --- 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 { diff --git a/main.c b/main.c index 02b70079..d2a7b9b5 100644 --- a/main.c +++ b/main.c @@ -660,6 +660,16 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in return pid; } +/* Older versions turn an empty string as a reference to the current directory. + * We now treat this as an error unless --old-args was used. */ +static char *dot_dir_or_error() +{ + if (old_style_args || am_server) + return "."; + rprintf(FERROR, "Empty destination arg specified (use \".\" or see --old-args).\n"); + exit_cleanup(RERR_SYNTAX); +} + /* The receiving side operates in one of two modes: * * 1. it receives any number of files into a destination directory, @@ -687,9 +697,8 @@ static char *get_local_name(struct file_list *flist, char *dest_path) if (!dest_path || list_only) return NULL; - /* Treat an empty string as a copy into the current directory. */ if (!*dest_path) - dest_path = "."; + dest_path = dot_dir_or_error(); if (daemon_filter_list.head) { char *slash = strrchr(dest_path, '/'); @@ -1432,6 +1441,8 @@ static int start_client(int argc, char *argv[]) if (argc > 1) { p = argv[--argc]; + if (!*p) + p = dot_dir_or_error(); remote_argv = argv + argc; } else { static char *dotarg[1] = { "." }; diff --git a/rsync.1.md b/rsync.1.md index 029e4d82..7d96eca6 100644 --- a/rsync.1.md +++ b/rsync.1.md @@ -859,7 +859,7 @@ expand it. that until a bunch of recursive copying has finished). However, these early directories don't yet have their completed mode, mtime, or ownership set -- they have more restrictive rights until the subdirectory's copying - actually begins. This early-creation idiom can be avoiding by using the + actually begins. This early-creation idiom can be avoided by using the [`--omit-dir-times`](#opt) option. Incremental recursion can be disabled using the @@ -1560,6 +1560,15 @@ expand it. will make the update fairly efficient if the files haven't actually changed, you're much better off using `-t`). + A modern rsync that is using transfer protocol 30 or 31 conveys a modify + time using up to 8-bytes. If rsync is forced to speak an older protocol + (perhaps due to the remote rsync being older than 3.0.0) a modify time is + conveyed using 4-bytes. Prior to 3.2.7, these shorter values could convey + a date range of 13-Dec-1901 to 19-Jan-2038. Beginning with 3.2.7, these + 4-byte values now convey a date range of 1-Jan-1970 to 7-Feb-2106. If you + have files dated older than 1970, make sure your rsync executables are + upgraded so that the full range of dates can be conveyed. + 0. `--atimes`, `-U` This tells rsync to set the access (use) times of the destination files to @@ -2388,6 +2397,8 @@ expand it. This option tells rsync to stop trying to protect the arg values on the remote side from unintended word-splitting or other misinterpretation. + It also allows the client to treat an empty arg as a "." instead of + generating an error. The default in a modern rsync is for "shell-active" characters (including spaces) to be backslash-escaped in the args that are sent to the remote diff --git a/testsuite/exclude.test b/testsuite/exclude.test index 4b1a1a05..9b487b60 100644 --- a/testsuite/exclude.test +++ b/testsuite/exclude.test @@ -188,7 +188,7 @@ rm "$chkdir"/bar/down/to/foo/.filt2 rm "$chkdir"/bar/down/to/bar/.filt2 rm "$chkdir"/mid/.filt -$RSYNC -av --protocol=28 --existing --include='*/' --exclude='*' "$fromdir/" "$chkdir/" +$RSYNC -av --existing --include='*/' --exclude='*' "$fromdir/" "$chkdir/" # Now, try the prior command with --delete-before and some side-specific # rules. -- The rsync repository. _______________________________________________ rsync-cvs mailing list rsync-cvs@lists.samba.org https://lists.samba.org/mailman/listinfo/rsync-cvs