mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-09 04:21:49 +08:00
COFF build-id writes uninitialised data to file
1) The first write in write_build_id wrote rubbish past the struct external_IMAGE_DEBUG_DIRECTORY, which was later overwritten with correct data. No user visible problem there, except that tools like valgrind complain. 2) The size for the pdb name was incorrectly calculated. * emultempl/pe.em (write_build_id): Write the debug directory, not the entire section contents. (setup_build_id): Add size for the base name of pdb_name, not the full path. * emultempl/pep.em: Likewise. * testsuite/ld-pe/pdb2-section-contrib.d: Update.
This commit is contained in:
parent
2ac6aa431e
commit
160a943ff8
@ -1285,7 +1285,6 @@ write_build_id (bfd *abfd)
|
||||
asection *asec;
|
||||
struct bfd_link_order *link_order = NULL;
|
||||
unsigned char *contents;
|
||||
bfd_size_type size;
|
||||
bfd_size_type build_id_size;
|
||||
unsigned char *build_id;
|
||||
const char *pdb_base_name = NULL;
|
||||
@ -1320,7 +1319,6 @@ write_build_id (bfd *abfd)
|
||||
if (t->build_id.sec->contents == NULL)
|
||||
t->build_id.sec->contents = (unsigned char *) xmalloc (t->build_id.sec->size);
|
||||
contents = t->build_id.sec->contents;
|
||||
size = t->build_id.sec->size;
|
||||
|
||||
build_id_size = compute_build_id_size (t->build_id.style);
|
||||
build_id = xmalloc (build_id_size);
|
||||
@ -1351,7 +1349,7 @@ write_build_id (bfd *abfd)
|
||||
if (bfd_seek (abfd, asec->filepos + link_order->offset, SEEK_SET) != 0)
|
||||
return 0;
|
||||
|
||||
if (bfd_bwrite (contents, size, abfd) != size)
|
||||
if (bfd_bwrite (contents, sizeof (*ext), abfd) != sizeof (*ext))
|
||||
return 0;
|
||||
|
||||
if (pdb)
|
||||
@ -1417,7 +1415,7 @@ setup_build_id (bfd *ibfd)
|
||||
+ sizeof (CV_INFO_PDB70) + 1;
|
||||
|
||||
if (pdb_name)
|
||||
s->size += strlen (pdb_name);
|
||||
s->size += strlen (lbasename (pdb_name));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1277,7 +1277,6 @@ write_build_id (bfd *abfd)
|
||||
asection *asec;
|
||||
struct bfd_link_order *link_order = NULL;
|
||||
unsigned char *contents;
|
||||
bfd_size_type size;
|
||||
bfd_size_type build_id_size;
|
||||
unsigned char *build_id;
|
||||
const char *pdb_base_name = NULL;
|
||||
@ -1312,7 +1311,6 @@ write_build_id (bfd *abfd)
|
||||
if (t->build_id.sec->contents == NULL)
|
||||
t->build_id.sec->contents = (unsigned char *) xmalloc (t->build_id.sec->size);
|
||||
contents = t->build_id.sec->contents;
|
||||
size = t->build_id.sec->size;
|
||||
|
||||
build_id_size = compute_build_id_size (t->build_id.style);
|
||||
build_id = xmalloc (build_id_size);
|
||||
@ -1343,7 +1341,7 @@ write_build_id (bfd *abfd)
|
||||
if (bfd_seek (abfd, asec->filepos + link_order->offset, SEEK_SET) != 0)
|
||||
return 0;
|
||||
|
||||
if (bfd_bwrite (contents, size, abfd) != size)
|
||||
if (bfd_bwrite (contents, sizeof (*ext), abfd) != sizeof (*ext))
|
||||
return 0;
|
||||
|
||||
if (pdb)
|
||||
@ -1409,7 +1407,7 @@ setup_build_id (bfd *ibfd)
|
||||
+ sizeof (CV_INFO_PDB70) + 1;
|
||||
|
||||
if (pdb_name)
|
||||
s->size += strlen (pdb_name);
|
||||
s->size += strlen (lbasename (pdb_name));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -4,7 +4,7 @@ tmpdir/pdb2-sc: file format binary
|
||||
Contents of section .data:
|
||||
0000 2dba2ef1 01000000 00000000 10000000 -...............
|
||||
0010 20000060 00000000 00000000 00000000 ..`............
|
||||
0020 02000000 00000000 44000000 40000040 ........D...@..@
|
||||
0020 02000000 00000000 3d000000 40000040 ........=...@..@
|
||||
0030 00000000 00000000 00000000 01000000 ................
|
||||
0040 10000000 10000000 20000060 01000000 ........ ..`....
|
||||
0050 00000000 00000000 04000000 00000000 ................
|
||||
|
Loading…
Reference in New Issue
Block a user