gdb: use std::string instead of a fixed size buffer

The 'section' command uses a fixed size buffer into which a section
name is copied.  This commit replaces this with a use of std::string
so we can now display very long section names.

The expected results of one test need to be updated.

gdb/ChangeLog:

	* exec.c (set_section_command): Move variable declarations into
	the function body, and use std::string instead of a fixed size
	buffer.

gdb/testsuite/ChangeLog:

	* gdb.base/sect-cmd.exp: Update expected results.
This commit is contained in:
Andrew Burgess 2021-02-19 17:39:18 +00:00
parent 336aa7b740
commit dd80d75040
4 changed files with 24 additions and 18 deletions

View File

@ -1,3 +1,9 @@
2021-02-24 Andrew Burgess <andrew.burgess@embecosm.com>
* exec.c (set_section_command): Move variable declarations into
the function body, and use std::string instead of a fixed size
buffer.
2021-02-24 Andrew Burgess <andrew.burgess@embecosm.com>
* exec.c (exec_target::get_section_table): Delete member function.

View File

@ -989,27 +989,23 @@ static void
set_section_command (const char *args, int from_tty)
{
const char *secname;
unsigned seclen;
unsigned long secaddr;
char secprint[100];
long offset;
if (args == 0)
error (_("Must specify section name and its virtual address"));
/* Parse out section name. */
for (secname = args; !isspace (*args); args++);
seclen = args - secname;
unsigned seclen = args - secname;
/* Parse out new virtual address. */
secaddr = parse_and_eval_address (args);
CORE_ADDR secaddr = parse_and_eval_address (args);
for (target_section &p : current_program_space->target_sections ())
{
if (!strncmp (secname, bfd_section_name (p.the_bfd_section), seclen)
&& bfd_section_name (p.the_bfd_section)[seclen] == '\0')
{
offset = secaddr - p.addr;
long offset = secaddr - p.addr;
p.addr += offset;
p.endaddr += offset;
if (from_tty)
@ -1017,11 +1013,9 @@ set_section_command (const char *args, int from_tty)
return;
}
}
if (seclen >= sizeof (secprint))
seclen = sizeof (secprint) - 1;
strncpy (secprint, secname, seclen);
secprint[seclen] = '\0';
error (_("Section %s not found"), secprint);
std::string secprint (secname, seclen);
error (_("Section %s not found"), secprint.c_str ());
}
/* If we can find a section in FILENAME with BFD index INDEX, adjust

View File

@ -1,3 +1,7 @@
2021-02-24 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb.base/sect-cmd.exp: Update expected results.
2021-02-24 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb.base/sect-cmd.exp: Rewrite using modern testsuite

View File

@ -79,14 +79,16 @@ gdb_test_multiple "section FOOBARBAZ 0x1234" "" {
}
}
# We "happen to know" that GDB uses a fixed size character buffer to
# parse the section name into, and the buffer is declared to be 100
# characters in length. Verify that GDB gracefully handles section
# names longer than that. (The section is also non-existent.)
# Check that GDB can still print the error message when the section
# name is very long. It used to be the case that GDB could only print
# (up to) 100 character section names in this error message, but that
# is no longer the case.
#
gdb_test_multiple "section A234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123 0x1234" \
set long_sect_name \
"A234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123"
gdb_test_multiple "section $long_sect_name 0x1234" \
"non-existent too-long section disallowed" {
-re -wrap "Section A23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 not found" {
-re -wrap "Section $long_sect_name not found" {
pass $gdb_test_name
}
}