]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Tidy reading data in read_formatted_entries
authorAlan Modra <amodra@gmail.com>
Tue, 26 Sep 2017 13:50:06 +0000 (23:20 +0930)
committerAlan Modra <amodra@gmail.com>
Tue, 26 Sep 2017 13:53:44 +0000 (23:23 +0930)
Using read_attribute_value accomplishes two things: It checks for
unexpected formats, and ensures the buffer pointer always increments.

PR 22210
* dwarf2.c (read_formatted_entries): Use read_attribute_value to
read data.

bfd/ChangeLog
bfd/dwarf2.c

index a1c16168a4b1544df3747784e53fc50cd5750bc4..0e670cdcf8ec84153a6bc5d5c4651b76649a056c 100644 (file)
@@ -1,3 +1,9 @@
+2017-09-26  Alan Modra  <amodra@gmail.com>
+
+       PR 22210
+       * dwarf2.c (read_formatted_entries): Use read_attribute_value to
+       read data.
+
 2017-09-26  Nick Clifton  <nickc@redhat.com>
 
        PR 22210
index dd5ac8fdb571410e458bc6a0d9fbf778208d219c..be415e394a36e3659bec6195c50f1c9b551d0d83 100644 (file)
@@ -1960,6 +1960,7 @@ read_formatted_entries (struct comp_unit *unit, bfd_byte **bufp,
          char *string_trash;
          char **stringp = &string_trash;
          unsigned int uint_trash, *uintp = &uint_trash;
+         struct attribute attr;
 
          content_type = _bfd_safe_read_leb128 (abfd, format, &bytes_read,
                                                FALSE, buf_end);
@@ -1991,47 +1992,23 @@ read_formatted_entries (struct comp_unit *unit, bfd_byte **bufp,
          form = _bfd_safe_read_leb128 (abfd, format, &bytes_read, FALSE,
                                        buf_end);
          format += bytes_read;
+
+         buf = read_attribute_value (&attr, form, 0, unit, buf, buf_end);
+         if (buf == NULL)
+           return FALSE;
          switch (form)
            {
            case DW_FORM_string:
-             *stringp = read_string (abfd, buf, buf_end, &bytes_read);
-             buf += bytes_read;
-             break;
-
            case DW_FORM_line_strp:
-             *stringp = read_indirect_line_string (unit, buf, buf_end, &bytes_read);
-             buf += bytes_read;
+             *stringp = attr.u.str;
              break;
 
            case DW_FORM_data1:
-             *uintp = read_1_byte (abfd, buf, buf_end);
-             buf += 1;
-             break;
-
            case DW_FORM_data2:
-             *uintp = read_2_bytes (abfd, buf, buf_end);
-             buf += 2;
-             break;
-
            case DW_FORM_data4:
-             *uintp = read_4_bytes (abfd, buf, buf_end);
-             buf += 4;
-             break;
-
            case DW_FORM_data8:
-             *uintp = read_8_bytes (abfd, buf, buf_end);
-             buf += 8;
-             break;
-
            case DW_FORM_udata:
-             *uintp = _bfd_safe_read_leb128 (abfd, buf, &bytes_read, FALSE,
-                                             buf_end);
-             buf += bytes_read;
-             break;
-
-           case DW_FORM_block:
-             /* It is valid only for DW_LNCT_timestamp which is ignored by
-                current GDB.  */
+             *uintp = attr.u.val;
              break;
            }
        }