MIPS/BFD: Correctly report unsupported `.reginfo' section size
authorMaciej W. Rozycki <macro@mips.com>
Mon, 5 Feb 2018 14:00:21 +0000 (14:00 +0000)
committerMaciej W. Rozycki <macro@mips.com>
Mon, 5 Feb 2018 14:00:21 +0000 (14:00 +0000)
Report an error when an unsupported `.reginfo' section size is found in
`_bfd_mips_elf_section_processing', removing an assertion that triggers
at elfxx-mips.c:7105 in GAS when assembling input like:

.section .reginfo
.word 0xdeadbeef

and in `objcopy --rename-section' when renaming an incorrectly sized
section to `.reginfo'.

bfd/
* elfxx-mips.c (_bfd_mips_elf_section_processing): For
SHT_MIPS_REGINFO sections don't assert the correct size and
report an error instead.

binutils/
* testsuite/binutils-all/mips/mips-reginfo.d: New test.
* testsuite/binutils-all/mips/mips-reginfo-n32.d: New test.
* testsuite/binutils-all/mips/mips-reginfo.s: New test source.
* testsuite/binutils-all/mips/mips.exp: Run the new tests.

gas/
* testsuite/gas/mips/reginfo-2.d: New test.
* testsuite/gas/mips/reginfo-2-n32.d: New test.
* testsuite/gas/mips/reginfo-2.l: New test stderr output.
* testsuite/gas/mips/reginfo-2.s: New test source.
* testsuite/gas/mips/mips.exp: Run the new tests.

13 files changed:
bfd/ChangeLog
bfd/elfxx-mips.c
binutils/ChangeLog
binutils/testsuite/binutils-all/mips/mips-reginfo-n32.d [new file with mode: 0644]
binutils/testsuite/binutils-all/mips/mips-reginfo.d [new file with mode: 0644]
binutils/testsuite/binutils-all/mips/mips-reginfo.s [new file with mode: 0644]
binutils/testsuite/binutils-all/mips/mips.exp
gas/ChangeLog
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mips/reginfo-2-n32.d [new file with mode: 0644]
gas/testsuite/gas/mips/reginfo-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/reginfo-2.l [new file with mode: 0644]
gas/testsuite/gas/mips/reginfo-2.s [new file with mode: 0644]

index 091e363d8c997d4d6ee2b5b6d6f3e9c8bc39ef6f..9a8a32010198945bb321a0512ffa2245d5ab9591 100644 (file)
@@ -1,3 +1,9 @@
+2018-02-05  Maciej W. Rozycki  <macro@mips.com>
+
+       * elfxx-mips.c (_bfd_mips_elf_section_processing): For
+       SHT_MIPS_REGINFO sections don't assert the correct size and
+       report an error instead.
+
 2018-02-05  Maciej W. Rozycki  <macro@mips.com>
 
        * elf.c (_bfd_elf_write_object_contents): Propagate a failure
index 285401367daba95e7b037dc1489d55c8fd715688..ab65894e92b2f602850c9d071876f964bf376fd9 100644 (file)
@@ -7102,9 +7102,18 @@ _bfd_mips_elf_section_processing (bfd *abfd, Elf_Internal_Shdr *hdr)
     {
       bfd_byte buf[4];
 
-      BFD_ASSERT (hdr->sh_size == sizeof (Elf32_External_RegInfo));
       BFD_ASSERT (hdr->contents == NULL);
 
+      if (hdr->sh_size != sizeof (Elf32_External_RegInfo))
+       {
+         _bfd_error_handler
+           (_("%B: Incorrect `.reginfo' section size; expected %Lu, got %Lu"),
+            abfd, (bfd_size_type) sizeof (Elf32_External_RegInfo),
+            hdr->sh_size);
+         bfd_set_error (bfd_error_bad_value);
+         return FALSE;
+       }
+
       if (bfd_seek (abfd,
                    hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4,
                    SEEK_SET) != 0)
index b52c2d658a7bc8561c7ca204b2755f5be91f2c4a..f6f3e9971a64c6a2e043b48f3fc3fca9352720a9 100644 (file)
@@ -1,3 +1,10 @@
+2018-02-05  Maciej W. Rozycki  <macro@mips.com>
+
+       * testsuite/binutils-all/mips/mips-reginfo.d: New test.
+       * testsuite/binutils-all/mips/mips-reginfo-n32.d: New test.
+       * testsuite/binutils-all/mips/mips-reginfo.s: New test source.
+       * testsuite/binutils-all/mips/mips.exp: Run the new tests.
+
 2018-02-05  Maciej W. Rozycki  <macro@mips.com>
 
        * testsuite/config/default.exp (binutils_run): Document
