[1/3] Bugfixes for pe_print_debugdata()

Message ID 20200121155212.12686-2-jon.turney@dronecode.org.uk
State New
Headers show
Series
  • Identify reproducible build PE files in 'objdump -p'
Related show

Commit Message

Jon Turney Jan. 21, 2020, 3:52 p.m.
Use a separate iteration variable for inner loop (:blush:).  This
generally prevented any debug directory entries after a
IMAGE_DEBUG_TYPE_CODEVIEW entry from being reported.

Don't leak the memory allocated for the section containing the debug
directory.

bfd/ChangeLog:

2020-01-16  Jon Turney  <jon.turney@dronecode.org.uk>

	* peXXigen.c (pe_print_debugdata): Fix the iteration variable for
	inner loop.  Fix a memory leak.
---
 bfd/ChangeLog  | 5 +++++
 bfd/peXXigen.c | 8 +++++---
 2 files changed, 10 insertions(+), 3 deletions(-)

-- 
2.21.0

Comments

Alan Modra Jan. 28, 2020, 10:11 p.m. | #1
On Tue, Jan 21, 2020 at 03:52:10PM +0000, Jon Turney wrote:
> 	* peXXigen.c (pe_print_debugdata): Fix the iteration variable for

> 	inner loop.  Fix a memory leak.


OK.

-- 
Alan Modra
Australia Development Lab, IBM

Patch

diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
index c5082a7dee..ac0cf17464 100644
--- a/bfd/peXXigen.c
+++ b/bfd/peXXigen.c
@@ -2630,7 +2630,7 @@  pe_print_debugdata (bfd * abfd, void * vfile)
   asection *section;
   bfd_byte *data = 0;
   bfd_size_type dataoff;
-  unsigned int i;
+  unsigned int i, j;
 
   bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
   bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
@@ -2722,8 +2722,8 @@  pe_print_debugdata (bfd * abfd, void * vfile)
 					       idd.SizeOfData, cvinfo))
 	    continue;
 
-	  for (i = 0; i < cvinfo->SignatureLength; i++)
-	    sprintf (&signature[i*2], "%02x", cvinfo->Signature[i] & 0xff);
+	  for (j = 0; j < cvinfo->SignatureLength; j++)
+	    sprintf (&signature[j*2], "%02x", cvinfo->Signature[j] & 0xff);
 
 	  /* xgettext:c-format */
 	  fprintf (file, _("(format %c%c%c%c signature %s age %ld)\n"),
@@ -2732,6 +2732,8 @@  pe_print_debugdata (bfd * abfd, void * vfile)
 	}
     }
 
+  free(data);
+
   if (size % sizeof (struct external_IMAGE_DEBUG_DIRECTORY) != 0)
     fprintf (file,
 	    _("The debug directory size is not a multiple of the debug directory entry size\n"));