GNU bug report logs -
#9634
Coreutils 8.13 - Orphaned symlinks start with 'argetm' when using dircolors
Previous Next
Full log
View this message in rfc822 format
Jason Glassey wrote:
> I had seen this was a bug supposed to be fixed in Coreutils 8.3, but I
> can still replicate this bug in
> Coreutils 8.13
>
> In my .bashrc file, I have this alias:
>
> alias ls='ls -Lp --color=auto --group-directories-first'
>
> Symlinks appear fine when the target exist, but when the symlink
> becomes orphaned (such as a
> symlink to a removable drive), the symlink starts with 'argetm'
>
> I only get this problem when I use the '--dereference' option, and
> when the target does not exist
> when using dircolors.
Thanks for the report.
Between yours and the one in http://bugs.debian.org/586765,
I was able to create a stand-alone reproducer.
The trick was to realize that you have customized your
LS_COLORS envvar to include ln=target.
Do this in an empty directory:
$ ln -s /no-such dangle
$ env LS_COLORS=ln=target ls --dereference --color
ls: cannot access dangle: No such file or directory
argetmdangle
While looking at that, I noticed two minor problems, fixed by this.
Pádraig, I expect to push this before your fix. It looks like it
will be easy for you to adjust your patch accordingly.
From 4f38e9f24971762540da9d5457dfa9e5e03d53ee Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering <at> redhat.com>
Date: Fri, 30 Sep 2011 20:13:01 +0200
Subject: [PATCH] ls: avoid reading beyond end of color indicator
At first this looked like a buffer overrun, since there was no test
to ensure that the buffer length was 6. However, since the LS_COLORS
string is NUL-terminated and since settings within it are separated by
":" there was neither the risk of reading beyond end of buffer nor risk
of a false-positive match.
* src/ls.c (print_color_indicator): Use color_symlink_as_referent
rather than manually comparing against "target" again.
* src/system.h (STRNCMP_LIT): Correct description in comment.
---
src/ls.c | 2 +-
src/system.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/ls.c b/src/ls.c
index 680a7c3..c1b1918 100644
--- a/src/ls.c
+++ b/src/ls.c
@@ -4204,7 +4204,7 @@ print_color_indicator (const struct fileinfo *f, bool symlink_target)
}
else if (S_ISLNK (mode))
type = ((!linkok
- && (!STRNCMP_LIT (color_indicator[C_LINK].string, "target")
+ && (color_symlink_as_referent
|| color_indicator[C_ORPHAN].string))
? C_ORPHAN : C_LINK);
else if (S_ISFIFO (mode))
diff --git a/src/system.h b/src/system.h
index 107dbd5..ec64cd0 100644
--- a/src/system.h
+++ b/src/system.h
@@ -188,7 +188,7 @@ select_plural (uintmax_t n)
#define STREQ_LEN(a, b, n) (strncmp (a, b, n) == 0)
#define STRPREFIX(a, b) (strncmp(a, b, strlen (b)) == 0)
-/* Just like strncmp, but the first argument must be a literal string
+/* Just like strncmp, but the second argument must be a literal string
and you don't specify the length. */
#define STRNCMP_LIT(s, literal) \
strncmp (s, "" literal "", sizeof (literal) - 1)
--
1.7.7.rc0.362.g5a14
This bug report was last modified 13 years and 321 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.