diff --git a/binutils/testsuite/binutils-all/mips/mips-reginfo-n32.d b/binutils/testsuite/binutils-all/mips/mips-reginfo-n32.d
new file mode 100644 (file)
index 0000000..fe55e95
--- /dev/null
@@ -0,0 +1,7 @@
+#PROG: objcopy
+#name: MIPS objcopy .reginfo section size (n32)
+#as: -n32 -mips3
+#objcopy: --rename-section .foo=.reginfo
+#source: mips-reginfo.s
+#error: \A[^\n]*: Incorrect `\.reginfo' section size; expected 24, got 4\n
+#error:   [^\n]*: Bad value\Z
diff --git a/binutils/testsuite/binutils-all/mips/mips-reginfo.d b/binutils/testsuite/binutils-all/mips/mips-reginfo.d
new file mode 100644 (file)
index 0000000..7a8c1ca
--- /dev/null
@@ -0,0 +1,6 @@
+#PROG: objcopy
+#name: MIPS objcopy .reginfo section size
+#as: -32
+#objcopy: --rename-section .foo=.reginfo
+#error: \A[^\n]*: Incorrect `\.reginfo' section size; expected 24, got 4\n
+#error:   [^\n]*: Bad value\Z
diff --git a/binutils/testsuite/binutils-all/mips/mips-reginfo.s b/binutils/testsuite/binutils-all/mips/mips-reginfo.s
new file mode 100644 (file)
index 0000000..75eaa94
--- /dev/null
@@ -0,0 +1,2 @@
+       .section .foo, "a"
+       .word   0xdeadbeef
index be6e7859a01ad3c1ab4364614ad8965d957acea2..2167d4aafd106ca3d1f14fbb7099b132e8bf760d 100644 (file)
@@ -60,3 +60,8 @@ if $has_newabi {
     run_dump_test "mips-note-2r-n32"
     run_dump_test "mips-note-2r-n64"
 }
+
+run_dump_test "mips-reginfo"
+if $has_newabi {
+    run_dump_test "mips-reginfo-n32"
+}
index 7bbb9ce75eb8fe5bec0726cc5145b43dfe9d2aad..6c9ff3e345642b81b089afbdc8f3f12ec2a08040 100644 (file)
@@ -1,3 +1,11 @@
+2018-02-05  Maciej W. Rozycki  <macro@mips.com>
+
+       * testsuite/gas/mips/reginfo-2.d: New test.
+       * testsuite/gas/mips/reginfo-2-n32.d: New test.
+       * testsuite/gas/mips/reginfo-2.l: New test stderr output.
+       * testsuite/gas/mips/reginfo-2.s: New test source.
+       * testsuite/gas/mips/mips.exp: Run the new tests.
+
 2018-02-05  Nick Clifton  <nickc@redhat.com>
 
        * po/ru.po: Updated Russian translation.
index 74c39d47f323be753419c186190a24050c509329..d1191388b3c9f00238fff3a7108bb2cc3054a204 100644 (file)
@@ -1494,6 +1494,10 @@ if { [istarget mips*-*-vxworks*] } {
     run_dump_test "pr12915"
     run_dump_test "reginfo-1a"
     run_dump_test "reginfo-1b"
+    run_dump_test "reginfo-2"
+    if $has_newabi {
+       run_dump_test "reginfo-2-n32"
+    }
 
     run_dump_test "micromips"
     run_dump_test "micromips-trap"
diff --git a/gas/testsuite/gas/mips/reginfo-2-n32.d b/gas/testsuite/gas/mips/reginfo-2-n32.d
new file mode 100644 (file)
index 0000000..ec1f9e3
--- /dev/null
@@ -0,0 +1,4 @@
+#name: MIPS assembled .reginfo section size (n32)
+#as: -n32 -mips3
+#source: reginfo-2.s
+#error-output: reginfo-2.l
diff --git a/gas/testsuite/gas/mips/reginfo-2.d b/gas/testsuite/gas/mips/reginfo-2.d
new file mode 100644 (file)
index 0000000..7bfe7f9
--- /dev/null
@@ -0,0 +1,3 @@
+#name: MIPS assembled .reginfo section size
+#as: -32
+#error-output: reginfo-2.l
diff --git a/gas/testsuite/gas/mips/reginfo-2.l b/gas/testsuite/gas/mips/reginfo-2.l
new file mode 100644 (file)
index 0000000..ea9fef9
--- /dev/null
@@ -0,0 +1,3 @@
+.*: Incorrect `\.reginfo' section size; expected 24, got 28
+.*: Assembler messages:
+.*: Fatal error: can't close .*: Bad value
diff --git a/gas/testsuite/gas/mips/reginfo-2.s b/gas/testsuite/gas/mips/reginfo-2.s
new file mode 100644 (file)
index 0000000..7471062
--- /dev/null
@@ -0,0 +1,2 @@
+       .section .reginfo
+       .word   0xdeadbeef