I have installed a modified version of the patch
(1dcdf3de8e27cc130968891ee5a529a461a248da), updated in the ways you
suggested.

On Sat, Nov 2, 2024 at 9:24 AM Bernhard Voelker
<m...@bernhard-voelker.de> wrote:
>
> Hi James,
>
> thanks, technically this patch fixes it, yet I think it deserves some more 
> love before pushing.
>
> First of all, this patch does not cleanly apply.
>
>    $ git am /tmp/x.patch
>    Applying: Fix Savannah bug 66365.
>    error: git diff header lacks filename information when removing 1 leading 
> pathname component (line 82)
>    Patch failed at 0001 Fix Savannah bug 66365.
>    ...
>
> Didn't you use 'git format-patch -1' and 'git send-email ...'?
>
> On 10/31/24 17:28, James Youngman wrote:
> >  From e7641882e3ef373b6c58bcf27fbc49269e2541f3 Mon Sep 17 00:00:00 2001
> > From: James Youngman <ja...@youngman.org>
> > Date: Thu, 31 Oct 2024 15:06:02 +0000
> > Subject: [PATCH] [find] Fix Savannah bug 66365.
>
> the bug should be mentioned in the commit message, but the Subject line
> should better tell about the change, e.g.
>
>    find: only treat '+' special after pure '{}' in -exec option family
>
> > A "+" only terminates -exec when it immediately follows an argument
> > which is exactly "{}".
>
> Let's also explain the change and reasoning for it in a NEWS entry.
>
> > ---
> >   find/parser.c                                 | 21 ++++++++++++-------
> [...]
> >   create mode 100644 find/testsuite/find.posix/sv-bug-66365-exec.exp
> >   create mode 100644 find/testsuite/find.posix/sv-bug-66365-exec.xo
>
> I'd prefer going with the newer style for the tests like
> 'tests/find/exec-plus-last-file.sh'.
>
> > diff --git a/find/parser.c b/find/parser.c
> > index ad3b9904..d7b07c40 100644
> > --- a/find/parser.c
> > +++ b/find/parser.c
> > @@ -2770,7 +2770,7 @@ insert_exec_ok (const char *action,
> >   {
> >     int start, end;               /* Indexes in ARGV of start & end of cmd. 
> > */
> >     int i;                        /* Index into cmd args */
> > -  int saw_braces;               /* True if previous arg was '{}'. */
> > +  bool plus_is_terminator;      /* True if previous arg was '{}'. */
>
> I like the change to bool, but I'm not sure whether the new name is clearer 
> here.
> Actually it should say "the previous argument were pure braces only".
> Maybe 'saw_pure_braces'?
>
> >     bool allow_plus;              /* True if + is a valid terminator */
> >     int brace_count;              /* Number of instances of {}. */
> >     const char *brace_arg;        /* Which arg did {} appear in? */
> > @@ -2827,24 +2827,31 @@ insert_exec_ok (const char *action,
> >      * Also figure out if the command is terminated by ";" or by "+".
> >      */
> >     start = *arg_ptr;
> > -  for (end = start, saw_braces=0, brace_count=0, brace_arg=NULL;
> > +  for (end = start, plus_is_terminator=false, brace_count=0, 
> > brace_arg=NULL;
> >          (argv[end] != NULL)
> >          && ((argv[end][0] != ';') || (argv[end][1] != '\0'));
> >          end++)
> >       {
> >         /* For -exec and -execdir, "{} +" can terminate the command. */
> > -      if ( allow_plus
> > -           && argv[end][0] == '+' && argv[end][1] == 0
> > -           && saw_braces)
> > +      if (allow_plus && plus_is_terminator
> > +           && argv[end][0] == '+' && argv[end][1] == 0)
> >           {
> >             our_pred->args.exec_vec.multiple = 1;
> >             break;
> >           }
> >
> > -      saw_braces = 0;
> > +      plus_is_terminator = false;
> >         if (mbsstr (argv[end], "{}"))
> >           {
> > -          saw_braces = 1;
> > +   if (0 == strcmp(argv[end], "{}"))
> > +     {
> > +       /* Savannah bug 66365: + only terminates the predicate
> > +        * immediately after an argument which is exactly, "{}".
> > +        * However, the "{}" in "x{}" should get expanded for
> > +        * the ";" case.
> > +        */
> > +       plus_is_terminator = true;
> > +     }
>
> The indentation is odd.
>
> >             brace_arg = argv[end];
> >             ++brace_count;
> >
>
> BTW: the guard to prevent '-exec {} ;' seems to be ineffective for a while as 
> well.
> I'll check.
>
> Have a nice day,
> Berny

Reply via email to