summaryrefslogtreecommitdiff
path: root/binutils/coffgrok.h
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2015-01-06 16:06:45 +0000
committerNick Clifton <nickc@redhat.com>2015-01-06 16:06:45 +0000
commit85880250e591a51624d24db653aaace0c5ce5943 (patch)
tree0319d173921cd8ec36f007e0270dc883a30e8336 /binutils/coffgrok.h
parentfce10a8494efa8faec67b718f25e06d3d71694b3 (diff)
downloadbinutils-gdb-85880250e591a51624d24db653aaace0c5ce5943.tar.gz
Fixes for memory access violations in the coffdump program.
PR binutils/17512 * coffdump.c (dump_coff_section): Check for a symbol being available before printing its name. (main): Check the return value from coff_grok. * coffgrok.c: Reformat and tidy. Add range checks to most functions. (coff_grok): Return NULL if the input bfd is not in a COFF format. * coffgrok.h: Reformat and tidy. (struct coff_section): Change the nrelocs field to unsigned. * srconv.c (main): Check the return value from coff_grok. * coff-i860.c (CALC_ADDEND): Always set an addend value. * tekhex.c (getvalue): Add an end pointer parameter. Use it to avoid reading off the end of the buffer. (getsym): Likewise. (first_phase): Likewise. (pass_over): Pass an end pointer to the invoked function.
Diffstat (limited to 'binutils/coffgrok.h')
-rw-r--r--binutils/coffgrok.h255
1 files changed, 125 insertions, 130 deletions
diff --git a/binutils/coffgrok.h b/binutils/coffgrok.h
index 61384a82c9f..d08a1a41015 100644
--- a/binutils/coffgrok.h
+++ b/binutils/coffgrok.h
@@ -19,22 +19,22 @@
MA 02110-1301, USA. */
#define T_NULL 0
-#define T_VOID 1 /* function argument (only used by compiler) */
-#define T_CHAR 2 /* character */
-#define T_SHORT 3 /* short integer */
-#define T_INT 4 /* integer */
-#define T_LONG 5 /* long integer */
-#define T_FLOAT 6 /* floating point */
-#define T_DOUBLE 7 /* double word */
-#define T_STRUCT 8 /* structure */
-#define T_UNION 9 /* union */
-#define T_ENUM 10 /* enumeration */
-#define T_MOE 11 /* member of enumeration*/
-#define T_UCHAR 12 /* unsigned character */
-#define T_USHORT 13 /* unsigned short */
-#define T_UINT 14 /* unsigned integer */
-#define T_ULONG 15 /* unsigned long */
-#define T_LNGDBL 16 /* long double */
+#define T_VOID 1 /* Function argument (only used by compiler). */
+#define T_CHAR 2 /* Character */
+#define T_SHORT 3 /* Short integer */
+#define T_INT 4 /* Integer */
+#define T_LONG 5 /* Long integer */
+#define T_FLOAT 6 /* Floating point */
+#define T_DOUBLE 7 /* Double word */
+#define T_STRUCT 8 /* Structure */
+#define T_UNION 9 /* Union */
+#define T_ENUM 10 /* Enumeration */
+#define T_MOE 11 /* Member of enumeration*/
+#define T_UCHAR 12 /* Unsigned character */
+#define T_USHORT 13 /* Unsigned short */
+#define T_UINT 14 /* Unsigned integer */
+#define T_ULONG 15 /* Unsigned long */
+#define T_LNGDBL 16 /* Long double */
struct coff_reloc
@@ -51,7 +51,7 @@ struct coff_section
int data;
int address;
int number; /* 0..n, .text = 0 */
- int nrelocs;
+ unsigned int nrelocs;
int size;
struct coff_reloc *relocs;
struct bfd_section *bfd_section;
@@ -68,7 +68,8 @@ struct coff_ofile
struct coff_symbol *symbol_list_tail;
};
-struct coff_isection {
+struct coff_isection
+{
int low;
int high;
int init;
@@ -82,145 +83,139 @@ struct coff_sfile
struct coff_sfile *next;
/* Vector which maps where in each output section
- the input file has it's data */
+ the input file has it's data. */
struct coff_isection *section;
-
};
-
- struct coff_type
+struct coff_type
{
int size;
enum
{
coff_pointer_type, coff_function_type, coff_array_type, coff_structdef_type, coff_basic_type,
coff_structref_type, coff_enumref_type, coff_enumdef_type, coff_secdef_type
- } type;
+ } type;
+
union
{
struct
- {
+ {
int address;
int size;
} asecdef;
struct
- {
- int isstruct;
- struct coff_scope *elements;
- int idx;
- }
- astructdef;
+ {
+ int isstruct;
+ struct coff_scope *elements;
+ int idx;
+ } astructdef;
+
struct
- {
- struct coff_symbol *ref;
- } astructref;
+ {
+ struct coff_symbol *ref;
+ } astructref;
struct
- {
- struct coff_scope *elements;
- int idx;
- } aenumdef;
+ {
+ struct coff_scope *elements;
+ int idx;
+ } aenumdef;
+
struct
- {
- struct coff_symbol *ref;
- } aenumref;
+ {
+ struct coff_symbol *ref;
+ } aenumref;
struct
- {
- struct coff_type *points_to;
- } pointer;
+ {
+ struct coff_type *points_to;
+ } pointer;
+
struct
- {
- int dim;
- struct coff_type *array_of;
- } array;
+ {
+ int dim;
+ struct coff_type *array_of;
+ } array;
struct
- {
- struct coff_type *function_returns;
- struct coff_scope *parameters;
- struct coff_scope *code;
- struct coff_line *lines;
- } function;
+ {
+ struct coff_type * function_returns;
+ struct coff_scope * parameters;
+ struct coff_scope * code;
+ struct coff_line * lines;
+ } function;
+
int basic; /* One of T_VOID.. T_UINT */
- } u;
+ } u;
+};
+
+struct coff_line
+{
+ int nlines;
+ int * lines;
+ int * addresses;
};
+struct coff_scope
+{
+ struct coff_section * sec; /* Which section. */
+ int offset; /* Where. */
+ int size; /* How big. */
+ struct coff_scope * parent; /* One up. */
+ struct coff_scope * next; /* Next along. */
+ int nvars;
+ struct coff_symbol * vars_head; /* Symbols. */
+ struct coff_symbol * vars_tail;
+ struct coff_scope * list_head; /* Children. */
+ struct coff_scope * list_tail;
+};
+
+struct coff_visible
+{
+ enum coff_vis_type
+ {
+ coff_vis_ext_def,
+ coff_vis_ext_ref,
+ coff_vis_int_def,
+ coff_vis_common,
+ coff_vis_auto,
+ coff_vis_register,
+ coff_vis_tag,
+ coff_vis_member_of_struct,
+ coff_vis_member_of_enum,
+ coff_vis_autoparam,
+ coff_vis_regparam,
+ } type;
+};
+
+struct coff_where
+{
+ enum
+ {
+ coff_where_stack, coff_where_memory, coff_where_register, coff_where_unknown,
+ coff_where_strtag, coff_where_member_of_struct,
+ coff_where_member_of_enum, coff_where_entag, coff_where_typedef
+ } where;
+
+ int offset;
+ int bitoffset;
+ int bitsize;
+ struct coff_section *section;
+};
+
+struct coff_symbol
+{
+ char * name;
+ int tag;
+ struct coff_type * type;
+ struct coff_where * where;
+ struct coff_visible * visible;
+ struct coff_symbol * next;
+ struct coff_symbol * next_in_ofile_list; /* For the ofile list. */
+ int number;
+ int er_number;
+ struct coff_sfile * sfile;
+};
- struct coff_line
- {
- int nlines;
- int *lines;
- int *addresses;
- };
-
-
- struct coff_scope
- {
- struct coff_section *sec; /* What section */
- int offset; /* where */
- int size; /* How big */
- struct coff_scope *parent; /* one up */
-
- struct coff_scope *next; /*next along */
-
- int nvars;
-
- struct coff_symbol *vars_head; /* symbols */
- struct coff_symbol *vars_tail;
-
- struct coff_scope *list_head; /* children */
- struct coff_scope *list_tail;
-
- };
-
-
- struct coff_visible
- {
- enum coff_vis_type
- {
- coff_vis_ext_def,
- coff_vis_ext_ref,
- coff_vis_int_def,
- coff_vis_common,
- coff_vis_auto,
- coff_vis_register,
- coff_vis_tag,
- coff_vis_member_of_struct,
- coff_vis_member_of_enum,
- coff_vis_autoparam,
- coff_vis_regparam,
- } type;
- };
-
- struct coff_where
- {
- enum
- {
- coff_where_stack, coff_where_memory, coff_where_register, coff_where_unknown,
- coff_where_strtag, coff_where_member_of_struct,
- coff_where_member_of_enum, coff_where_entag, coff_where_typedef
-
- } where;
- int offset;
- int bitoffset;
- int bitsize;
- struct coff_section *section;
- };
-
- struct coff_symbol
- {
- char *name;
- int tag;
- struct coff_type *type;
- struct coff_where *where;
- struct coff_visible *visible;
- struct coff_symbol *next;
- struct coff_symbol *next_in_ofile_list; /* For the ofile list */
- int number;
- int er_number;
- struct coff_sfile *sfile;
- };
-
-struct coff_ofile *coff_grok (bfd *);
+struct coff_ofile * coff_grok (bfd *);