From 8dfe8fe87e7c0d760b12cfc461b5f19248799225 Mon Sep 17 00:00:00 2001 From: Sami Kerola Date: Sat, 2 Apr 2016 16:58:14 +0100 Subject: [PATCH] colcrt: avoid the command getting hung [afl] Some inputs make getwc(3) not to progress file descriptor and neither to report EILSEQ. Detect such situation and skip the bad input. Signed-off-by: Sami Kerola --- tests/colcrt | Bin 0 -> 14720 bytes tests/expected/colcrt/regressions-hang1 | 3 +++ tests/ts/colcrt/hang1 | 1 + tests/ts/colcrt/regressions | 3 ++- text-utils/colcrt.c | 7 +++++++ 5 files changed, 13 insertions(+), 1 deletion(-) create mode 100755 tests/colcrt create mode 100644 tests/expected/colcrt/regressions-hang1 create mode 100644 tests/ts/colcrt/hang1 diff --git a/tests/colcrt b/tests/colcrt new file mode 100755 index 0000000000000000000000000000000000000000..d8c792bcae3fb52d48c2ad8cfe65af0838c02a10 GIT binary patch literal 14720 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 UW$|A#1FxGwzme+C`G)xWe{L<>_5c6? literal 0 Hc-jL100001 diff --git a/tests/expected/colcrt/regressions-hang1 b/tests/expected/colcrt/regressions-hang1 new file mode 100644 index 0000000000..cb16e46a34 --- /dev/null +++ b/tests/expected/colcrt/regressions-hang1 @@ -0,0 +1,3 @@ +789:;<=>=>?IABUVNXYZ[ `abcdefgg !"#$%&'()*+,-./01234)*:,-./0123456789:;[=>?1234)*:,-./0123456789:;[=>?4456789:;<=>?IABUVN`abcdefg !" + - +return value: 0 diff --git a/tests/ts/colcrt/hang1 b/tests/ts/colcrt/hang1 new file mode 100644 index 0000000000..d26259e993 --- /dev/null +++ b/tests/ts/colcrt/hang1 @@ -0,0 +1 @@ +789:;<=>=>?IABUVNXYZ[_`abcdefgg !"#$%&'()*+,-./01234)*:,-./0123456789:;[=>?1234)*:,-./0123456789:;[=>?4456789:;<=>?IABUVN`abcdefg !" $%&'()*+,-./0123z{|ΓΌ~e \ No newline at end of file diff --git a/tests/ts/colcrt/regressions b/tests/ts/colcrt/regressions index 067523f089..2ab751c36d 100755 --- a/tests/ts/colcrt/regressions +++ b/tests/ts/colcrt/regressions @@ -23,12 +23,13 @@ ts_check_test_command "$TS_CMD_COLCRT" check_input_file() { ts_init_subtest ${1##*/} - $TS_CMD_COLCRT < $1 > $TS_OUTPUT 2>&1 + timeout 2 $TS_CMD_COLCRT < $1 > $TS_OUTPUT 2>&1 echo "return value: $?" >> $TS_OUTPUT ts_finalize_subtest } check_input_file "$TS_SELF/crash1" check_input_file "$TS_SELF/crash2" +check_input_file "$TS_SELF/hang1" ts_finalize diff --git a/text-utils/colcrt.c b/text-utils/colcrt.c index abe3a07683..62f84251a0 100644 --- a/text-utils/colcrt.c +++ b/text-utils/colcrt.c @@ -152,6 +152,7 @@ static void colcrt(struct colcrt_control *ctl) { int col; wint_t c; + long old_pos; ctl->print_nl = 1; if (ctl->half_lines) @@ -161,7 +162,13 @@ static void colcrt(struct colcrt_control *ctl) if (OUTPUT_COLS - 1 < col) { output_lines(ctl, col); errno = 0; + old_pos = ftell(ctl->f); while ((c = getwc(ctl->f)) != L'\n') { + long new_pos = ftell(ctl->f); + if (old_pos == new_pos) + fseek(ctl->f, 1, SEEK_CUR); + else + old_pos = new_pos; if (errno == 0 && c == WEOF) return; else -- 2.47.3