summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--NEWS4
-rw-r--r--src/chmod.c7
-rwxr-xr-xtests/chmod/thru-dangling6
4 files changed, 23 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index c09128bb5..a8c606bf9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-09-07 Jim Meyering <jim@meyering.net>
+
+ chmod: don't ignore a dangling symlink
+ * NEWS: Mention the bug fix.
+ * src/chmod.c (process_file): Handle the case of FTS_SLNONE,
+ i.e., give a diagnostic saying we cannot operate on such a file.
+ * tests/chmod/thru-dangling: Compare new stderr output with expected.
+
2007-09-07 Bob Proulx <bob@proulx.com>
Add a test: demonstrate that chmod ignores a dangling symlink
diff --git a/NEWS b/NEWS
index 6a0f18d9a..93a632c5a 100644
--- a/NEWS
+++ b/NEWS
@@ -70,6 +70,10 @@ GNU coreutils NEWS -*- outline -*-
** Bug fixes
+ chmod no longer ignores a dangling symlink. Now, chmod fails
+ with a diagnostic saying that it cannot operate on such a file.
+ [bug introduced in coreutils-5.1.0]
+
cp attempts to read a regular file, even if stat says it is empty.
Before, "cp /proc/cpuinfo c" would create an empty file when the kernel
reports stat.st_size == 0, while "cat /proc/cpuinfo > c" would "work",
diff --git a/src/chmod.c b/src/chmod.c
index a67055420..a22e5c127 100644
--- a/src/chmod.c
+++ b/src/chmod.c
@@ -1,5 +1,5 @@
/* chmod -- change permission modes of files
- Copyright (C) 89, 90, 91, 1995-2006 Free Software Foundation, Inc.
+ Copyright (C) 89, 90, 91, 1995-2007 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -220,6 +220,11 @@ process_file (FTS *fts, FTSENT *ent)
ok = false;
break;
+ case FTS_SLNONE:
+ error (0, 0, _("cannot operate on dangling symlink %s"),
+ quote (file_full_name));
+ ok = false;
+
default:
break;
}
diff --git a/tests/chmod/thru-dangling b/tests/chmod/thru-dangling
index d972a8abf..7a82db83d 100755
--- a/tests/chmod/thru-dangling
+++ b/tests/chmod/thru-dangling
@@ -40,6 +40,10 @@ fi
fail=0
# This operation cannot succeed since the symbolic link dangles.
-chmod 644 dangle && fail=1
+chmod 644 dangle 2> out && fail=1
+
+echo "chmod: cannot operate on dangling symlink \`dangle'" > exp
+cmp out exp || fail=1
+test $fail = 1 && diff out exp 2> /dev/null
(exit $fail); exit $fail