From 14fdf163717efe7730104832b7a4b09c963c42ea Mon Sep 17 00:00:00 2001 From: Yuri Pankov Date: Sun, 26 Jul 2020 09:15:05 +0000 Subject: [PATCH] sed: treat '[' as ordinary character in 'y' command 'y' does not handle bracket expressions, treat '[' as ordinary character and do not apply bracket expression checks (GNU sed agrees). PR: 247931 Reviewed by: pfg, kevans Tested by: antoine (exp-run), Quentin L'Hours Differential Revision: https://reviews.freebsd.org/D25640 --- usr.bin/sed/compile.c | 16 ++++++++++++---- usr.bin/sed/tests/sed2_test.sh | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/usr.bin/sed/compile.c b/usr.bin/sed/compile.c index 99fa2b17a92f..a7cb3cbd6a73 100644 --- a/usr.bin/sed/compile.c +++ b/usr.bin/sed/compile.c @@ -437,11 +437,19 @@ compile_delimited(char *p, char *d, int is_tr) linenum, fname); while (*p) { if (*p == '[' && *p != c) { - if ((d = compile_ccl(&p, d)) == NULL) - errx(1, "%lu: %s: unbalanced brackets ([])", linenum, fname); - continue; + if (!is_tr) { + if ((d = compile_ccl(&p, d)) == NULL) { + errx(1, + "%lu: %s: unbalanced brackets ([])", + linenum, fname); + } + continue; + } } else if (*p == '\\' && p[1] == '[') { - *d++ = *p++; + if (is_tr) + p++; + else + *d++ = *p++; } else if (*p == '\\' && p[1] == c) { p++; } else if (*p == '\\' && diff --git a/usr.bin/sed/tests/sed2_test.sh b/usr.bin/sed/tests/sed2_test.sh index efa04f212ad4..9f831e0ed673 100755 --- a/usr.bin/sed/tests/sed2_test.sh +++ b/usr.bin/sed/tests/sed2_test.sh @@ -134,6 +134,22 @@ commands_on_stdin_body() atf_check -o 'empty' sed -f - < insert_x } +atf_test_case bracket_y +bracket_y_head() +{ + atf_set "descr" "Verify '[' is ordinary character for 'y' command" +} +bracket_y_body() +{ + atf_check -e empty -o ignore echo | sed 'y/[/x/' + atf_check -e empty -o ignore echo | sed 'y/[]/xy/' + atf_check -e empty -o ignore echo | sed 'y/[a]/xyz/' + atf_check -e empty -o "inline:zyx" echo '][a' | sed 'y/[a]/xyz/' + atf_check -e empty -o "inline:bracket\n" echo 'bra[ke]' | sed 'y/[]/ct/' + atf_check -e empty -o "inline:bracket\n" \ + echo 'bra[ke]' | sed 'y[\[][ct[' +} + atf_init_test_cases() { atf_add_test_case inplace_command_q @@ -142,4 +158,5 @@ atf_init_test_cases() atf_add_test_case escape_subst atf_add_test_case commands_on_stdin atf_add_test_case hex_subst + atf_add_test_case bracket_y }