1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-08-04 07:43:58 +02:00

rm: avoid bogus diagnostic for a slash-decorated symlink-to-dir

These commands would evoke an invalid diagnostic:
    $ mkdir d && ln -s d s && env rm -r s/
    rm: cannot remove 's': Too many levels of symbolic links
remove.c was stripping trailing slashes from "s/" before passing
the name to "rm".  But a trailing slash may change the semantics,
and thus should not be stripped.
* src/remove.c (rm_fts): Do not strip trailing slashes.
* tests/rm/v-slash.sh: Adapt to new expected output.
* gnulib: Update to latest, for an improved fts.c that merely
normalizes trailing slashes.
Reported by Paul Eggert in discussion of http://bugs.gnu.org/12339
This commit is contained in:
Jim Meyering
2012-09-04 14:40:11 +02:00
parent d5719921a8
commit 57dd06703c
4 changed files with 6 additions and 5 deletions
+4
View File
@@ -19,6 +19,10 @@ GNU coreutils NEWS -*- outline -*-
than ignoring the -d option and failing with an 'Is a directory' error.
[bug introduced in coreutils-8.19, with the addition of --dir (-d)]
rm -r S/ (where S is a symlink-to-directory) no longer gives the invalid
"Too many levels of symbolic links" diagnostic.
[bug introduced in coreutils-8.6]
** Improvements
stat and tail work better with ZFS. stat -f --format=%T now reports the
+1 -1
Submodule gnulib updated: 68f693ff1d...3a9002d3cc
-3
View File
@@ -433,9 +433,6 @@ rm_fts (FTS *fts, FTSENT *ent, struct rm_options const *x)
/* Perform checks that can apply only for command-line arguments. */
if (ent->fts_level == FTS_ROOTLEVEL)
{
if (strip_trailing_slashes (ent->fts_path))
ent->fts_pathlen = strlen (ent->fts_path);
/* If the basename of a command line argument is "." or "..",
diagnose it and do nothing more with that argument. */
if (dot_or_dotdot (last_component (ent->fts_accpath)))
+1 -1
View File
@@ -26,7 +26,7 @@ touch a/x || framework_failure_
rm --verbose -r a/// > out || fail=1
cat <<\EOF > exp || fail=1
removed 'a/x'
removed directory: 'a'
removed directory: 'a/'
EOF
compare exp out || fail=1