PR25070, SEGV in function _bfd_dwarf2_find_nearest_line

Message ID 20191009043224.GQ7064@bubble.grove.modra.org
State New
Headers show
Series
  • PR25070, SEGV in function _bfd_dwarf2_find_nearest_line
Related show

Commit Message

Alan Modra Oct. 9, 2019, 4:32 a.m.
Evil testcase with two debug info sections, with sizes of 2aaaabac4ec1
and ffffd5555453b140 result in a total size of 1.  Reading the first
section of course overflows the buffer and tramples on other memory.

	PR 25070
	* dwarf2.c (_bfd_dwarf2_slurp_debug_info): Catch overflow of
	total_size calculation.


-- 
Alan Modra
Australia Development Lab, IBM

Patch

diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
index d39f4fdfe4..88aaa2d23c 100644
--- a/bfd/dwarf2.c
+++ b/bfd/dwarf2.c
@@ -4439,7 +4439,16 @@  _bfd_dwarf2_slurp_debug_info (bfd *abfd, bfd *debug_bfd,
       for (total_size = 0;
 	   msec;
 	   msec = find_debug_info (debug_bfd, debug_sections, msec))
-	total_size += msec->size;
+	{
+	  /* Catch PR25070 testcase overflowing size calculation here.  */
+	  if (total_size + msec->size < total_size
+	      || total_size + msec->size < msec->size)
+	    {
+	      bfd_set_error (bfd_error_no_memory);
+	      return FALSE;
+	    }
+	  total_size += msec->size;
+	}
 
       stash->info_ptr_memory = (bfd_byte *) bfd_malloc (total_size);
       if (stash->info_ptr_memory == NULL)