diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2014-04-20 23:18:56 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2014-04-20 23:19:23 -0700 |
commit | 9276ef47ee5aa4a90908c89b9b1caf46415a8b53 (patch) | |
tree | 42cfae4dca562943311c935945838443ced78173 /tests/null-byte | |
parent | d65dcf39f3d587027cccb6c7de6d7d70fb336e56 (diff) | |
download | grep-9276ef47ee5aa4a90908c89b9b1caf46415a8b53.tar.gz |
dfa: fix bug that caused NUL to be mishandled in patterns
This bug was introduced in the early-2012 patches that fixed some
context-handling bugs. Bisecting found commit
d8951d3f4e1bbd564809aa8e713d8333bda2f802 (2012-02-05 18:00:43 +0100),
but it apears the underlying problem was introduced in commit
8b47c4cf6556933f59226c234b0fe984f6c77dc7 (2012-01-03 11:22:09 +0100).
* NEWS: Mention bug fix.
* src/dfa.c (char_context): Consider NUL to be a newline only if -z.
* tests/Makefile.am (TESTS): Add null-byte.
* tests/null-byte: New file.
Diffstat (limited to 'tests/null-byte')
-rwxr-xr-x | tests/null-byte | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/tests/null-byte b/tests/null-byte new file mode 100755 index 00000000..c967dbc9 --- /dev/null +++ b/tests/null-byte @@ -0,0 +1,52 @@ +#!/bin/sh +# Test NUL bytes in patterns and data. + +# Copyright 2014 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src + +# Add "." to PATH for the use of get-mb-cur-max. +path_prepend_ . + +locales=C +for locale in en_US.iso885915 en_US.UTF-8; do + get-mb-cur-max en_US.UTF-8 >/dev/null 2>&1 && locales="$locales $locale" +done + +fail=0 + +for left in '' a '#' '\0'; do + for right in '' b '#' '\0'; do + data="$left\\0$right" + printf "$data\\n" >in || framework_failure_ + for hat in '' '^'; do + for dollar in '' '$'; do + for force_regex in '' '\\(\\)\\1'; do + pat="$hat$force_regex$data$dollar" + printf "$pat\\n" >pat || framework_failure_ + for locale in $locales; do + LC_ALL=$locale grep -f pat in || + fail_ "'$pat' does not match '$data'" + LC_ALL=$locale grep -a -f pat in | cmp -s - in || + fail_ "-a '$pat' does not match '$data'" + done + done + done + done + done +done + +Exit $fail |