aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2005-07-05 09:38:45 +0000
committerJakub Jelinek <jakub@redhat.com>2005-07-05 09:38:45 +0000
commitc6c60d09fdd84b45d78a750a5d526faafe6f33a3 (patch)
tree3c08ffe4357bd05b1b2d36fc3afda537cd2ca2a6 /bfd/elf.c
parentdcd4b381c7371ece338a695fac50b3a4f2963016 (diff)
downloadgdb-c6c60d09fdd84b45d78a750a5d526faafe6f33a3.zip
gdb-c6c60d09fdd84b45d78a750a5d526faafe6f33a3.tar.gz
gdb-c6c60d09fdd84b45d78a750a5d526faafe6f33a3.tar.bz2
* elf.c (bfd_elf_get_str_section): Allocate an extra byte after
the end of strtab and clear it. (elf_read): Remove.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r--bfd/elf.c38
1 files changed, 15 insertions, 23 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index f141325..4470744 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -206,28 +206,6 @@ bfd_elf_hash (const char *namearg)
return h & 0xffffffff;
}
-/* Read a specified number of bytes at a specified offset in an ELF
- file, into a newly allocated buffer, and return a pointer to the
- buffer. */
-
-static bfd_byte *
-elf_read (bfd *abfd, file_ptr offset, bfd_size_type size)
-{
- bfd_byte *buf;
-
- if ((buf = bfd_alloc (abfd, size)) == NULL)
- return NULL;
- if (bfd_seek (abfd, offset, SEEK_SET) != 0)
- return NULL;
- if (bfd_bread (buf, size, abfd) != size)
- {
- if (bfd_get_error () != bfd_error_system_call)
- bfd_set_error (bfd_error_file_truncated);
- return NULL;
- }
- return buf;
-}
-
bfd_boolean
bfd_elf_mkobject (bfd *abfd)
{
@@ -267,7 +245,21 @@ bfd_elf_get_str_section (bfd *abfd, unsigned int shindex)
/* No cached one, attempt to read, and cache what we read. */
offset = i_shdrp[shindex]->sh_offset;
shstrtabsize = i_shdrp[shindex]->sh_size;
- shstrtab = elf_read (abfd, offset, shstrtabsize);
+
+ /* Allocate and clear an extra byte at the end, to prevent crashes
+ in case the string table is not terminated. */
+ if (shstrtabsize + 1 == 0
+ || (shstrtab = bfd_alloc (abfd, shstrtabsize + 1)) == NULL
+ || bfd_seek (abfd, offset, SEEK_SET) != 0)
+ shstrtab = NULL;
+ else if (bfd_bread (shstrtab, shstrtabsize, abfd) != shstrtabsize)
+ {
+ if (bfd_get_error () != bfd_error_system_call)
+ bfd_set_error (bfd_error_file_truncated);
+ shstrtab = NULL;
+ }
+ else
+ shstrtab[shstrtabsize] = '\0';
i_shdrp[shindex]->contents = shstrtab;
}
return (char *) shstrtab;