Eric Blake <ebb9 <at> byu.net> writes: > It looks like this commit is the culprit: > http://git.sv.gnu.org/gitweb/?p=coreutils.git;a=commitdiff;h=0a74437 > > It looks like a true regression. The change was introduced because of this > thread: > http://lists.gnu.org/archive/html/bug-coreutils/2007-06/msg00004.html > http://lists.gnu.org/archive/html/bug-coreutils/2007-07/msg00079.html > > It looks like when -l is NOT in effect, you should not stat the result of a > symlink. But when -l IS in effect, and C_EXEC is enabled, then the result of > stat'ing the symling IS used, in order to color the symlink target differently > than the color of the symlink. >
And I believe this patch fixes things. I don't know if Corinna wants to be mentioned in THANKS (she's been generally reluctant to expose her email address on the cygwin lists); hence the obfuscated address in the log message for now. >From ff17266b281a93adafd9ac2484d9836e8d1c97a1 Mon Sep 17 00:00:00 2001 From: Eric Blake <[EMAIL PROTECTED]> Date: Mon, 14 Apr 2008 11:14:00 -0600 Subject: [PATCH] Fix ls -l coloring regression from 2007-07-15. * src/ls.c (main): Stat symlinks for long format if the target might need to be colored as an executable. * tests/ls/stat-free-symlinks (LS_COLORS): Enhance test. * NEWS: Mention the fix. Reported by Corinna Vinschen <corinna-cygwin AT cygwin DOT com>. Signed-off-by: Eric Blake <[EMAIL PROTECTED]> --- NEWS | 3 +++ src/ls.c | 3 ++- tests/ls/stat-free-symlinks | 21 +++++++++++++++++++-- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index e208b30..e86503e 100644 --- a/NEWS +++ b/NEWS @@ -20,6 +20,9 @@ GNU coreutils NEWS -*- outline -*- ls no longer segfaults on files in /proc when linked with an older version of libselinux. E.g., ls -l /proc/sys would dereference a NULL pointer. + ls -l --color would mistakenly fail to color the target of a symlink. + [introduced in coreutils-6.9] + "mkdir -Z x dir" no longer segfaults when diagnosing invalid context "x" mkfifo and mknod would fail similarly. Now they're fixed. diff --git a/src/ls.c b/src/ls.c index e029fe0..d474ecc 100644 --- a/src/ls.c +++ b/src/ls.c @@ -1177,7 +1177,8 @@ main (int argc, char **argv) { /* Avoid following symbolic links when possible. */ if (is_colored (C_ORPHAN) - || (is_colored (C_EXEC) && color_symlink_as_referent) + || (is_colored (C_EXEC) + && (color_symlink_as_referent || format == long_format)) || (is_colored (C_MISSING) && format == long_format)) check_symlink_color = true; diff --git a/tests/ls/stat-free-symlinks b/tests/ls/stat-free-symlinks index 07fb38e..f419410 100755 --- a/tests/ls/stat-free-symlinks +++ b/tests/ls/stat-free-symlinks @@ -32,8 +32,8 @@ fail=0 # ls from coreutils 6.9 would unnecessarily stat a symlink in an unusual case: # When not coloring orphan and missing entries, and without ln=target, -# ensure that ls -F (or -d, or -l: i.e., when not dereferencing) -# does not stat a symlink to directory, and does still color that +# ensure that ls -F (or -d: i.e., when not dereferencing) +# does not stat a symlink, and does still color that # symlink and an executable file properly. LS_COLORS='or=0:mi=0:ex=01;32:ln=01;35' \ @@ -52,4 +52,21 @@ grep '^stat("x"' err && fail=1 compare out exp || fail=1 +# ls from coreutils 6.10 would mistakenly not stat a symlink in a counter +# case: When coloring executable files and without ln=target, ensure that +# ls -l correctly colors both halves of the link listing. + +LS_COLORS='or=0:mi=0:ex=01;32:ln=01;35' \ + ls -l --color=always link-to-x > out 2> err || fail=1 + +# Check that output is colorized as requested. +{ + ls -l link-to-x | sed 's/link-to-x -> x//' | tr -d '\n' + printf '\033[0m\033[01;35mlink-to-x\033[0m -> \033[01;32mx\033[0m\n' + printf '\033[m' +} > exp 2> err || fail=1 + +test -s err || fail=1 +compare out exp || fail=1 + (exit $fail); exit $fail -- 1.5.5 _______________________________________________ Bug-coreutils mailing list Bug-coreutils@gnu.org http://lists.gnu.org/mailman/listinfo/bug-coreutils