summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2019-06-27 19:16:20 -0400
committerTavian Barnes <tavianator@tavianator.com>2019-06-27 19:16:44 -0400
commit86da865d82a977c4db084327274912d228f2e9f5 (patch)
tree594796764ecf3469558906345642ab68fdd26db9
parent257a7060906a25e299e63a367272251a8dc05b83 (diff)
downloadbfs-86da865d82a977c4db084327274912d228f2e9f5.tar.xz
color: Fix a crash if LS_COLORS ends in *
-rw-r--r--color.c15
-rwxr-xr-xtests.sh6
-rw-r--r--tests/test_color_star.out20
3 files changed, 36 insertions, 5 deletions
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