This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Expand bitpos to LONGEST to allow access to large offsets within a struct


Hi,

If a struct member is at an offset greater than or equal to
0x10000000, the resulting bit position within the struct overflows and
causes an invalid access. The following program demonstrates this
problem:

-----------------------------------------------
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
 #define BSIZE (0x10000000)
 
 struct s {
 	char buf1[BSIZE];
 	char buf2[8];
 	char buf3[8];
 	char buf4[8];
 };
 
 int main()
 {
	struct s *p = malloc(sizeof(struct s));
 	memset(p,0,sizeof(struct s));
 	printf("%p %x\n", &p->buf2[0], p->buf2[0]);
 	return(0);
 }

-----------------------------------------------

Compile and run the program under gdb:

(gdb) b 18
Breakpoint 1 at 0x400554: file test.c, line 18.
(gdb) run
Starting program: /root/gdb/a.out
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x2aaaaaac7000

Breakpoint 1, main () at test.c:18
18              printf("%p %x\n", &p->buf2[0], p->buf2[0]);
(gdb) p p->buf2
Cannot access memory at address 0x2aaa9b022010

-----------------------------------------------

This happens because the bitpos in field_location within the struct
main_type.field is declared as an int, limiting it to just 4 bytes. I
have attached a patch that expands this to LONGEST and adjusted this
change in the code. The testsuite does not report any regressions due
to this patch and it fixes the problem.

Regards,
Siddhesh


gdb/ChangeLog:

2012-02-20  Siddhesh Poyarekar  <siddhesh@redhat.com>

	* gdbtypes.h (struct main_type.field.field_location): Expand
	bitpos to LONGEST.
	* value.h (modify_field): Adjust to accept LONGEST as bitpos.
	(value_primitive_field, val_print): Adjust to accept LONGEST as
	offset.
	* value.c (modify_field, value_primitive_field, val_print): Ditto.
	(value_bits_synthetic_pointer, value_bits_valid): Ditto.
	(unpack_value_bits_as_long_1): Ditto.
	* valprint.c (val_print_scalar_formatted, val_print): Ditto.
	* valprint.h (val_print_scalar_formatted): Ditto.
	* valops.c (search_struct_field, search_struct_method): Ditto.
	(value_struct_elt_for_reference, find_method_list): Ditto.
	* regcache.h (regcache_cooked_read_part): Ditto.
	(regcache_cooked_write_part): Ditto.
	* regcache.c (regcache_cooked_read_part): Ditto.
	(regcache_cooked_write_part, regcache_xfer_part): Ditto.
	* ax-gdb.c (gen_offset, gen_bitfield_ref):Ditto.
	(gen_primitive_ref, gen_struct_ref_recursive): Ditto.
	* ada-lang.c (ada_value_primitive_packed_val): Ditto.
	(ada_value_primitive_field, find_struct_field): Ditto.
	(ada_search_struct_field, ada_template_to_fixed_record_type_1):
	Ditto.
	* p-lang.c (is_pascal_string_type): Ditto.
	* mips-tdep.c (mips_xfer_register): Adjust to accept LONGEST as
	offset. Adjust format specifier for bitpos.
	(mips_n32n64_fp_arg_chunk_p): Adjust to accept LONGEST as offset.
	(mips_n32n64_return_value): Store bitpos in LONGEST.
	* sparc64-tdep.c (sparc64_store_floating_fields): Adjust to accept
	LONGEST as bitpos.
	(sparc64_extract_floating_fields): Ditto.
	* gdbtypes.c (recursive_dump_type): Adjust format specifier to
	print bitpos.
	* ada-typeprint.c (print_enum_type): Ditto.
	* c-typeprint.c (c_type_print_base): Ditto.
	* m2-typeprint.c (m2_enum): Ditto.
	* p-typeprint.c (pascal_type_print_base): Ditto.
	* language.h (struct language_defn): Adjust la_val_print to accept
	LONGEST as embedded_offset.
	* language.c (unk_lang_val_print): Adjust for change in
	la_val_print.
	* ada-lang.h (ada_val_print): Ditto.
	* ada-valprint.c (ada_val_print, ada_val_print_1): Ditto.
	(print_variant_part, print_field_values): Ditto.
	* c-lang.h (c_val_print): Ditto.
	* c-valprint.c (c_val_print): Ditto.
	* d-lang.h (d_val_print): Ditto.
	* d-valprint.c (d_val_print): Ditto.
	* f-lang.h (f_val_print): Ditto.
	* f-valprint.c (f_val_print): Ditto.
	* jv-lang.h (java_val_print): Ditto.
	* jv-valprint.c (java_val_print, java_print_value_fields): Ditto.
	* m2-lang.h (m2_val_print): Ditto.
	* m2-valprint.c (m2_print_array_contents, m2_val_print):Ditto.
	(m2_print_unbounded_array, m2_print_array_contents): Ditto.
	(m2_print_long_set): Ditto.
	* p-lang.h (pascal_val_print, is_pascal_string_type): Ditto.
	* p-valprint.c (pascal_val_print): Ditto.
	* eval.c (evaluate_struct_tuple): Expand bitsize and bitpos to
	LONGEST.

Attachment: gdb-longest-bitpos.patch
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]