From d1016568185ddacbf1148acbe26b27258981b4f0 Mon Sep 17 00:00:00 2001 From: Xin LI Date: Thu, 8 Jun 2023 18:38:47 -0700 Subject: [PATCH] hexdump: Partial lines cannot be repetitions of earlier lines. When checking for repetitions of earlier lines, we compare the first nread bytes of the line against the saved line. However, when we read a partial line, it should never be treated as a repetition of an earlier line, even if the first bytes match. This change fixes a bug where a partial line could be incorrectly identified as a repetition of an earlier line. Reported-by: Mark Adler PR: 118723 Reviewed-by: emaste MFC-after: 2 weeks Differential Revision: https://reviews.freebsd.org/D40471 --- usr.bin/hexdump/display.c | 2 +- usr.bin/hexdump/tests/Makefile | 3 +++ usr.bin/hexdump/tests/d_hexdump_UCflag_bug118723.out | 4 ++++ usr.bin/hexdump/tests/d_hexdump_UCvflag_bug118723.out | 4 ++++ usr.bin/hexdump/tests/d_hexdump_bug118723.in | 5 +++++ usr.bin/hexdump/tests/hexdump_test.sh | 8 ++++++++ 6 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 usr.bin/hexdump/tests/d_hexdump_UCflag_bug118723.out create mode 100644 usr.bin/hexdump/tests/d_hexdump_UCvflag_bug118723.out create mode 100644 usr.bin/hexdump/tests/d_hexdump_bug118723.in diff --git a/usr.bin/hexdump/display.c b/usr.bin/hexdump/display.c index 36306ededfc..b4e7084e1e9 100644 --- a/usr.bin/hexdump/display.c +++ b/usr.bin/hexdump/display.c @@ -271,7 +271,7 @@ get(void) * XXX bcmp() is not quite right in the presence * of multibyte characters. */ - if (vflag != ALL && + if (need == 0 && vflag != ALL && valid_save && bcmp(curp, savp, nread) == 0) { if (vflag != DUP) { diff --git a/usr.bin/hexdump/tests/Makefile b/usr.bin/hexdump/tests/Makefile index 54863cb0560..f7a3575400b 100644 --- a/usr.bin/hexdump/tests/Makefile +++ b/usr.bin/hexdump/tests/Makefile @@ -7,6 +7,7 @@ ATF_TESTS_SH= hexdump_test od_test ${PACKAGE}FILES+= d_hexdump_a.in ${PACKAGE}FILES+= d_hexdump_b.in ${PACKAGE}FILES+= d_hexdump_c.in +${PACKAGE}FILES+= d_hexdump_bug118723.in ${PACKAGE}FILES+= d_hexdump_bflag_a.out ${PACKAGE}FILES+= d_hexdump_bflag_b.out ${PACKAGE}FILES+= d_hexdump_bflag_c.out @@ -30,6 +31,8 @@ ${PACKAGE}FILES+= d_hexdump_sflag_a.out ${PACKAGE}FILES+= d_hexdump_UCflag_a.out ${PACKAGE}FILES+= d_hexdump_UCflag_b.out ${PACKAGE}FILES+= d_hexdump_UCflag_c.out +${PACKAGE}FILES+= d_hexdump_UCflag_bug118723.out +${PACKAGE}FILES+= d_hexdump_UCvflag_bug118723.out ${PACKAGE}FILES+= d_hexdump_xflag_a_el.out ${PACKAGE}FILES+= d_hexdump_xflag_b_el.out ${PACKAGE}FILES+= d_hexdump_xflag_c_el.out diff --git a/usr.bin/hexdump/tests/d_hexdump_UCflag_bug118723.out b/usr.bin/hexdump/tests/d_hexdump_UCflag_bug118723.out new file mode 100644 index 00000000000..bd1f5333b6a --- /dev/null +++ b/usr.bin/hexdump/tests/d_hexdump_UCflag_bug118723.out @@ -0,0 +1,4 @@ +00000000 61 62 63 64 65 66 67 0a 30 31 32 33 34 35 36 0a |abcdefg.0123456.| +* +00000020 61 62 63 64 65 66 67 0a |abcdefg.| +00000028 diff --git a/usr.bin/hexdump/tests/d_hexdump_UCvflag_bug118723.out b/usr.bin/hexdump/tests/d_hexdump_UCvflag_bug118723.out new file mode 100644 index 00000000000..927897a3cef --- /dev/null +++ b/usr.bin/hexdump/tests/d_hexdump_UCvflag_bug118723.out @@ -0,0 +1,4 @@ +00000000 61 62 63 64 65 66 67 0a 30 31 32 33 34 35 36 0a |abcdefg.0123456.| +00000010 61 62 63 64 65 66 67 0a 30 31 32 33 34 35 36 0a |abcdefg.0123456.| +00000020 61 62 63 64 65 66 67 0a |abcdefg.| +00000028 diff --git a/usr.bin/hexdump/tests/d_hexdump_bug118723.in b/usr.bin/hexdump/tests/d_hexdump_bug118723.in new file mode 100644 index 00000000000..8ecef445e1e --- /dev/null +++ b/usr.bin/hexdump/tests/d_hexdump_bug118723.in @@ -0,0 +1,5 @@ +abcdefg +0123456 +abcdefg +0123456 +abcdefg diff --git a/usr.bin/hexdump/tests/hexdump_test.sh b/usr.bin/hexdump/tests/hexdump_test.sh index 5e19d1f9922..31ce52b830c 100755 --- a/usr.bin/hexdump/tests/hexdump_test.sh +++ b/usr.bin/hexdump/tests/hexdump_test.sh @@ -75,6 +75,10 @@ C_flag_body() hexdump -C "$(atf_get_srcdir)/d_hexdump_b.in" atf_check -o file:"$(atf_get_srcdir)/d_hexdump_UCflag_c.out" \ hexdump -C "$(atf_get_srcdir)/d_hexdump_c.in" + atf_check -o file:"$(atf_get_srcdir)/d_hexdump_UCflag_bug118723.out" \ + hexdump -C "$(atf_get_srcdir)/d_hexdump_bug118723.in" + atf_check -o file:"$(atf_get_srcdir)/d_hexdump_UCvflag_bug118723.out" \ + hexdump -Cv "$(atf_get_srcdir)/d_hexdump_bug118723.in" } atf_test_case hd_name @@ -90,6 +94,10 @@ hd_name_body() hd "$(atf_get_srcdir)/d_hexdump_b.in" atf_check -o file:"$(atf_get_srcdir)/d_hexdump_UCflag_c.out" \ hd "$(atf_get_srcdir)/d_hexdump_c.in" + atf_check -o file:"$(atf_get_srcdir)/d_hexdump_UCflag_bug118723.out" \ + hd "$(atf_get_srcdir)/d_hexdump_bug118723.in" + atf_check -o file:"$(atf_get_srcdir)/d_hexdump_UCvflag_bug118723.out" \ + hd -v "$(atf_get_srcdir)/d_hexdump_bug118723.in" } atf_test_case d_flag