[prev in list] [next in list] [prev in thread] [next in thread]
List: busybox
Subject: Re: [PATCH] grep: add proper support for pattern_list
From: Denys Vlasenko <vda.linux () googlemail ! com>
Date: 2020-04-29 22:20:58
Message-ID: CAK1hOcP51h9GZrm73f25Z6aMHh9YS8qOd3W7bn8K-rLYkTs8Og () mail ! gmail ! com
[Download RAW message or body]
Applied, thanks!
On Mon, Mar 30, 2020 at 11:09 AM Sören Tempel <soeren@soeren-tempel.net> wrote:
>
> From: Sören Tempel <soeren+git@soeren-tempel.net>
>
> From POSIX.1-2008:
>
> The pattern_list's value shall consist of one or more patterns
> separated by <newline> characters;
>
> As such, given patterns need to be split at newline characters. Without
> doing so, busybox grep will interpret the newline as part of the pattern
> which is not in accordance with POSIX.
>
> See also: https://bugs.busybox.net/show_bug.cgi?id=12721
> ---
> findutils/grep.c | 19 +++++++++++++------
> 1 file changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/findutils/grep.c b/findutils/grep.c
> index 5b8644c36..a417b44c9 100644
> --- a/findutils/grep.c
> +++ b/findutils/grep.c
> @@ -650,6 +650,13 @@ static void load_regexes_from_file(llist_t *fopt)
> }
> }
>
> +static void load_pattern_list(llist_t **lst, char *pattern)
> +{
> + char *p;
> + while ((p = strsep(&pattern, "\n")))
> + llist_add_to(lst, new_grep_list_data(p, 0));
> +}
> +
> static int FAST_FUNC file_action_grep(const char *filename,
> struct stat *statbuf,
> void* matched,
> @@ -754,10 +761,12 @@ int grep_main(int argc UNUSED_PARAM, char **argv)
> #endif
> invert_search = ((option_mask32 & OPT_v) != 0); /* 0 | 1 */
>
> - { /* convert char **argv to grep_list_data_t */
> - llist_t *cur;
> + { /* convert char **argv to pattern_list */
> + llist_t *cur, *new = NULL;
> for (cur = pattern_head; cur; cur = cur->link)
> - cur->data = new_grep_list_data(cur->data, 0);
> + load_pattern_list(&new, cur->data);
> + llist_free(pattern_head, NULL);
> + pattern_head = new;
> }
> if (option_mask32 & OPT_f) {
> load_regexes_from_file(fopt);
> @@ -805,11 +814,9 @@ int grep_main(int argc UNUSED_PARAM, char **argv)
> /* if we didn't get a pattern from -e and no command file was specified,
> * first parameter should be the pattern. no pattern, no worky */
> if (pattern_head == NULL) {
> - char *pattern;
> if (*argv == NULL)
> bb_show_usage();
> - pattern = new_grep_list_data(*argv++, 0);
> - llist_add_to(&pattern_head, pattern);
> + load_pattern_list(&pattern_head, *argv++);
> }
>
> /* argv[0..(argc-1)] should be names of file to grep through. If
> _______________________________________________
> busybox mailing list
> busybox@busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic