From 83e49ade5724f5b3744660e45179461fe2a1b0f8 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 27 Feb 2014 14:56:12 +0100 Subject: grep: fix -w match if first match isn't a word, but second is. Closes 4520 Signed-off-by: Denys Vlasenko --- findutils/grep.c | 29 +++++++++++++++-------------- testsuite/grep.tests | 6 ++++++ 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/findutils/grep.c b/findutils/grep.c index 76859464f..f1b6dc694 100644 --- a/findutils/grep.c +++ b/findutils/grep.c @@ -418,13 +418,15 @@ static int grep_file(FILE *file) found = 1; } else { char c = ' '; - if (match_at > line || gl->matched_range.rm_so != 0) + if (match_at > line || gl->matched_range.rm_so != 0) { c = match_at[gl->matched_range.rm_so - 1]; + } if (!isalnum(c) && c != '_') { c = match_at[gl->matched_range.rm_eo]; - if (!c || (!isalnum(c) && c != '_')) { - found = 1; - } else { + } + if (!isalnum(c) && c != '_') { + found = 1; + } else { /* * Why check gl->matched_range.rm_eo? * Zero-length match makes -w skip the line: @@ -433,18 +435,17 @@ static int grep_file(FILE *file) * Without such check, we can loop forever. */ #if !ENABLE_EXTRA_COMPAT - if (gl->matched_range.rm_eo != 0) { - match_at += gl->matched_range.rm_eo; - match_flg |= REG_NOTBOL; - goto opt_w_again; - } + if (gl->matched_range.rm_eo != 0) { + match_at += gl->matched_range.rm_eo; + match_flg |= REG_NOTBOL; + goto opt_w_again; + } #else - if (gl->matched_range.rm_eo > start_pos) { - start_pos = gl->matched_range.rm_eo; - goto opt_w_again; - } -#endif + if (gl->matched_range.rm_eo > start_pos) { + start_pos = gl->matched_range.rm_eo; + goto opt_w_again; } +#endif } } } diff --git a/testsuite/grep.tests b/testsuite/grep.tests index 74b0eb63f..323b3849d 100755 --- a/testsuite/grep.tests +++ b/testsuite/grep.tests @@ -165,6 +165,12 @@ testing "grep -w word doesn't match wordword" \ "wordword\n" \ "" +testing "grep -w word match second word" \ + "grep -w word input" \ + "bword,word\n""wordb,word\n""bwordb,word\n" \ + "bword,word\n""wordb,word\n""bwordb,word\n" \ + "" + # testing "test name" "commands" "expected result" "file input" "stdin" # file input will be file called "input" # test can create a file "actual" instead of writing to stdout -- cgit v1.2.3