Date: Sat, 20 Jan 2018 02:49:32 +0000 (UTC) From: Kyle Evans <kevans@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r328188 - in head/usr.bin/hexdump: . tests Message-ID: <201801200249.w0K2nWlO055412@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kevans Date: Sat Jan 20 02:49:32 2018 New Revision: 328188 URL: https://svnweb.freebsd.org/changeset/base/328188 Log: od(1): Fix wrong output for some corner cases in multibyte locales. Restore the original character to print if we used the look-ahead buffer, but that didn't help -- we either got an illegal sequence or still can't complete. PR: 224552 Submitted by: Yuri Pankov MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D13963 Added: head/usr.bin/hexdump/tests/d_od_cflag_a.out (contents, props changed) head/usr.bin/hexdump/tests/d_od_cflag_b.out (contents, props changed) head/usr.bin/hexdump/tests/od_test.sh (contents, props changed) Modified: head/usr.bin/hexdump/conv.c head/usr.bin/hexdump/tests/Makefile Modified: head/usr.bin/hexdump/conv.c ============================================================================== --- head/usr.bin/hexdump/conv.c Sat Jan 20 01:55:34 2018 (r328187) +++ head/usr.bin/hexdump/conv.c Sat Jan 20 02:49:32 2018 (r328188) @@ -56,6 +56,7 @@ conv_c(PR *pr, u_char *p, size_t bufsize) size_t clen, oclen; int converr, pad, width; u_char peekbuf[MB_LEN_MAX]; + u_char *op; if (pr->mbleft > 0) { str = "**"; @@ -107,6 +108,15 @@ retry: else if (clen == (size_t)-1 || (clen == (size_t)-2 && p == peekbuf)) { memset(&pr->mbstate, 0, sizeof(pr->mbstate)); + if (p == peekbuf) { + /* + * We peeked ahead, but that didn't help -- + * we either got an illegal sequence or still + * can't complete; restore original character. + */ + oclen = 0; + p = op; + } wc = *p; clen = 1; converr = 1; @@ -116,6 +126,7 @@ retry: * can complete it. */ oclen = bufsize; + op = p; bufsize = peek(p = peekbuf, MB_CUR_MAX); goto retry; } @@ -128,7 +139,7 @@ retry: if (!odmode) { *pr->cchar = 'c'; (void)printf(pr->fmt, (int)wc); - } else { + } else { *pr->cchar = 'C'; assert(strcmp(pr->fmt, "%3C") == 0); width = wcwidth(wc); Modified: head/usr.bin/hexdump/tests/Makefile ============================================================================== --- head/usr.bin/hexdump/tests/Makefile Sat Jan 20 01:55:34 2018 (r328187) +++ head/usr.bin/hexdump/tests/Makefile Sat Jan 20 02:49:32 2018 (r328188) @@ -2,7 +2,7 @@ PACKAGE= tests -ATF_TESTS_SH= hexdump_test +ATF_TESTS_SH= hexdump_test od_test ${PACKAGE}FILES+= d_hexdump_a.in ${PACKAGE}FILES+= d_hexdump_b.in @@ -27,5 +27,7 @@ ${PACKAGE}FILES+= d_hexdump_UCflag_c.out ${PACKAGE}FILES+= d_hexdump_xflag_a.out ${PACKAGE}FILES+= d_hexdump_xflag_b.out ${PACKAGE}FILES+= d_hexdump_xflag_c.out +${PACKAGE}FILES+= d_od_cflag_a.out +${PACKAGE}FILES+= d_od_cflag_b.out .include <bsd.test.mk> Added: head/usr.bin/hexdump/tests/d_od_cflag_a.out ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/usr.bin/hexdump/tests/d_od_cflag_a.out Sat Jan 20 02:49:32 2018 (r328188) @@ -0,0 +1,3 @@ +0000000 T e s t T e s t T e s t T e s 345 +0000020 T e s t 345 +0000025 Added: head/usr.bin/hexdump/tests/d_od_cflag_b.out ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/usr.bin/hexdump/tests/d_od_cflag_b.out Sat Jan 20 02:49:32 2018 (r328188) @@ -0,0 +1,3 @@ +0000000 T e s t T e s t T e s t T e s т +0000020 ** Т ** е ** с ** т ** +0000031 Added: head/usr.bin/hexdump/tests/od_test.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/usr.bin/hexdump/tests/od_test.sh Sat Jan 20 02:49:32 2018 (r328188) @@ -0,0 +1,94 @@ +# SPDX-License-Identifier: BSD-2-Clause-FreeBSD +# +# Copyright 2018 (C) Yuri Pankov +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ + +atf_test_case c_flag +c_flag_head() +{ + atf_set "descr" "Verify -c output (PR 224552)" +} +c_flag_body() +{ + export LC_ALL="en_US.UTF-8" + + printf 'TestTestTestTes\345Test\345' > d_od_cflag.in + atf_check -o file:"$(atf_get_srcdir)/d_od_cflag_a.out" \ + od -c d_od_cflag.in + printf 'TestTestTestTesтТест' > d_od_cflag.in + atf_check -o file:"$(atf_get_srcdir)/d_od_cflag_b.out" \ + od -c d_od_cflag.in +} + +atf_init_test_cases() +{ + atf_add_test_case c_flag +} +# +# Copyright 2018 The FreeBSD Project +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ + +atf_test_case c_flag +c_flag_head() +{ + atf_set "descr" "Verify -c output" +} +c_flag_body() +{ + printf 'TestTestTestTes\345Test\345' > d_od_cflag.in + atf_check -o file:"$(atf_get_srcdir)/d_od_cflag_a.out" \ + env LC_CTYPE="en_US.UTF-8" od -c "d_od_cflag.in" + printf 'TestTestTestTesтТест' > d_od_cflag.in + atf_check -o file:"$(atf_get_srcdir)/d_od_cflag_b.out" \ + env LC_CTYPE="en_US.UTF-8" od -c "d_od_cflag.in" +} + +atf_init_test_cases() +{ + atf_add_test_case c_flag +}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201801200249.w0K2nWlO055412>