]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit
gdb/breakpoint: make a copy of the "commands" command's argument
authorTankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Fri, 11 Sep 2020 13:04:01 +0000 (15:04 +0200)
committerTankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Fri, 25 Sep 2020 15:58:04 +0000 (17:58 +0200)
commit13e87e2127544a3f724cf6f00a7ba79e5e5821ca
tree495f3f482809c017a4f4b8937f330e10a4fdf6a6
parentf6defe2064e6bf78caa8cfe1fb93083ed9660929
gdb/breakpoint: make a copy of the "commands" command's argument

When GDB reads commands from the input, its internal buffer is re-used
for each line.  This is usually just fine because commands are
executed in order; by the time we read the next line, we are already
done with the current line.  However, a problematic case is breakpoint
commands that are input from a script.  The header (e.g. commands 1 2)
is overwritten with the next line before the breakpoint numbers are
processed completely.

For example, suppose we have the following script:

  break main
  break main
  commands 1 2
    print 100123
  end

and source this script:

  (gdb) source script.gdb
  Breakpoint 1 at 0x1245: file main.cpp, line 27.
  Breakpoint 2 at 0x1245: file main.cpp, line 27.
  No breakpoint number 123.

Note the "No breakpoint number 123." error message.  This happens
because GDB first reads "commands 1 2" into its internal buffer

  buffer -> "commands 1 2"

and then starts parsing the breakpoint numbers.  After parsing the first
token, the "next token" pointer is as below:

  buffer -> "commands 1 2"
  next-token -----------^

So, if we continue parsing, we would tokenize "2" correctly.  However,
before parsing the next number, GDB reads the commands to attach them
to breakpoint 1.  Reading the commands causes the buffer to be
overwritten:

  buffer -> "  print 100123"
  next-token -----------^

So, the next time we parse the breakpoint number, we read "123".

To fix, simply create a copy of the arguments of the header.

gdb/ChangeLog:
2020-09-25  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

* breakpoint.c (commands_command_1): Make a copy of the 'arg'
argument.

gdb/testsuite/ChangeLog:
2020-09-25  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

* gdb.base/bp-cmds-sourced-script.c: New file.
* gdb.base/bp-cmds-sourced-script.exp: New test.
* gdb.base/bp-cmds-sourced-script.gdb: New file.
gdb/ChangeLog
gdb/breakpoint.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/bp-cmds-sourced-script.c [new file with mode: 0644]
gdb/testsuite/gdb.base/bp-cmds-sourced-script.exp [new file with mode: 0644]
gdb/testsuite/gdb.base/bp-cmds-sourced-script.gdb [new file with mode: 0644]