From 86da865d82a977c4db084327274912d228f2e9f5 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Thu, 27 Jun 2019 19:16:20 -0400 Subject: color: Fix a crash if LS_COLORS ends in * --- color.c | 15 ++++++++++----- tests.sh | 6 ++++++ tests/test_color_star.out | 20 ++++++++++++++++++++ 3 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 tests/test_color_star.out diff --git a/color.c b/color.c index 9806b52..c397050 100644 --- a/color.c +++ b/color.c @@ -222,9 +222,13 @@ static const char *get_ext_color(const struct colors *colors, const char *filena * The parsed chunk as a dstring. */ static char *unescape(const char *value, char end, const char **next) { + if (!value) { + goto fail; + } + char *str = dstralloc(0); if (!str) { - goto fail; + goto fail_str; } const char *i; @@ -301,7 +305,7 @@ static char *unescape(const char *value, char end, const char **next) { break; case '\0': - goto fail; + goto fail_str; default: c = *i; @@ -315,7 +319,7 @@ static char *unescape(const char *value, char end, const char **next) { c = '\177'; break; case '\0': - goto fail; + goto fail_str; default: // CTRL masks bits 6 and 7 c = *i & 0x1F; @@ -329,7 +333,7 @@ static char *unescape(const char *value, char end, const char **next) { } if (dstrapp(&str, c) != 0) { - goto fail; + goto fail_str; } } @@ -341,8 +345,9 @@ static char *unescape(const char *value, char end, const char **next) { return str; -fail: +fail_str: dstrfree(str); +fail: *next = NULL; return NULL; } diff --git a/tests.sh b/tests.sh index fd31036..32019a3 100755 --- a/tests.sh +++ b/tests.sh @@ -617,6 +617,7 @@ bfs_tests=( test_color_missing_colon test_color_no_stat test_color_L_no_stat + test_color_star test_execdir_plus @@ -2099,6 +2100,11 @@ function test_color_L_no_stat() { LS_COLORS="mh=0:ex=0:sg=0:su=0:st=0:ow=0:tw=0:*.txt=01:" bfs_diff -L rainbow -color } +function test_color_star() { + # Regression test: don't segfault on LS_COLORS="*" + LS_COLORS="*" bfs_diff rainbow -color +} + function test_deep() { closefrom 4 diff --git a/tests/test_color_star.out b/tests/test_color_star.out new file mode 100644 index 0000000..77fc8a8 --- /dev/null +++ b/tests/test_color_star.out @@ -0,0 +1,20 @@ +rainbow +rainbow/exec.sh +rainbow/socket +rainbow/broken +rainbow/chardev_link +rainbow/link.txt +rainbow/sticky_ow +rainbow/sgid +rainbow/pipe +rainbow/ow +rainbow/sugid +rainbow/suid +rainbow/sticky +rainbow/file.dat +rainbow/file.txt +rainbow/mh1 +rainbow/mh2 +rainbow/star.gz +rainbow/star.tar +rainbow/star.tar.gz -- cgit v1.2.3