]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
cp: fix some cases with infinite recursion
authorKyle Evans <kevans@FreeBSD.org>
Thu, 27 Jan 2022 18:02:17 +0000 (12:02 -0600)
committerKyle Evans <kevans@FreeBSD.org>
Thu, 27 Jan 2022 18:02:17 +0000 (12:02 -0600)
commit848263aad129c8f9de75b58a5ab9a010611b75ac
tree96fa9728ac3e177b72e873a5a60026df192c5ede
parent6abb5043a67acb8604f600ef7620bea61dde249f
cp: fix some cases with infinite recursion

As noted in the PR, cp -R has some surprising behavior.  Typically, when
you `cp -R foo bar` where both foo and bar exist, foo is cleanly copied
to foo/bar.  When you `cp -R foo foo` (where foo clearly exists), cp(1)
goes a little off the rails as it creates foo/foo, then discovers that
and creates foo/foo/foo, so on and so forth, until it eventually fails.

POSIX doesn't seem to disallow this behavior, but it isn't very useful.
GNU cp(1) will detect the recursion and squash it, but emit a message in
the process that it has done so.

This change seemingly follows the GNU behavior, but it currently doesn't
warn about the situation -- the author feels that the final product is
about what one might expect from doing this and thus, doesn't need a
warning.  The author doesn't feel strongly about this.

PR: 235438
Reviewed by: bapt
Sponsored by: Klara, Inc.
Differential Revision: https://reviews.freebsd.org/D33944
bin/cp/cp.c
bin/cp/tests/cp_test.sh