X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Fbfd.c;h=3aed9be2373ac2ac2abd04544c72b14a7a10b7f3;hb=7242fa8aa7596b4e154ca96ddf5ce49353bf2e5d;hp=d590e0a4e912769edeb5207b25a32e94710333c7;hpb=b3adc24a0713411ab38a21dc894dd40dbc5c8f4f;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/bfd.c b/bfd/bfd.c index d590e0a4e9..3aed9be237 100644 --- a/bfd/bfd.c +++ b/bfd/bfd.c @@ -85,12 +85,6 @@ CODE_FRAGMENT . {* A unique identifier of the BFD *} . unsigned int id; . -. {* The format which belongs to the BFD. (object, core, etc.) *} -. ENUM_BITFIELD (bfd_format) format : 3; -. -. {* The direction with which the BFD was opened. *} -. ENUM_BITFIELD (bfd_direction) direction : 2; -. . {* Format_specific flags. *} . flagword flags; . @@ -194,6 +188,12 @@ CODE_FRAGMENT . | BFD_PLUGIN | BFD_TRADITIONAL_FORMAT | BFD_DETERMINISTIC_OUTPUT \ . | BFD_COMPRESS_GABI | BFD_CONVERT_ELF_COMMON | BFD_USE_ELF_STT_COMMON) . +. {* The format which belongs to the BFD. (object, core, etc.) *} +. ENUM_BITFIELD (bfd_format) format : 3; +. +. {* The direction with which the BFD was opened. *} +. ENUM_BITFIELD (bfd_direction) direction : 2; +. . {* Is the file descriptor being cached? That is, can it be closed as . needed, and re-opened when accessed later? *} . unsigned int cacheable : 1; @@ -249,9 +249,8 @@ CODE_FRAGMENT . library. *} . bfd *plugin_dummy_bfd; . -. {* Currently my_archive is tested before adding origin to -. anything. I believe that this can become always an add of -. origin, with origin set to 0 for non archive files. *} +. {* The offset of this bfd in the file, typically 0 if it is not +. contained in an archive. *} . ufile_ptr origin; . . {* The origin in the archive of the proxy entry. This will @@ -283,7 +282,7 @@ CODE_FRAGMENT . . {* Symbol table for output BFD (with symcount entries). . Also used by the linker to cache input BFD symbols. *} -. struct bfd_symbol **outsymbols; +. struct bfd_symbol **outsymbols; . . {* Used for input and output. *} . unsigned int symcount; @@ -294,6 +293,11 @@ CODE_FRAGMENT . {* Pointer to structure which contains architecture information. *} . const struct bfd_arch_info *arch_info; . +. {* Cached length of file for bfd_get_size. 0 until bfd_get_size is +. called, 1 if stat returns an error or the file size is too large to +. return in ufile_ptr. Both 0 and 1 should be treated as "unknown". *} +. ufile_ptr size; +. . {* Stuff only useful for archives. *} . void *arelt_data; . struct bfd *my_archive; {* The containing archive BFD. *} @@ -2058,7 +2062,8 @@ DESCRIPTION . BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section)) . .#define bfd_stat_arch_elt(abfd, stat) \ -. BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat)) +. BFD_SEND (abfd->my_archive ? abfd->my_archive : abfd, \ +. _bfd_stat_arch_elt, (abfd, stat)) . .#define bfd_update_armap_timestamp(abfd) \ . BFD_SEND (abfd, _bfd_update_armap_timestamp, (abfd)) @@ -2162,14 +2167,15 @@ bfd_record_phdr (bfd *abfd, bfd_boolean flags_valid, flagword flags, bfd_boolean at_valid, - bfd_vma at, + bfd_vma at, /* Bytes. */ bfd_boolean includes_filehdr, bfd_boolean includes_phdrs, unsigned int count, asection **secs) { struct elf_segment_map *m, **pm; - bfd_size_type amt; + size_t amt; + unsigned int opb = bfd_octets_per_byte (abfd, NULL); if (bfd_get_flavour (abfd) != bfd_target_elf_flavour) return TRUE; @@ -2182,7 +2188,7 @@ bfd_record_phdr (bfd *abfd, m->p_type = type; m->p_flags = flags; - m->p_paddr = at; + m->p_paddr = at * opb; m->p_flags_valid = flags_valid; m->p_paddr_valid = at_valid; m->includes_filehdr = includes_filehdr; @@ -2768,7 +2774,7 @@ bfd_convert_section_contents (bfd *ibfd, sec_ptr isec, bfd *obfd, || bfd_get_flavour (obfd) != bfd_target_elf_flavour) return TRUE; - /* Do nothing if ELF classes of input and output are the same. */ + /* Do nothing if ELF classes of input and output are the same. */ if (get_elf_backend_data (ibfd)->s->elfclass == get_elf_backend_data (obfd)->s->elfclass) return TRUE; @@ -2782,11 +2788,17 @@ bfd_convert_section_contents (bfd *ibfd, sec_ptr isec, bfd *obfd, if ((ibfd->flags & BFD_DECOMPRESS)) return TRUE; - /* Do nothing if the input section isn't a SHF_COMPRESSED section. */ + /* Do nothing if the input section isn't a SHF_COMPRESSED section. */ ihdr_size = bfd_get_compression_header_size (ibfd, isec); if (ihdr_size == 0) return TRUE; + /* PR 25221. Check for corrupt input sections. */ + if (ihdr_size > bfd_get_section_limit (ibfd, isec)) + /* FIXME: Issue a warning about a corrupt + compression header size field ? */ + return FALSE; + contents = *ptr; /* Convert the contents of the input SHF_COMPRESSED section to @@ -2803,6 +2815,12 @@ bfd_convert_section_contents (bfd *ibfd, sec_ptr isec, bfd *obfd, use_memmove = FALSE; } + else if (ihdr_size != sizeof (Elf64_External_Chdr)) + { + /* FIXME: Issue a warning about a corrupt + compression header size field ? */ + return FALSE; + } else { Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) contents;