[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