summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2011-09-30 20:13:01 +0200
committerJim Meyering <meyering@redhat.com>2011-09-30 22:03:47 +0200
commit4f38e9f24971762540da9d5457dfa9e5e03d53ee (patch)
treed32acd375a120adfedef0573167a4bcaa8c337b7
parentbec8920923fc3505606b92e4cf732afa714c63c5 (diff)
downloadcoreutils-4f38e9f24971762540da9d5457dfa9e5e03d53ee.tar.xz
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.
-rw-r--r--src/ls.c2
-rw-r--r--src/system.h2
2 files changed, 2 insertions, 2 deletions
diff --git a/src/ls.c b/src/ls.c
index 680a7c315..c1b19188c 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 107dbd5a6..ec64cd0d8 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)