Date: Mon, 19 Sep 2011 20:37:06 GMT From: Toby Peterson <toby@apple.com> To: freebsd-gnats-submit@FreeBSD.org Subject: bin/160834: grep: fixes for POSIX conformance Message-ID: <201109192037.p8JKb67B039509@red.freebsd.org> Resent-Message-ID: <201109192040.p8JKe6lW005305@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 160834 >Category: bin >Synopsis: grep: fixes for POSIX conformance >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Mon Sep 19 20:40:05 UTC 2011 >Closed-Date: >Last-Modified: >Originator: Toby Peterson >Release: n/a >Organization: Apple Inc. >Environment: n/a >Description: Standard is at http://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html Fairly straightforward changes, description as follows: fastgrep.c: Handle ^$ pattern correctly. Simple test is `echo | grep "^$"` - it should match the single line. grep.c: As described in the standard, "The pattern_list's value shall consist of one or more patterns separated by <newline> characters" util.c: For the purposes of the standard, inaccessible = nonexistent. Also don't match the empty end of the line. Simple test for that: `echo abc#def | grep "^[A-Za-z0-9]*$"` should not match anything. >How-To-Repeat: See description for test cases. >Fix: Patch attached. Patch attached with submission follows: Index: fastgrep.c =================================================================== --- fastgrep.c (revision 225675) +++ fastgrep.c (working copy) @@ -104,6 +104,10 @@ pat++; } + if (fg->len == 0) { + return (-1); + } + if (fg->len >= 14 && memcmp(pat, "[[:<:]]", 7) == 0 && memcmp(pat + fg->len - 7, "[[:>:]]", 7) == 0) { Index: grep.c =================================================================== --- grep.c (revision 225675) +++ grep.c (working copy) @@ -280,6 +280,21 @@ } /* + * Adds search patterns from arguments. + */ +static void +add_arg_patterns(const char *arg) +{ + char *argcopy, *pattern; + + argcopy = grep_strdup(arg); + while ((pattern = strsep(&argcopy, "\n")) != NULL) { + add_pattern(pattern, strlen(pattern)); + } + free(argcopy); +} + +/* * Reads searching patterns from a file and adds them with add_pattern(). */ static void @@ -461,7 +476,7 @@ grepbehave = GREP_EXTENDED; break; case 'e': - add_pattern(optarg, strlen(optarg)); + add_arg_patterns(optarg); needpattern = 0; break; case 'F': @@ -636,7 +651,7 @@ /* Process patterns from command line */ if (aargc != 0 && needpattern) { - add_pattern(*aargv, strlen(*aargv)); + add_arg_patterns(*aargv); --aargc; ++aargv; } Index: util.c =================================================================== --- util.c (revision 225675) +++ util.c (working copy) @@ -194,7 +194,7 @@ if (f == NULL) { if (!sflag) warn("%s", fn); - if (errno == ENOENT) + if (errno == ENOENT || errno == EACCES) notfound = true; return (0); } @@ -282,7 +282,7 @@ if (!matchall) { /* Loop to process the whole line */ - while (st <= l->len) { + do { pmatch.rm_so = st; pmatch.rm_eo = l->len; @@ -350,7 +350,7 @@ if (st == (size_t)pmatch.rm_so) break; /* No matches */ - } + } while (st < l->len); } else c = !vflag; >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201109192037.p8JKb67B039509>