gdb: fix --args handling when inferior argument have dash

After the commit:

  commit e5e76451fa82e0bc00599af96382b361c3d6ac32
  Date:   Fri Oct 22 07:19:29 2021 +0000

      gdb/gdbserver: add a '--no-escape-args' command line option

Inferior argument handling on the GDB command line was broken:

  $ gdb --args /bin/ls --foo
  ./gdb/gdb: unrecognized option '--foo'
  ./gdb/gdb: `--args' specified but no program specified

Before the above patch the definition of the '--args' argument in the
long_options array (in captured_main_1) was such that the
getopt_long_only call would directly set the 'set_args' variable to
true if '--args' was seen.

This meant that, immediately after the getopt_long_only call, we could
inspect set_args and break out of the argument processing loop if
needed.

After the above patch '--args' (and the new '--no-escape-args') no
longer set set_args directly via the getopt_long_only call.  Instead
the getopt_long_only call returns an OPT_* enum value, which we then
use in the following switch statement in order to set the set_args
variable.

What this means is that, immediately after the getopt_long_only call,
set_args no longer (immediately) indicates if --args was seen.  After
the switch statement, when set_args has been updated, we go around the
argument processing loop again and call getopt_long_only once more.

This extra getopt_long_only call will, if it finds another argument
that starts with a dash, update the global optind to point to this
option.  At this point things have gone wrong, GDB has now lost track
of the argument containing the program name the user wanted us to
start.  This leads to GDB exiting with the above error.

The solution is to move the check of set_args to either before the
getopt_long_only call, or to after the switch statement.  I chose to
move it earlier as this keeps all the loop exiting checks near the
beginning.

I've added more tests that cover this issue.

Approved-By: Luis Machado <luis.machado.foss@gmail.com>
Tested-By: Luis Machado <luis.machado.foss@gmail.com>
2 files changed