From b53049714948aa8a041abd1c856960b91f94cd1c Mon Sep 17 00:00:00 2001 From: Jerome Guitton Date: Wed, 4 Feb 2009 17:46:36 +0000 Subject: [PATCH] * ada-lang.c (ada_template_to_fixed_record_type_1): Check size of type to guard against a crash. --- gdb/ChangeLog | 5 +++++ gdb/ada-lang.c | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 07d8565..04a11fc 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2008-02-04 Jerome Guitton + + * ada-lang.c (ada_template_to_fixed_record_type_1): Check size + of type to guard against a crash. + 2009-02-04 Jerome Guitton * value.c (value_from_contents_and_address): Always return diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 656e771..2552bff 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -6877,7 +6877,15 @@ ada_template_to_fixed_record_type_1 (struct type *type, else if (is_dynamic_field (type, f)) { if (dval0 == NULL) - dval = value_from_contents_and_address (rtype, valaddr, address); + { + /* rtype's length is computed based on the run-time + value of discriminants. If the discriminants are not + initialized, the type size may be completely bogus and + GDB may fail to allocate a value for it. So check the + size first before creating the value. */ + check_size (rtype); + dval = value_from_contents_and_address (rtype, valaddr, address); + } else dval = dval0; -- 2.7.4