* peXXigen.c: Whitespace.

(pe_print_idata): Correct section limit calculations.  Tidy array
	indexing.
	(_bfd_XX_print_ce_compressed_pdata): Don't leak memory.
This commit is contained in:
Alan Modra 2010-09-06 23:55:10 +00:00
parent 809df4465f
commit 4e1fc5994d
2 changed files with 56 additions and 58 deletions

View file

@ -1,3 +1,11 @@
2010-09-07 Alan Modra <amodra@gmail.com>
Marcus Brinkmann <marcus.brinkmann@ruhr-uni-bochum.de>
* peXXigen.c: Whitespace.
(pe_print_idata): Correct section limit calculations. Tidy array
indexing.
(_bfd_XX_print_ce_compressed_pdata): Don't leak memory.
2010-09-02 Richard Henderson <rth@redhat.com> 2010-09-02 Richard Henderson <rth@redhat.com>
* config.bfd (x86_64-*-mingw*): Select 32-bit pei vectors too. * config.bfd (x86_64-*-mingw*): Select 32-bit pei vectors too.

View file

@ -550,7 +550,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
PEAOUTHDR *aouthdr_out = (PEAOUTHDR *) out; PEAOUTHDR *aouthdr_out = (PEAOUTHDR *) out;
bfd_vma sa, fa, ib; bfd_vma sa, fa, ib;
IMAGE_DATA_DIRECTORY idata2, idata5, tls; IMAGE_DATA_DIRECTORY idata2, idata5, tls;
sa = extra->SectionAlignment; sa = extra->SectionAlignment;
fa = extra->FileAlignment; fa = extra->FileAlignment;
ib = extra->ImageBase; ib = extra->ImageBase;
@ -558,7 +558,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
idata2 = pe->pe_opthdr.DataDirectory[PE_IMPORT_TABLE]; idata2 = pe->pe_opthdr.DataDirectory[PE_IMPORT_TABLE];
idata5 = pe->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE]; idata5 = pe->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE];
tls = pe->pe_opthdr.DataDirectory[PE_TLS_TABLE]; tls = pe->pe_opthdr.DataDirectory[PE_TLS_TABLE];
if (aouthdr_in->tsize) if (aouthdr_in->tsize)
{ {
aouthdr_in->text_start -= ib; aouthdr_in->text_start -= ib;
@ -615,7 +615,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
/* Until other .idata fixes are made (pending patch), the entry for /* Until other .idata fixes are made (pending patch), the entry for
.idata is needed for backwards compatibility. FIXME. */ .idata is needed for backwards compatibility. FIXME. */
add_data_entry (abfd, extra, 1, ".idata", ib); add_data_entry (abfd, extra, 1, ".idata", ib);
/* For some reason, the virtual size (which is what's set by /* For some reason, the virtual size (which is what's set by
add_data_entry) for .reloc is not the same as the size recorded add_data_entry) for .reloc is not the same as the size recorded
in this slot by MSVC; it doesn't seem to cause problems (so far), in this slot by MSVC; it doesn't seem to cause problems (so far),
@ -926,7 +926,7 @@ _bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out)
(0x02000000). Also, the resource data should also be read and (0x02000000). Also, the resource data should also be read and
writable. */ writable. */
/* FIXME: Alignment is also encoded in this field, at least on PPC and /* FIXME: Alignment is also encoded in this field, at least on PPC and
ARM-WINCE. Although - how do we get the original alignment field ARM-WINCE. Although - how do we get the original alignment field
back ? */ back ? */
@ -936,7 +936,7 @@ _bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out)
unsigned long must_have; unsigned long must_have;
} }
pe_required_section_flags; pe_required_section_flags;
pe_required_section_flags known_sections [] = pe_required_section_flags known_sections [] =
{ {
{ ".arch", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_ALIGN_8BYTES }, { ".arch", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_ALIGN_8BYTES },
@ -1110,7 +1110,6 @@ pe_print_idata (bfd * abfd, void * vfile)
section->name, (unsigned long) addr); section->name, (unsigned long) addr);
dataoff = addr - section->vma; dataoff = addr - section->vma;
datasize -= dataoff;
#ifdef POWERPC_LE_PE #ifdef POWERPC_LE_PE
if (rel_section != 0 && rel_section->size != 0) if (rel_section != 0 && rel_section->size != 0)
@ -1183,7 +1182,7 @@ pe_print_idata (bfd * abfd, void * vfile)
adj = section->vma - extra->ImageBase; adj = section->vma - extra->ImageBase;
/* Print all image import descriptors. */ /* Print all image import descriptors. */
for (i = 0; i < datasize; i += onaline) for (i = dataoff; i + onaline <= datasize; i += onaline)
{ {
bfd_vma hint_addr; bfd_vma hint_addr;
bfd_vma time_stamp; bfd_vma time_stamp;
@ -1195,12 +1194,12 @@ pe_print_idata (bfd * abfd, void * vfile)
char *dll; char *dll;
/* Print (i + extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress). */ /* Print (i + extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress). */
fprintf (file, " %08lx\t", (unsigned long) (i + adj + dataoff)); fprintf (file, " %08lx\t", (unsigned long) (i + adj));
hint_addr = bfd_get_32 (abfd, data + i + dataoff); hint_addr = bfd_get_32 (abfd, data + i);
time_stamp = bfd_get_32 (abfd, data + i + 4 + dataoff); time_stamp = bfd_get_32 (abfd, data + i + 4);
forward_chain = bfd_get_32 (abfd, data + i + 8 + dataoff); forward_chain = bfd_get_32 (abfd, data + i + 8);
dll_name = bfd_get_32 (abfd, data + i + 12 + dataoff); dll_name = bfd_get_32 (abfd, data + i + 12);
first_thunk = bfd_get_32 (abfd, data + i + 16 + dataoff); first_thunk = bfd_get_32 (abfd, data + i + 16);
fprintf (file, "%08lx %08lx %08lx %08lx %08lx\n", fprintf (file, "%08lx %08lx %08lx %08lx %08lx\n",
(unsigned long) hint_addr, (unsigned long) hint_addr,
@ -1225,16 +1224,17 @@ pe_print_idata (bfd * abfd, void * vfile)
bfd_vma ft_addr; bfd_vma ft_addr;
bfd_size_type ft_datasize; bfd_size_type ft_datasize;
int ft_idx; int ft_idx;
int ft_allocated = 0; int ft_allocated;
fprintf (file, _("\tvma: Hint/Ord Member-Name Bound-To\n")); fprintf (file, _("\tvma: Hint/Ord Member-Name Bound-To\n"));
idx = hint_addr - adj; idx = hint_addr - adj;
ft_addr = first_thunk + extra->ImageBase; ft_addr = first_thunk + extra->ImageBase;
ft_data = data;
ft_idx = first_thunk - adj; ft_idx = first_thunk - adj;
ft_allocated = 0; ft_data = data + ft_idx;
ft_datasize = datasize - ft_idx;
ft_allocated = 0;
if (first_thunk != hint_addr) if (first_thunk != hint_addr)
{ {
@ -1243,9 +1243,8 @@ pe_print_idata (bfd * abfd, void * vfile)
ft_section != NULL; ft_section != NULL;
ft_section = ft_section->next) ft_section = ft_section->next)
{ {
ft_datasize = ft_section->size;
if (ft_addr >= ft_section->vma if (ft_addr >= ft_section->vma
&& ft_addr < ft_section->vma + ft_datasize) && ft_addr < ft_section->vma + ft_section->size)
break; break;
} }
@ -1258,34 +1257,28 @@ pe_print_idata (bfd * abfd, void * vfile)
/* Now check to see if this section is the same as our current /* Now check to see if this section is the same as our current
section. If it is not then we will have to load its data in. */ section. If it is not then we will have to load its data in. */
if (ft_section == section) if (ft_section != section)
{
ft_data = data;
ft_idx = first_thunk - adj;
}
else
{ {
ft_idx = first_thunk - (ft_section->vma - extra->ImageBase); ft_idx = first_thunk - (ft_section->vma - extra->ImageBase);
ft_data = (bfd_byte *) bfd_malloc (datasize); ft_datasize = ft_section->size - ft_idx;
ft_data = (bfd_byte *) bfd_malloc (ft_datasize);
if (ft_data == NULL) if (ft_data == NULL)
continue; continue;
/* Read datasize bfd_bytes starting at offset ft_idx. */ /* Read ft_datasize bytes starting at offset ft_idx. */
if (! bfd_get_section_contents if (!bfd_get_section_contents (abfd, ft_section, ft_data,
(abfd, ft_section, ft_data, (bfd_vma) ft_idx, datasize)) (bfd_vma) ft_idx, ft_datasize))
{ {
free (ft_data); free (ft_data);
continue; continue;
} }
ft_idx = 0;
ft_allocated = 1; ft_allocated = 1;
} }
} }
/* Print HintName vector entries. */ /* Print HintName vector entries. */
#ifdef COFF_WITH_pex64 #ifdef COFF_WITH_pex64
for (j = 0; j < datasize; j += 8) for (j = 0; idx + j + 8 <= datasize; j += 8)
{ {
unsigned long member = bfd_get_32 (abfd, data + idx + j); unsigned long member = bfd_get_32 (abfd, data + idx + j);
unsigned long member_high = bfd_get_32 (abfd, data + idx + j + 4); unsigned long member_high = bfd_get_32 (abfd, data + idx + j + 4);
@ -1310,17 +1303,18 @@ pe_print_idata (bfd * abfd, void * vfile)
table holds actual addresses. */ table holds actual addresses. */
if (time_stamp != 0 if (time_stamp != 0
&& first_thunk != 0 && first_thunk != 0
&& first_thunk != hint_addr) && first_thunk != hint_addr
&& j + 4 <= ft_datasize)
fprintf (file, "\t%04lx", fprintf (file, "\t%04lx",
(unsigned long) bfd_get_32 (abfd, ft_data + ft_idx + j)); (unsigned long) bfd_get_32 (abfd, ft_data + j));
fprintf (file, "\n"); fprintf (file, "\n");
} }
#else #else
for (j = 0; j < datasize; j += 4) for (j = 0; idx + j + 4 <= datasize; j += 4)
{ {
unsigned long member = bfd_get_32 (abfd, data + idx + j); unsigned long member = bfd_get_32 (abfd, data + idx + j);
/* Print single IMAGE_IMPORT_BY_NAME vector. */ /* Print single IMAGE_IMPORT_BY_NAME vector. */
if (member == 0) if (member == 0)
break; break;
@ -1342,9 +1336,10 @@ pe_print_idata (bfd * abfd, void * vfile)
table holds actual addresses. */ table holds actual addresses. */
if (time_stamp != 0 if (time_stamp != 0
&& first_thunk != 0 && first_thunk != 0
&& first_thunk != hint_addr) && first_thunk != hint_addr
&& j + 4 <= ft_datasize)
fprintf (file, "\t%04lx", fprintf (file, "\t%04lx",
(unsigned long) bfd_get_32 (abfd, ft_data + ft_idx + j)); (unsigned long) bfd_get_32 (abfd, ft_data + j));
fprintf (file, "\n"); fprintf (file, "\n");
} }
@ -1583,7 +1578,7 @@ pe_print_edata (bfd * abfd, void * vfile)
/* This really is architecture dependent. On IA-64, a .pdata entry /* This really is architecture dependent. On IA-64, a .pdata entry
consists of three dwords containing relative virtual addresses that consists of three dwords containing relative virtual addresses that
specify the start and end address of the code range the entry specify the start and end address of the code range the entry
covers and the address of the corresponding unwind info data. covers and the address of the corresponding unwind info data.
On ARM and SH-4, a compressed PDATA structure is used : On ARM and SH-4, a compressed PDATA structure is used :
_IMAGE_CE_RUNTIME_FUNCTION_ENTRY, whereas MIPS is documented to use _IMAGE_CE_RUNTIME_FUNCTION_ENTRY, whereas MIPS is documented to use
@ -1828,7 +1823,6 @@ _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile)
bfd_vma other_data; bfd_vma other_data;
bfd_vma prolog_length, function_length; bfd_vma prolog_length, function_length;
int flag32bit, exception_flag; int flag32bit, exception_flag;
bfd_byte *tdata = 0;
asection *tsection; asection *tsection;
if (i + PDATA_ROW_SIZE > stop) if (i + PDATA_ROW_SIZE > stop)
@ -1860,12 +1854,13 @@ _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile)
if (tsection && coff_section_data (abfd, tsection) if (tsection && coff_section_data (abfd, tsection)
&& pei_section_data (abfd, tsection)) && pei_section_data (abfd, tsection))
{ {
if (bfd_malloc_and_get_section (abfd, tsection, & tdata)) bfd_vma eh_off = (begin_addr - 8) - tsection->vma;
{ bfd_byte *tdata;
int xx = (begin_addr - 8) - tsection->vma;
tdata = (bfd_byte *) bfd_malloc (8); tdata = (bfd_byte *) bfd_malloc (8);
if (bfd_get_section_contents (abfd, tsection, tdata, (bfd_vma) xx, 8)) if (tdata)
{
if (bfd_get_section_contents (abfd, tsection, tdata, eh_off, 8))
{ {
bfd_vma eh, eh_data; bfd_vma eh, eh_data;
@ -1883,11 +1878,6 @@ _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile)
} }
free (tdata); free (tdata);
} }
else
{
if (tdata)
free (tdata);
}
} }
fprintf (file, "\n"); fprintf (file, "\n");
@ -2194,7 +2184,7 @@ _bfd_XX_bfd_copy_private_bfd_data_common (bfd * ibfd, bfd * obfd)
ipe = pe_data (ibfd); ipe = pe_data (ibfd);
ope = pe_data (obfd); ope = pe_data (obfd);
/* pe_opthdr is copied in copy_object. */ /* pe_opthdr is copied in copy_object. */
ope->dll = ipe->dll; ope->dll = ipe->dll;
@ -2288,7 +2278,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
".idata$2", FALSE, FALSE, TRUE); ".idata$2", FALSE, FALSE, TRUE);
if (h1 != NULL) if (h1 != NULL)
{ {
/* PR ld/2729: We cannot rely upon all the output sections having been /* PR ld/2729: We cannot rely upon all the output sections having been
created properly, so check before referencing them. Issue a warning created properly, so check before referencing them. Issue a warning
message for any sections tht could not be found. */ message for any sections tht could not be found. */
if ((h1->root.type == bfd_link_hash_defined if ((h1->root.type == bfd_link_hash_defined
@ -2302,7 +2292,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
else else
{ {
_bfd_error_handler _bfd_error_handler
(_("%B: unable to fill in DataDictionary[1] because .idata$2 is missing"), (_("%B: unable to fill in DataDictionary[1] because .idata$2 is missing"),
abfd); abfd);
result = FALSE; result = FALSE;
} }
@ -2322,7 +2312,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
else else
{ {
_bfd_error_handler _bfd_error_handler
(_("%B: unable to fill in DataDictionary[1] because .idata$4 is missing"), (_("%B: unable to fill in DataDictionary[1] because .idata$4 is missing"),
abfd); abfd);
result = FALSE; result = FALSE;
} }
@ -2343,7 +2333,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
else else
{ {
_bfd_error_handler _bfd_error_handler
(_("%B: unable to fill in DataDictionary[12] because .idata$5 is missing"), (_("%B: unable to fill in DataDictionary[12] because .idata$5 is missing"),
abfd); abfd);
result = FALSE; result = FALSE;
} }
@ -2359,11 +2349,11 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
((h1->root.u.def.value ((h1->root.u.def.value
+ h1->root.u.def.section->output_section->vma + h1->root.u.def.section->output_section->vma
+ h1->root.u.def.section->output_offset) + h1->root.u.def.section->output_offset)
- pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress); - pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress);
else else
{ {
_bfd_error_handler _bfd_error_handler
(_("%B: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because .idata$6 is missing"), (_("%B: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because .idata$6 is missing"),
abfd); abfd);
result = FALSE; result = FALSE;
} }
@ -2385,7 +2375,7 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
else else
{ {
_bfd_error_handler _bfd_error_handler
(_("%B: unable to fill in DataDictionary[9] because __tls_used is missing"), (_("%B: unable to fill in DataDictionary[9] because __tls_used is missing"),
abfd); abfd);
result = FALSE; result = FALSE;
} }