gdb: use std::string instead of a fixed size buffer
authorAndrew Burgess <andrew.burgess@embecosm.com>
Fri, 19 Feb 2021 17:39:18 +0000 (17:39 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Wed, 24 Feb 2021 16:58:05 +0000 (16:58 +0000)
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.

gdb/ChangeLog
gdb/exec.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/sect-cmd.exp

index f50d89f25c1e663012bf9b22bced29b5c2fbf401..00a71fe90256dd5852511e19c32148c8f6a23162 100644 (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.
index 8e3c19ec272295a034620fbe5dd93f428b0271f8..544a05873f11ee287a701e2323a8aa5aac2e0c23 100644 (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
index 109ede33acc9ccb631901413bc46f744839637fb..922ba8caeca83da4d5a7dc517259cb49effd1d30 100644 (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
index e42f46d38ca279da241a8ef05b7d5a2cac79dd48..7aa24ca615ffecf32a4ea655f05ecbf5aaed2ba5 100644 (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
        }
     }