# NEWS for rsync 3.2.7 (20 Oct 2022)

## Changes in this version:

### BUG FIXES:

- Fixed the client-side validating of the remote sender's filtering behavior.

- More fixes for the "unrequested file-list name" name, including a copy of
  "/" with `--relative` enabled and a copy with a lot of related paths with
  `--relative` enabled (often derived from a `--files-from` list).

- When rsync gets an unpack error on an ACL, mention the filename.

- Avoid over-setting sanitize_paths when a daemon is serving "/" (even if
  "use chroot" is false).

### ENHANCEMENTS:

- Added negotiated daemon-auth support that allows a stronger checksum digest
  to be used to validate a user's login to the daemon.  Added SHA512, SHA256,
  and SHA1 digests to MD5 & MD4.  These new digests are at the highest priority
  in the new daemon-auth negotiation list.

- 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`](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 hash collision doesn't
  happen.

- If the `--version` option is repeated (e.g. `-VV`) then the information is
  output in a (still readable) JSON format.  Client side only.

- The script `support/json-rsync-version` is available to get the JSON style
  version output from any rsync.  The script accepts either text on stdin
  **or** an arg that specifies an rsync executable to run with a doubled
  `--version` option.  If the text we get isn't already in JSON format, it is
  converted. Newer rsync versions will provide more complete json info than
  older rsync versions. Various tweaks are made to keep the flag names
  consistent across versions.

- 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
  right 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
  deprecation warnings and makes it easy to support more digest methods.  On
  newer systems, the MD4 digest is marked as legacy in the openssl code, which
  makes openssl refuse to support it via EVP.  You can choose to ignore this
  and allow rsync's MD4 code to be used for older rsync connections (when
  talking to an rsync prior to 3.0.0) or you can choose to configure rsync to
  tell openssl to enable legacy algorithms (see below).

- A simple openssl config file is supplied that can be installed for rsync to
  use.  If you install packaging/openssl-rsync.cnf to a public spot (such as
  `/etc/ssl/openssl-rsync.cnf`) and then run configure with the option
  `--with-openssl-conf=/path/name.cnf`, this will cause rsync to export the
  configured path in the OPENSSL_CONF environment variable (when the variable
  is not already set).  This will enable openssl's MD4 code for rsync to use.

- The packager may wish to include an explicit "use chroot = true" in the top
  section of their supplied /etc/rsyncd.conf file if the daemon is being
  installed to run as the root user (though rsync should behave the same even
  with the value unset, a little extra paranoia doesn't hurt).

- I've noticed that some packagers haven't installed support/nameconvert for
  users to use in their chrooted rsync configs.  Even if it is not installed
  as an executable script (to avoid a python3 dependency) it would be good to
  install it with the other rsync-related support scripts.

- It would be good to add support/json-rsync-version to the list of installed
  support scripts.

------------------------------------------------------------------------------

# NEWS for rsync 3.2.6 (9 Sep 2022)

## Changes in this version:

### BUG FIXES:

- More path-cleaning improvements in the file-list validation code to avoid
  rejecting of valid args.

- A file-list validation fix for a [`--files-from`](rsync.1#opt) file that ends
  without a line-terminating character.

- Added a safety check that prevents the sender from removing destination files
  when a local copy using [`--remove-source-files`](rsync.1#opt) has some files
  that are shared between the sending & receiving hierarchies, including the
  case where the source dir & destination dir are identical.

- Fixed a bug in the internal MD4 checksum code that could cause the digest
  to be sporadically incorrect (the openssl version was/is fine).

- A minor tweak to rrsync added "copy-devices" to the list of known args, but
  left it disabled by default.

### ENHANCEMENTS:

- Rename `--protect-args` to [`--secluded-args`](rsync.1#opt) to make it
  clearer how it differs from the default backslash-escaped arg-protecting
  behavior of rsync.  The old option names are still accepted.  The
  environment-variable override did not change its name.

### PACKAGING RELATED:

- The configure option `--with-protected-args` was renamed to
  `--with-secluded-args`.  This option makes `--secluded-args` the default
  rsync behavior instead of using backslash escaping for protecting args.

- The mkgitver script now makes sure that a `.git` dir/file is in the top-level
  source dir before calling `git describe`. It also runs a basic check on the
  version value. This should avoid using an unrelated git description for
  rsync's version.

### DEVELOPER RELATED:

- The configure script no longer sets the -pedantic-errors CFLAG (which it
  used to try to do only for gcc).

- The name_num_obj struct was modified to allow its dynamic name_num_item list
  to be initialized in a better way.

------------------------------------------------------------------------------

# NEWS for rsync 3.2.5 (14 Aug 2022)

## Changes in this version:

### SECURITY FIXES:

- Added some file-list safety checking that helps to ensure that a rogue
  sending rsync can't add unrequested top-level names and/or include recursive
  names that should have been excluded by the sender.  These extra safety
  checks only require the receiver rsync to be updated.  When dealing with an
  untrusted sending host, it is safest to copy into a dedicated destination
  directory for the remote content (i.e. don't copy into a destination
  directory that contains files that aren't from the remote host unless you
  trust the remote host). Fixes CVE-2022-29154.

 - A fix for CVE-2022-37434 in the bundled zlib (buffer overflow issue).

### BUG FIXES:

- Fixed the handling of filenames specified with backslash-quoted wildcards
  when the default remote-arg-escaping is enabled.

- Fixed the configure check for signed char that was causing a host that
  defaults to unsigned characters to generate bogus rolling checksums. This
  made rsync send mostly literal data for a copy instead of finding matching
  data in the receiver's basis file (for a file that contains high-bit
  characters).

- Lots of manpage improvements, including an attempt to better describe how
  include/exclude filters work.

- If rsync is compiled with an xxhash 0.8 library and then moved to a system
  with a dynamically linked xxhash 0.7 library, we now detect this and disable
  the XX3 hashes (since these routines didn't stabilize until 0.8).

### ENHANCEMENTS:

- The [`--trust-sender`](rsync.1#opt) option was added as a way to bypass the
  extra file-list safety checking (should that be required).

### PACKAGING RELATED:

- A note to those wanting to patch older rsync versions: the changes in this
  release requires the quoted argument change from 3.2.4. Then, you'll want
  every single code change from 3.2.5 since there is no fluff in this release.

- The build date that goes into the manpages is now based on the developer's
  release date, not on the build's local-timezone interpretation of the date.

### DEVELOPER RELATED:

- Configure now defaults GETGROUPS_T to gid_t when cross compiling.

- Configure now looks for the bsd/string.h include file in order to fix the
  build on a host that has strlcpy() in the main libc but not defined in the
  main string.h file.

------------------------------------------------------------------------------

# NEWS for rsync 3.2.4 (15 Apr 2022)

## Changes in this version:

### BEHAVIOR CHANGES:

 - A new form of arg protection was added that works similarly to the older
   `--protect-args` ([`-s`](rsync.1#opt)) option but in a way that avoids
   breaking things like rrsync (the restricted rsync script): rsync now uses
   backslash escaping for sending "shell-active" characters to the remote
   shell. This includes spaces, so fetching a remote file via a simple quoted
   filename value now works by default without any extra quoting:

   ```shell
       rsync -aiv host:'a simple file.pdf' .
   ```

   Wildcards are not escaped in filename args, but they are escaped in options
   like the [`--suffix`](rsync.1#opt) and [`--usermap`](rsync.1#opt) values.
   If your rsync script depends on the old arg-splitting behavior, either run
   it with the [`--old-args`](rsync.1#opt) option or `export RSYNC_OLD_ARGS=1`
   in the script's environment.  See also the [ADVANCED USAGE](rsync.1#)
   section of rsync's manpage for how to use a more modern arg style.

 - A long-standing bug was preventing rsync from figuring out the current
   locale's decimal point character, which made rsync always output numbers
   using the "C" locale.  Since this is now fixed in 3.2.4, a script that
   parses rsync's decimal numbers (e.g. from the verbose footer) may want to
   setup the environment in a way that the output continues to be in the C
   locale.  For instance, one of the following should work fine:

   ```shell
       export LC_ALL=C.UTF-8
   ```

   or if iconv translations are needed:

   ```shell
       if [ "${LC_ALL:-}" ]; then
           export LANG="$LC_ALL"
           export LC_CTYPE="$LC_ALL"
           unset LC_ALL
       fi
       export LC_NUMERIC=C.UTF-8
   ```

### SECURITY FIXES:

 - A fix for CVE-2018-25032 in the bundled zlib (memory corruption issue).

### BUG FIXES:

 - Fixed a bug with [`--inplace`](rsync.1#opt) + [`--sparse`](rsync.1#opt) (and
   a lack of [`--whole-file`](rsync.1#opt)) where the destination file could
   get reconstructed with bogus data.  Since the bug can also be avoided by
   using (the seemingly redundant) [`--no-W`](rsync.1#opt) on the receiving
   side, the latest rsync will now send `--no-W` to a remote receiver when this
   option combination occurs.  If your client rsync is not new enough to do
   this for you (or if you're just paranoid), you can manually specify `--no-W
   -M--no-W` (when not using [`--whole-file`](rsync.1#opt)) to make sure the
   bug is avoided.

 - Fixed a bug with [`--mkpath`](rsync.1#opt) if a single-file copy specifies
   an existing destination dir with a non-existing destination filename.

 - Fixed `--update -vv` to output "is uptodate" instead of "is newer" messages
   for files that are being skipped due to an identical modify time.  (This was
   a new output quirk in 3.2.3.)

 - When doing an append transfer, the sending side's file must not get shorter
   or it is skipped. Fixes a crash that could occur when the size changes to 0
   in the middle of the send negotiations.

 - When dealing with special files (see [`--specials`](rsync.1#opt)) in an
   alt-dest hierarchy, rsync now checks the non-permission mode bits to ensure
   that the 2 special files are really the same before hard-linking them
   together.

 - Fixed a bug where [`--delay-updates`](rsync.1#opt) with stale partial data
   could cause a file to fail to update.

 - Fixed a few places that would output an INFO message with
   [`--info=NAME`](rsync.1#opt) that should only have been output given
   [`--verbose`](rsync.1#opt) or [`--itemize-changes`](rsync.1#opt).

 - Avoid a weird failure if you run a local copy with a (useless)
   [`--rsh`](rsync.1#opt) option that contains a `V` in the command.

 - Fixed a long-standing compression bug where the compression level of the
   first file transferred affected the level for all future files.  Also, the
   per-file compression skipping has apparently never worked, so it is now
   documented as being ineffective.

 - Fixed a truncate error when a `--write-devices` copy wrote a file onto a
   device that was shorter than the device.

 - Made `--write-devices` support both `--checksum` and `--no-whole-file` when
   copying to a device.

 - Improved how the [`--stop-at`](rsync.1#opt), [`--stop-after`](rsync.1#opt),
   and (the deprecated) [`--time-limit`](rsync.1#opt) options check to see if
   the allowed time is over, which should make rsync exit more consistently.

 - Tweak --progress to display "`??:??:??`" when the time-remaining value is so
   large as to be meaningless.

 - Silence some chmod warnings about symlinks when it looks like we have a
   function to set their permissions but they can't really be set.

 - Fixed a potential issue in git-set-file-times when handling commits with
   high-bit characters in the description & when handling a description that
   might mimic the git raw-commit deliniators.  (See the support dir.)

 - The bundled systemd/rsync.service file now includes `Restart=on-failure`.

### ENHANCEMENTS:

 - Use openssl's `-verify_hostname` option in the rsync-ssl script.

 - Added extra info to the "FILENAME exists" output of
   [`--ignore-existing`](rsync.1#opt) when [`--info=skip2`](rsync.1#opt) is
   used.  The skip message becomes "FILENAME exists (INFO)" where the INFO is
   one of "type change", "sum change" (requires [`--checksum`](rsync.1#opt)),
   "file change" (based on the quick check), "attr change", or "uptodate".
   Prior versions only supported `--info=skip1`.

 - Added the [`--fsync`](rsync.1#opt) option (promoted from the patches repo).

 - Added the [`--copy-devices`](rsync.1#opt) option.  Compared to the
   historical version from the rsync-patches repo, this version: properly
   handles `--checksum`; fixes a truncation bug when doing an `--inplace` copy
   onto a longer file; fixes several bugs in the `--itemize` output; and only
   the sending side needs the enhanced rsync for the copy to work.

 - Reduced memory usage for an incremental transfer that has a bunch of small
   directories.

 - The rsync daemon can now handle a client address with an implied "%scope"
   suffix.

 - Added support for [`--atimes`](rsync.1#opt) on macOS and fixed a bug where
   it wouldn't work without [`--times`](rsync.1#opt).

 - Rsync can now update the xattrs on a read-only file when your user can
   temporarily add user-write permission to the file. (It always worked for a
   root transfer.)

 - Rsync can now work around an [`--inplace`](rsync.1#opt) update of a file
   that is being refused due to the Linux fs.protected_regular sysctl setting.

 - When [`--chown`](rsync.1#opt), [`--usermap`](rsync.1#opt), or
   [`--groupmap`](rsync.1#opt) is specified, rsync now makes sure that the
   appropriate [`--owner`](rsync.1#opt) and/or [`--group`](rsync.1#opt) options
   are enabled.

 - Added the [`--info=NONREG`](rsync.1#opt) setting to control if rsync should
   warn about non-regular files in the transfer.  This is enabled by default
   (keeping the behavior the same as before), so specifying `--info=nonreg0`
   can be used to turn the warnings off.

 - An optional asm optimization for the rolling checksum from Shark64. Enable
   it with `./configure --enable-roll-asm`.

 - Using `--debug=FILTER` now outputs a caution message if a filter rule
   has trailing whitespace.

 - Transformed rrsync into a python script with improvements:
   - Security has been beefed up.
   - The known rsync options were updated to include recent additions.
   - Make rrsync reject [`--copy-links`](rsync.1#opt) (`-L`),
     [`--copy-dirlinks`](rsync.1#opt) (`-k`), &
     [`--keep-dirlinks`](rsync.1#opt) (`-K`) by default to make it harder to
     exploit any out-of-subdir symlinks.
   - A new rrsync option of [`-munge`](rrsync.1#opt) tells rrsync to always
     enable rsync's [`--munge-links`](rsync.1#opt) option on the server side.
   - A new rrsync option of [`-no-lock`](rrsync.1#opt) disables a new
     single-use locking idiom that is the default when [`-ro`](rrsync.1#opt) is
     not used (useful with [`-munge`](rrsync.1#opt)).
   - A new rrsync option of [`-no-del`](rrsync.1#opt) disables all `--remove*`
     and `--delete*` rsync options on the server side.
   - The log format has been tweaked slightly to add seconds to the timestamp
     and to output the command executed as a tuple (making the args clearer).
   - An rrsync.1 manpage was added (in the support dir with rrsync).

 - Added options to the lsh script to facilitate rrsync testing. (See the
   support dir.)

 - Transformed the atomic-rsync script into a python script and added the
   ability to ignore one or more non-zero exit codes.  By default, it now
   ignores code 24, the file-vanished exit code. (See the support dir.)

 - Transformed the munge-symlinks script into python. (See the support dir.)

 - Improved the rsync-no-vanished script to not join stdout & stderr together.
   (See the support dir.)

 - Work around a glibc bug where lchmod() breaks in a chroot w/o /proc mounted.

 - Try to support a client that sent a remote rsync a wacko stderr file handle
   (such as an older File::RsyncP perl library used by BackupPC).

 - Lots of manpage improvements, including better HTML versions.

### PACKAGING RELATED:

 - Give configure the `--with-rrsync` option if you want `make install` to
   install the (now python3) rrsync script and its new manpage.

 - If the rrsync script is installed, its package should be changed to depend
   on python3 and the (suggested but not mandatory) python3 braceexpand lib.

 - When creating a package from a non-release version (w/o a git checkout), the
   packager can elect to create git-version.h and define RSYNC_GITVER to the
   string they want `--version` to output.  (The file is still auto-generated
   using the output of `git describe` when building inside a non-shallow git
   checkout, though.)

 - Renamed configure's `--enable-simd` option to `--enable-roll-simd` and added
   the option `--enable-roll-asm` to use the new asm version of the code.  Both
   are x86_64/amd64 only.

 - Renamed configure's `--enable-asm` option to `--enable-md5-asm` to avoid
   confusion with the asm option for the rolling checksum.  It is also honored
   even when openssl crypto is in use.  This allows: normal MD4 & MD5, normal
   MD4 + asm MD5, openssl MD4 & MD5, or openssl MD4 + asm MD5 depending on the
   configure options selected.

 - Made SIMD & asm configure checks default to "no" on non-Linux hosts due to
   various reports of problems on NetBSD & macOS hosts.  These were also
   tweaked to allow enabling the feature on a host_cpu of amd64 (was only
   allowed on x86_64 before).

 - Fixed configure to not fail at the SIMD check when cross-compiling.

 - Improved the IPv6 determination in configure.

 - Compile the C files with `-pedantic-errors` (when possible) so that we will
   get warned if a static initialization overflows in the future (among other
   things).

 - When linking with an external zlib, rsync renames its `read_buf()` function
   to `read_buf_()` to avoid a symbol clash on an unpatched zlib.

 - Added a SECURITY.md file.

### DEVELOPER RELATED:

 - Made it easier to write rsync tests that diff the output while also checking
   the status code, and used the idiom to improve the existing tests. (See the
   `checkdiff` and `checkdiff2` idioms in the `testsuite/*.test` files.

 - The packaging scripts & related python lib got some minor enhancements.

### INTERNAL

 - Use setenv() instead of putenv() when it is available.

 - Improve the logic in compat.c so that we don't need to try to remember to
   sprinkle `!local_server` exceptions throughout the protocol logic.

 - One more C99 Flexible Array improvement (started in the last release) and
   make use of the C99 `%zd` format string when printing size_t values (when
   possible).

 - Use mallinfo2() instead of mallinfo(), when available.

------------------------------------------------------------------------------

# NEWS for rsync 3.2.3 (6 Aug 2020)

## Changes in this version:

### BUG FIXES:

 - Fixed a bug in the xattr code that was freeing the wrong object when trying
   to cleanup the xattr list.

 - Fixed a bug in the xattr code that was not leaving room for the "rsync."
   prefix in some instances where it needed to be added.

 - Restored the ability to use [`--bwlimit=0`](rsync.1#opt) to specify no
   bandwidth limit.  (It was accidentally broken in 3.2.2.)

 - Fixed a bug when combining [`--delete-missing-args`](rsync.1#opt) with
   [`--no-implied-dirs`](rsync.1#opt) & [`-R`](rsync.1#opt) where rsync might
   create the destination path of a missing arg.  The code also avoids some
   superfluous warnings for nested paths of removed args.

 - Fixed an issue where hard-linked devices could cause the rdev_major value to
   get out of sync between the sender and the receiver, which could cause a
   device to get created with the wrong major value in its major,minor pair.

 - Rsync now complains about a missing [`--temp-dir`](rsync.1#opt) before
   starting any file transfers.

 - A completely empty source arg is now a fatal error.  This doesn't change
   the handling of implied dot-dir args such as "localhost:" and such.

### ENHANCEMENTS:

 - Allow [`--max-alloc=0`](rsync.1#opt) to specify no limit to the alloc sanity
   check.

 - Allow [`--block-size=SIZE`](rsync.1#opt) to specify the size using units
   (e.g. "100K").

 - The name of the id-0 user & group are now sent to the receiver along with
   the other user/group names in the transfer (instead of assuming that both
   sides have the same id-0 names).

 - Added the [`--stop-after`](rsync.1#opt) and [`--stop-at`](rsync.1#opt)
   options (with a [`--time-limit`](rsync.1#opt) alias for `--stop-after`).
   This is an enhanced version of the time-limit patch from the patches repo.

 - Added the [`name converter`](rsyncd.conf.5#opt) daemon parameter to make it
   easier to convert user & group names inside a chrooted daemon module.  This
   is based on the nameconverter patch with some improvements, including a
   tweak to the request protocol (so if you used this patch in the past, be
   sure to update your converter script to use newlines instead of null chars).

 - Added [`--crtimes`](rsync.1#opt) (`-N`) option for preserving the file's
   create time (I believe that this is macOS only at the moment).

 - Added [`--mkpath`](rsync.1#opt) option to tell rsync that it should create a
   non-existing path component of the destination arg.

 - Added [`--stderr=errors|all|client`](rsync.1#opt) to replace the
   `--msgs2stderr` and `--no-msgs2stderr` options (which are still accepted).
   The default use of stderr was changed to be `--stderr=errors` where all the
   processes that have stderr available output directly to stderr, which should
   help error messages get to the user more quickly, especially when doing a
   push (which includes local copying).  This also allows rsync to exit quickly
   when a receiver failure occurs, since rsync doesn't need to try to keep the
   connection alive long enough for the fatal error to go from the receiver to
   the generator to the sender.  The old default can be requested via
   `--stderr=client`.  Also changed is that a non-default stderr mode is
   conveyed to the remote rsync (using the older option names) instead of
   requiring the user to use [`--remote-option`](rsync.1#opt) (`-M`) to tell
   the remote rsync what to do.

 - Added the ability to specify "@netgroup" names to the [`hosts
   allow`](rsyncd.conf.5#opt) and [`hosts deny`](rsyncd.conf.5#opt) daemon
   parameters.  This is a finalized version of the netgroup-auth patch from the
   patches repo.

 - Rsync can now hard-link symlinks on FreeBSD due to it making use of the
   linkat() function when it is available.

 - Output file+line info on out-of-memory & overflow errors while also avoiding
   the output of alternate build-dir path info that is not useful to the user.

 - Change configure to know that Cygwin supports Linux xattrs.

 - Improved the testsuite on FreeBSD & Cygwin.

 - Added some compatibility code for HPE NonStop platforms.

 - Improved the INSTALL.md info.

 - Added a few more suffixes to the default skip-compress list.

 - Improved configure's error handling to notify about several issues at once
   instead of one by one (for the newest optional features).

### INTERNAL:

 - Use a simpler overflow check idiom in a few spots.

 - Use a C99 Flexible Array for a trailing variable-size filename in a struct
   (with a fallback to the old 1-char string kluge for older compilers).

------------------------------------------------------------------------------

# NEWS for rsync 3.2.2 (4 Jul 2020)

## Changes in this version:

### BUG FIXES:

 - Avoid a crash when a daemon module enables `transfer logging` without
   setting a `log format` value.

 - Fixed installing rsync-ssl script from an alternate build dir.

 - Fixed the updating of configure.sh from an alternate build dir.

 - Apple requires the asm function name to begin with an underscore.

 - Avoid a test failure in the daemon test when `--atimes` is disabled.

### ENHANCEMENTS:

 - Allow the server side to restrict checksum & compression choices via the
   same environment variables the client uses.  The env vars can be divided
   into "client list & server list" by the "`&`" char or the same list can
   apply to both.

 - Simplify how the negotiation environment variables apply when interacting
   with an older rsync and also when a list contains only invalid names.

 - Do not allow a negotiated checksum or compression choice of "none" unless
   the user authorized it via an environment variable or command-line option.

 - Added the `--max-alloc=SIZE` option to be able to override the memory
   allocator's sanity-check limit.  It defaults to 1G (as before) but the error
   message when exceeding it specifically mentions the new option so that you
   can differentiate an out-of-memory error from a failure of this limit.  It
   also allows you to specify the value via the RSYNC_MAX_ALLOC environment
   variable.

 - Add the "open atime" daemon parameter to allow a daemon to always enable or
   disable the use of O_NOATIME (the default is to let the user control it).

 - The default systemd config was changed to remove the `ProtectHome=on`
   setting since rsync is often used to serve files in /home and /root and this
   seemed a bit too strict.  Feel free to use `systemctl edit rsync` to add
   that restriction (or maybe `ProtectHome=read-only`), if you like.  See the
   3.2.0 NEWS for the other restrictions that were added compared to 3.1.3.

 - The memory allocation functions now automatically check for a failure and
   die when out of memory.  This eliminated some caller-side check-and-die
   code and added some missing sanity-checking of allocations.

 - Put optimizations into their own list in the `--version` output.

 - Improved the manpage a bit more.

### PACKAGING RELATED:

 - Prepared the checksum code for an upcoming xxHash release that provides new
   XXH3 (64-bit) & XXH128 (128-bit) checksum routines.  These will not be
   compiled into rsync until the xxhash v0.8.0 include files are installed on
   the build host, and that release is a few weeks away at the time this was
   written.  So, if it's now the future and you have packaged and installed
   xxhash-0.8.0-devel, a fresh rebuild of rsync 3.2.2 will give you the new
   checksum routines.  Just make sure that the new rsync package depends on
   xxhash >= 0.8.0.

### DEVELOPER RELATED:

 - Moved the version number out of configure.ac into its own version.h file so
   that we don't need to reconfigure just because the version number changes.

 - Moved the daemon parameter list into daemon-parm.txt so that an awk script
   can create the interrelated structs and accessors that loadparm.c needs.

------------------------------------------------------------------------------

# NEWS for rsync 3.2.1 (22 Jun 2020)

## Changes in this version:

### BUG FIXES:

 - Fixed a potential build issue with the MD5 assembly-language code by
   removing some non-portable directives.

 - Use the preprocessor with the asm file to ensure that if the code is
   unneeded, it doesn't get built.

 - Avoid the stack getting set to executable when including the asm code.

 - Some improvements in the SIMD configure testing to try to avoid build
   issues, such as avoiding a clang++ core dump when `-g` is combined with
   `-O2`.  Note that clang++ is quite buggy in this area, and it does still
   crash for some folks, so just use `--disable-simd` if you need to avoid
   their buggy compiler (since the configure test is apparently not finding
   all the compilers that will to crash and burn).

 - Fixed an issue in the md2man script when building from an alternate dir.

 - Disable `--atimes` on macOS (it apparently just ignores the atime change).

### ENHANCEMENTS:

 - The use of `--backup-dir=STR` now implies `--backup`.

 - Added `--zl=NUM` as a short-hand for `--compress-level=NUM`.

 - Added `--early-input=FILE` option that allows the client to send some
   data to a daemon's (optional) "early exec" script on its stdin.

 - Mention atimes in the capabilities list that `--version` outputs.

 - Mention either "default protect-args" or "optional protect-args" in the
   `--version` capabilities depending on how rsync was configured.

 - Some info on optimizations is now elided from the `--version` capabilities
   since they aren't really user-facing capabilities.  You can still see the
   info (plus the status of a couple extra optimizations) by repeating the
   `--version` option (e.g. `-VV`).

 - Updated various URLs to be https instead of http.

 - Some documentation improvements.

### PACKAGING RELATED:

 - If you had to use `--disable-simd` for 3.2.0, you might want to try removing
   that and see if it will succeed or auto-disable.  Some buggy clang++
   compilers are still not auto disabled, though.

 - The MD5 asm code is now under its own configure flag (not shared with the
   SIMD setting), so if you have any issues compiling it, re-run configure with
   `--disable-asm`.

 - Merged the OLDNEWS.md file into NEWS.md.

------------------------------------------------------------------------------

# NEWS for rsync 3.2.0 (19 Jun 2020)

## Changes in this version:

### BUG FIXES:

 - Avoid a potential out-of-bounds read in daemon mode if argc can be made to
   become 0.

 - Fix the default list of skip-compress files for non-daemon transfers.

 - Fix xattr filter rules losing an 'x' attribute in a non-local transfer.

 - Avoid an error when a check for a potential fuzzy file happens to reference
   a directory.

 - Make the atomic-rsync helper script have a more consistent error-exit.

 - Make sure that a signal handler's use of exit_cleanup() calls `_exit()`
   instead of exit().

 - Various zlib fixes, including security fixes for CVE-2016-9843,
   CVE-2016-9842, CVE-2016-9841, and CVE-2016-9840.

 - Fixed an issue with `--remove-source-files` not removing a source symlink
   when combined with `--copy-links`.

 - Fixed a bug where the daemon would fail to write early fatal error messages
   to the client, such as refused or unknown command-line options.

 - Fixed the block-size validation logic when dealing with older protocols.

 - Some rrsync fixes and enhancements to handle the latest options.

 - Fixed a problem with the `--link-dest`|`--copy-dest` code when `--xattrs`
   was specified along with multiple alternate-destination directories (it
   could possibly choose a bad file match while trying to find a better xattr
   match).

 - Fixed a couple bugs in the handling of files with the `--sparse` option.

 - Fixed a bug in the writing of the batch.sh file (w/`--write-batch`) when the
   source & destination args were not last on the command-line.

 - Avoid a hang when an overabundance of messages clogs up all the I/O buffers.

 - Fixed a mismatch in the RSYNC_PID values put into the environment of
   `pre-xfer exec` and a `post-xfer exec`.

 - Fixed a crash in the `--iconv` code.

 - Fixed a rare crash in the popt_unalias() code.

### ENHANCEMENTS:

 - The default systemd config was made stricter by default.  For instance,
   `ProtectHome=on` (which hides content in /root and /home/USER dirs),
   `ProtectSystem=full` (which makes /usr, /boot, & /etc dirs read-only), and
   `PrivateDevices=on` (which hides devices).  You can override any of these
   using the standard `systemctl edit rsync` and add one or more directives
   under a `[Service]` heading (and restart the rsync service).

 - Various checksum enhancements, including the optional use of openssl's MD4 &
   MD5 checksum algorithms, some x86-64 optimizations for the rolling checksum,
   some x86-64 optimizations for the (non-openssl) MD5 checksum, the addition
   of xxHash checksum support, and a negotiation heuristic that ensures that it
   is easier to add new checksum algorithms in the future.  The environment
   variable `RSYNC_CHECKSUM_LIST` can be used to customize the preference order
   of the negotiation, or use `--checksum-choice` (`--cc`) to force a choice.

 - Various compression enhancements, including the addition of zstd and lz4
   compression algorithms and a negotiation heuristic that picks the best
   compression option supported by both sides.  The environment variable
   `RSYNC_COMPRESS_LIST` can be used to customize the preference order of the
   negotiation, or use `--compress-choice` (`--zc`) to force a choice.

 - Added a `--debug=NSTR` option that outputs details of the new negotiation
   strings (for checksums and compression).  The first level just outputs the
   result of each negotiation on the client, level 2 outputs the values of the
   strings that were sent to and received from the server, and level 3 outputs
   all those values on the server side too (when the server was given the debug
   option).

 - The `--debug=OPTS` command-line option is no longer auto-forwarded to the
   remote rsync which allows for the client and server to have different levels
   of debug specified. This also allows for newer debug options to be
   specified, such as using `--debug=NSTR` to see the negotiated hash result,
   without having the command fail if the server version is too old to handle
   that debug item. Use `-M--debug=OPTS` to send the options to the remote side.

 - Added the `--atimes` option based on the long-standing patch (just with some
   fixes that the patch has been needing).

 - Added `--open-noatime` option to open files using `O_NOATIME`.

 - Added the `--write-devices` option based on the long-standing patch.

 - Added openssl & preliminary gnutls support to the rsync-ssl script, which is
   now installed by default.  This was unified with the old stunnel-rsync
   helper script to simplify packaging.  Note that the script accepts the use
   of `--type=gnutls` for gnutls testing, but does not look for gnutls-cli on
   the path yet.  The use of `--type=gnutls` will not work right until
   gnutls-cli no longer drops data.

 - Rsync was enhanced to set the `RSYNC_PORT` environment variable when running
   a daemon-over-rsh script. Its value is the user-specified port number (set
   via `--port` or an rsync:// URL) or 0 if the user didn't override the port.

 - Added the `proxy protocol` daemon parameter that allows your rsyncd to know
   the real remote IP when it is setup behind a proxy.

 - Added negated matching to the daemon's `refuse options` setting by using
   match strings that start with a `!` (such as `!compress*`).  This lets you
   refuse all options except for a particular approved list, for example.  It
   also lets rsync refuse certain options by default (such as `write-devices`)
   while allowing the config to override that, as desired.

 - Added the `early exec` daemon parameter that runs a script before the
   transfer parameters are known, allowing some early setup based on module
   name.

 - Added status output in response to a signal (via both SIGINFO & SIGVTALRM).

 - Added `--copy-as=USER` option to give some extra security to root-run rsync
   commands into/from untrusted directories (such as backups and restores).

 - When resuming the transfer of a file in the `--partial-dir`, rsync will now
   update that partial file in-place instead of creating yet another tmp file
   copy.  This requires both sender & receiver to be at least v3.2.0.

 - Added support for `RSYNC_SHELL` & `RSYNC_NO_XFER_EXEC` environment variables
   that affect the early, pre-xfer, and post-xfer exec rsync daemon parameters.

 - Optimize the `--fuzzy --fuzzy` heuristic to avoid the fuzzy directory scan
   until all other basis-file options are exhausted (such as `--link-dest`).

 - Have the daemon log include the normal-exit sent/received stats when the
   transfer exited with an error when possible (i.e. if it is the sender).

 - The daemon now locks its pid file (when configured to use one) so that it
   will not fail to start when the file exists but no daemon is running.

 - Various manpage improvements, including some html representations (that
   aren't installed by default).

 - Made `-V` the short option for `--version` and improved its information.

 - Pass the `-4` or `-6` option to the ssh command, making it easier to type
   than `--rsh='ssh -4'` (or the `-6` equivalent).

 - Added example config for rsyncd SSL proxy configs to rsyncd.conf.

 - More errors messages now mention if the error is coming from the sender or
   the receiver.

### PACKAGING RELATED:

 - Add installed bash script: /usr/bin/rsync-ssl

 - Add installed manpage: /usr/man/man1/rsync-ssl.1

 - Tweak auxiliary doc file names, such as: README.md, INSTALL.md, & NEWS.md.

 - The rsync-ssl script wants to run openssl or stunnel4, so consider adding a
   dependency for one of those options (though it's probably fine to just let
   it complain about being unable to find the program and let the user decide
   if they want to install one or the other).

 - If you packaged rsync + rsync-ssl + rsync-ssl-daemon as separate packages,
   the rsync-ssl package is now gone (rsync-ssl should be considered to be
   mainstream now that Samba requires SSL for its rsync daemon).

 - Add _build_ dependency for liblz4-dev, libxxhash-dev, libzstd-dev, and
   libssl-dev.  These development libraries will give rsync extra compression
   algorithms, extra checksum algorithms, and allow use of openssl's crypto
   lib for (potentially) faster MD4/MD5 checksums.

 - Add _build_ dependency for g++ or clang++ on x86_64 systems to enable the
   SIMD checksum optimizations.

 - Add _build_ dependency for _either_ python3-cmarkcfm or python3-commonmark
   to allow for patching of manpages or building a git release.  This is not
   required for a release-tar build, since it comes with pre-built manpages.
   Note that cmarkcfm is faster than commonmark, but they generate the same
   data.  The commonmark dependency is easiest to install since it's native
   python, and can even be installed via `pip3 install --user commonmark` if
   you want to just install it for the build user.

 - Remove yodl _build_ dependency (if it was even listed before).

### DEVELOPER RELATED:

 - Silenced some annoying warnings about major() & minor() by improving an
   autoconf include-file check.

 - Converted the manpages from yodl to markdown. They are now processed via a
   simple python3 script using the cmarkgfm **or** commonmark library.  This
   should make it easier to package rsync, since yodl is rather obscure.

 - Improved some configure checks to work better with strict C99 compilers.

 - Some perl building/packaging scripts were recoded into awk and python3.

 - Some defines in byteorder.h were changed into static inline functions that
   will help to ensure that the args don't get evaluated multiple times on
   "careful alignment" hosts.

 - Some code typos were fixed (as pointed out by a Fossies run).

------------------------------------------------------------------------------

# NEWS for rsync 3.1.3 (28 Jan 2018)

## Changes in this version:

### SECURITY FIXES:

 - Fixed a buffer overrun in the protocol's handling of xattr names and ensure
   that the received name is null terminated.

 - Fix an issue with `--protect-args` where the user could specify the arg in the
   protected-arg list and short-circuit some of the arg-sanitizing code.

### BUG FIXES:

 - Don't output about a new backup dir without appropriate info verbosity.

 - Fixed some issues with the sort functions in the rsyncstats script (in the
   support dir).

 - Added a way to specify daemon config lists (e.g. users, groups, etc) that
   contain spaces (see `auth users` in the latest rsyncd.conf manpage).

 - If a backup fails (e.g. full disk) rsync exits with an error.

 - Fixed a problem with a doubled `--fuzzy` option combined with `--link-dest`.

 - Avoid invalid output in the summary if either the start or end time had an
   error.

 - We don't allow a popt alias to affect the `--daemon` or `--server` options.

 - Fix daemon exclude code to disallow attribute changes in addition to
   disallowing transfers.

 - Don't force nanoseconds to match if a non-transferred, non-checksummed file
   only passed the quick-check w/o comparing nanoseconds.

### ENHANCEMENTS:

 - Added the ability for rsync to compare nanosecond times in its file-check
   comparisons, and added support nanosecond times on Mac OS X.

 - Added a short-option (`-@`) for `--modify-window`.

 - Added the `--checksum-choice=NAME[,NAME]` option to choose the checksum
   algorithms.

 - Added hashing of xattr names (with using `-X`) to improve the handling of
   files with large numbers of xattrs.

 - Added a way to filter xattr names using include/exclude/filter rules (see
   the `--xattrs` option in the manpage for details).

 - Added `daemon chroot|uid|gid` to the daemon config (in addition to the old
   chroot|uid|gid settings that affect the daemon's transfer process).

 - Added `syslog tag` to the daemon configuration.

 - Some manpage improvements.

### DEVELOPER RELATED:

 - Tweak the `make` output when yodl isn't around to create the manpages.

 - Changed an obsolete autoconf compile macro.

 - Support newer yodl versions when converting manpages.

------------------------------------------------------------------------------
