diff options
author | Ari Sundholm <ari@tuxera.com> | 2019-01-29 14:42:57 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2019-01-29 14:42:57 +0100 |
commit | 9a9c6e39ba4c8f4f2cecb147c7e6464bec2d8b55 (patch) | |
tree | ffd9a73b098670937ef0a2d33966a6669ec59d96 | |
parent | 53799506acf69e7f7137d91fa5a4451211621469 (diff) | |
download | busybox-w32-9a9c6e39ba4c8f4f2cecb147c7e6464bec2d8b55.tar.gz busybox-w32-9a9c6e39ba4c8f4f2cecb147c7e6464bec2d8b55.tar.bz2 busybox-w32-9a9c6e39ba4c8f4f2cecb147c7e6464bec2d8b55.zip |
grep: fix -x -v with certain pattern orders
We found out that busybox -x -v is a bit broken:
ari@ari-thinkpad:~/busybox$ echo ' aa bb cc' | ./busybox grep -x -e 'aa.*' -e '.*bb.*'
aa bb cc
ari@ari-thinkpad:~/busybox$ echo ' aa bb cc' | ./busybox grep -x -v -e 'aa.*' -e '.*bb.*'
ari@ari-thinkpad:~/busybox$ echo ' aa bb cc' | ./busybox grep -x -e '.*aa.*' -e 'bb.*'
aa bb cc
ari@ari-thinkpad:~/busybox$ echo ' aa bb cc' | ./busybox grep -x -v -e '.*aa.*' -e 'bb.*'
aa bb cc
Last one is wrong.
This patch fixes the issue by making sure that the variable 'found'
never makes a transition from 1 to 0, as this would mean that
grep previously found a match on this input line.
Signed-off-by: Ari Sundholm <ari@tuxera.com>
Signed-off-by: Niko Vähäsarja <niko@tuxera.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | findutils/grep.c | 2 | ||||
-rwxr-xr-x | testsuite/grep.tests | 7 |
2 files changed, 8 insertions, 1 deletions
diff --git a/findutils/grep.c b/findutils/grep.c index a4033a40b..9d9da422c 100644 --- a/findutils/grep.c +++ b/findutils/grep.c | |||
@@ -404,7 +404,7 @@ static int grep_file(FILE *file) | |||
404 | #endif | 404 | #endif |
405 | ) { | 405 | ) { |
406 | if (option_mask32 & OPT_x) { | 406 | if (option_mask32 & OPT_x) { |
407 | found = (gl->matched_range.rm_so == 0 | 407 | found |= (gl->matched_range.rm_so == 0 |
408 | && match_at[gl->matched_range.rm_eo] == '\0'); | 408 | && match_at[gl->matched_range.rm_eo] == '\0'); |
409 | } else | 409 | } else |
410 | if (!(option_mask32 & OPT_w)) { | 410 | if (!(option_mask32 & OPT_w)) { |
diff --git a/testsuite/grep.tests b/testsuite/grep.tests index e57889790..26f8e69cf 100755 --- a/testsuite/grep.tests +++ b/testsuite/grep.tests | |||
@@ -177,6 +177,13 @@ testing "grep -w word match second word" \ | |||
177 | "bword,word\n""wordb,word\n""bwordb,word\n" \ | 177 | "bword,word\n""wordb,word\n""bwordb,word\n" \ |
178 | "" | 178 | "" |
179 | 179 | ||
180 | |||
181 | testing "grep -x -v -e EXP1 -e EXP2 finds nothing if either EXP matches" \ | ||
182 | "grep -x -v -e '.*aa.*' -e 'bb.*'; echo \$?" \ | ||
183 | "1\n" \ | ||
184 | "" \ | ||
185 | " aa bb cc\n" | ||
186 | |||
180 | # -r on symlink to dir should recurse into dir | 187 | # -r on symlink to dir should recurse into dir |
181 | mkdir -p grep.testdir/foo | 188 | mkdir -p grep.testdir/foo |
182 | echo bar > grep.testdir/foo/file | 189 | echo bar > grep.testdir/foo/file |