diff options
author | Nick Clifton <nickc@redhat.com> | 2015-06-30 17:12:47 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2015-06-30 17:12:47 +0100 |
commit | 5ee4a1ca16364c79f8717752ee9a9bd562580907 (patch) | |
tree | 31bfba06decc04d489288c9efd29d6ec5715abd8 | |
parent | 9916071f8df180400e39d1783d4a878cf57c61fe (diff) | |
download | gdb-5ee4a1ca16364c79f8717752ee9a9bd562580907.zip gdb-5ee4a1ca16364c79f8717752ee9a9bd562580907.tar.gz gdb-5ee4a1ca16364c79f8717752ee9a9bd562580907.tar.bz2 |
This fixes parsing a file containing ELF attributes with very large tag values.
PR binutils/18570
* elf-attrs.c (obj_attr_size): Use an unsigned int type for the tag.
(write_obj_attribute): Likewise.
(elf_new_obj_attr): Likewise.
(bfd_elf_get_obj_attr_int): Likewise.
(bfd_elf_add_obj_attr_int): Likewise.
(bfd_elf_add_obj_attr_string): Likewise.
(bfd_elf_add_obj_attr_int_string): Likewise.
(gnu_obj_attrs_arg_type): Likewise.
(_bfd_elf_obj_attrs_arg_type): Likewise.
(_bfd_elf_parse_attributes): Likewise.
(_bfd_elf_merge_unknown_attribute_list): Likewise.
* elf-bfd.h (struct obj_attribute_list): Likewise.
Update prototypes.
-rw-r--r-- | bfd/ChangeLog | 17 | ||||
-rw-r--r-- | bfd/elf-attrs.c | 25 | ||||
-rw-r--r-- | bfd/elf-bfd.h | 14 |
3 files changed, 37 insertions, 19 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index c4ff658..2dd71f2 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,20 @@ +2015-06-30 Nick Clifton <nickc@redhat.com> + + PR binutils/18570 + * elf-attrs.c (obj_attr_size): Use an unsigned int type for the tag. + (write_obj_attribute): Likewise. + (elf_new_obj_attr): Likewise. + (bfd_elf_get_obj_attr_int): Likewise. + (bfd_elf_add_obj_attr_int): Likewise. + (bfd_elf_add_obj_attr_string): Likewise. + (bfd_elf_add_obj_attr_int_string): Likewise. + (gnu_obj_attrs_arg_type): Likewise. + (_bfd_elf_obj_attrs_arg_type): Likewise. + (_bfd_elf_parse_attributes): Likewise. + (_bfd_elf_merge_unknown_attribute_list): Likewise. + * elf-bfd.h (struct obj_attribute_list): Likewise. + Update prototypes. + 2015-06-28 H.J. Lu <hongjiu.lu@intel.com> * bfd-in.h (compressed_debug_section_type): Remove diff --git a/bfd/elf-attrs.c b/bfd/elf-attrs.c index d06825e..ceafd44 100644 --- a/bfd/elf-attrs.c +++ b/bfd/elf-attrs.c @@ -54,7 +54,7 @@ is_default_attr (obj_attribute *attr) /* Return the size of a single attribute. */ static bfd_vma -obj_attr_size (int tag, obj_attribute *attr) +obj_attr_size (unsigned int tag, obj_attribute *attr) { bfd_vma size; @@ -143,7 +143,7 @@ write_uleb128 (bfd_byte *p, unsigned int val) /* Write attribute ATTR to butter P, and return a pointer to the following byte. */ static bfd_byte * -write_obj_attribute (bfd_byte *p, int tag, obj_attribute *attr) +write_obj_attribute (bfd_byte *p, unsigned int tag, obj_attribute *attr) { /* Suppress default entries. */ if (is_default_attr (attr)) @@ -189,7 +189,7 @@ vendor_set_obj_attr_contents (bfd *abfd, bfd_byte *contents, bfd_vma size, attr = elf_known_obj_attributes (abfd)[vendor]; for (i = LEAST_KNOWN_OBJ_ATTRIBUTE; i < NUM_KNOWN_OBJ_ATTRIBUTES; i++) { - int tag = i; + unsigned int tag = i; if (get_elf_backend_data (abfd)->obj_attrs_order) tag = get_elf_backend_data (abfd)->obj_attrs_order (i); p = write_obj_attribute (p, tag, &attr[tag]); @@ -227,7 +227,7 @@ bfd_elf_set_obj_attr_contents (bfd *abfd, bfd_byte *contents, bfd_vma size) /* Allocate/find an object attribute. */ static obj_attribute * -elf_new_obj_attr (bfd *abfd, int vendor, int tag) +elf_new_obj_attr (bfd *abfd, int vendor, unsigned int tag) { obj_attribute *attr; obj_attribute_list *list; @@ -265,7 +265,7 @@ elf_new_obj_attr (bfd *abfd, int vendor, int tag) /* Return the value of an integer object attribute. */ int -bfd_elf_get_obj_attr_int (bfd *abfd, int vendor, int tag) +bfd_elf_get_obj_attr_int (bfd *abfd, int vendor, unsigned int tag) { obj_attribute_list *p; @@ -291,7 +291,7 @@ bfd_elf_get_obj_attr_int (bfd *abfd, int vendor, int tag) /* Add an integer object attribute. */ void -bfd_elf_add_obj_attr_int (bfd *abfd, int vendor, int tag, unsigned int i) +bfd_elf_add_obj_attr_int (bfd *abfd, int vendor, unsigned int tag, unsigned int i) { obj_attribute *attr; @@ -314,7 +314,7 @@ _bfd_elf_attr_strdup (bfd *abfd, const char * s) /* Add a string object attribute. */ void -bfd_elf_add_obj_attr_string (bfd *abfd, int vendor, int tag, const char *s) +bfd_elf_add_obj_attr_string (bfd *abfd, int vendor, unsigned int tag, const char *s) { obj_attribute *attr; @@ -325,7 +325,8 @@ bfd_elf_add_obj_attr_string (bfd *abfd, int vendor, int tag, const char *s) /* Add a int+string object attribute. */ void -bfd_elf_add_obj_attr_int_string (bfd *abfd, int vendor, int tag, +bfd_elf_add_obj_attr_int_string (bfd *abfd, int vendor, + unsigned int tag, unsigned int i, const char *s) { obj_attribute *attr; @@ -394,7 +395,7 @@ _bfd_elf_copy_obj_attributes (bfd *ibfd, bfd *obfd) /* Determine whether a GNU object attribute tag takes an integer, a string or both. */ static int -gnu_obj_attrs_arg_type (int tag) +gnu_obj_attrs_arg_type (unsigned int tag) { /* Except for Tag_compatibility, for GNU attributes we follow the same rule ARM ones > 32 follow: odd-numbered tags take strings @@ -409,7 +410,7 @@ gnu_obj_attrs_arg_type (int tag) /* Determine what arguments an attribute tag takes. */ int -_bfd_elf_obj_attrs_arg_type (bfd *abfd, int vendor, int tag) +_bfd_elf_obj_attrs_arg_type (bfd *abfd, int vendor, unsigned int tag) { switch (vendor) { @@ -486,7 +487,7 @@ _bfd_elf_parse_attributes (bfd *abfd, Elf_Internal_Shdr * hdr) p += namelen; while (section_len > 0 && p < p_end) { - int tag; + unsigned int tag; unsigned int n; unsigned int val; bfd_vma subsection_len; @@ -666,7 +667,7 @@ _bfd_elf_merge_unknown_attribute_list (bfd *ibfd, bfd *obfd) for (; in_list || out_list; ) { bfd *err_bfd = NULL; - int err_tag = 0; + unsigned int err_tag = 0; /* The tags for each list are in numerical order. */ /* If the tags are equal, then merge. */ diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 06a3883..e08b2d6 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1549,7 +1549,7 @@ typedef struct obj_attribute typedef struct obj_attribute_list { struct obj_attribute_list *next; - int tag; + unsigned int tag; obj_attribute attr; } obj_attribute_list; @@ -2412,22 +2412,22 @@ extern bfd *_bfd_elf64_bfd_from_remote_memory extern bfd_vma bfd_elf_obj_attr_size (bfd *); extern void bfd_elf_set_obj_attr_contents (bfd *, bfd_byte *, bfd_vma); -extern int bfd_elf_get_obj_attr_int (bfd *, int, int); -extern void bfd_elf_add_obj_attr_int (bfd *, int, int, unsigned int); +extern int bfd_elf_get_obj_attr_int (bfd *, int, unsigned int); +extern void bfd_elf_add_obj_attr_int (bfd *, int, unsigned int, unsigned int); #define bfd_elf_add_proc_attr_int(BFD, TAG, VALUE) \ bfd_elf_add_obj_attr_int ((BFD), OBJ_ATTR_PROC, (TAG), (VALUE)) -extern void bfd_elf_add_obj_attr_string (bfd *, int, int, const char *); +extern void bfd_elf_add_obj_attr_string (bfd *, int, unsigned int, const char *); #define bfd_elf_add_proc_attr_string(BFD, TAG, VALUE) \ bfd_elf_add_obj_attr_string ((BFD), OBJ_ATTR_PROC, (TAG), (VALUE)) -extern void bfd_elf_add_obj_attr_int_string (bfd *, int, int, unsigned int, - const char *); +extern void bfd_elf_add_obj_attr_int_string (bfd *, int, unsigned int, + unsigned int, const char *); #define bfd_elf_add_proc_attr_int_string(BFD, TAG, INTVAL, STRVAL) \ bfd_elf_add_obj_attr_int_string ((BFD), OBJ_ATTR_PROC, (TAG), \ (INTVAL), (STRVAL)) extern char *_bfd_elf_attr_strdup (bfd *, const char *); extern void _bfd_elf_copy_obj_attributes (bfd *, bfd *); -extern int _bfd_elf_obj_attrs_arg_type (bfd *, int, int); +extern int _bfd_elf_obj_attrs_arg_type (bfd *, int, unsigned int); extern void _bfd_elf_parse_attributes (bfd *, Elf_Internal_Shdr *); extern bfd_boolean _bfd_elf_merge_object_attributes (bfd *, bfd *); extern bfd_boolean _bfd_elf_merge_unknown_attribute_low (bfd *, bfd *, int); |