aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerome Guitton <guitton@adacore.com>2009-02-04 17:46:36 +0000
committerJerome Guitton <guitton@adacore.com>2009-02-04 17:46:36 +0000
commitb53049714948aa8a041abd1c856960b91f94cd1c (patch)
tree2115956031379b5e081d63d089d84fb6c3abfa4c
parente94345ae4922a558b1f3ce56c80cd8bd48663a01 (diff)
downloadgdb-b53049714948aa8a041abd1c856960b91f94cd1c.zip
gdb-b53049714948aa8a041abd1c856960b91f94cd1c.tar.gz
gdb-b53049714948aa8a041abd1c856960b91f94cd1c.tar.bz2
* ada-lang.c (ada_template_to_fixed_record_type_1): Check size
of type to guard against a crash.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/ada-lang.c10
2 files changed, 14 insertions, 1 deletions
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 <guitton@adacore.com>
+
+ * ada-lang.c (ada_template_to_fixed_record_type_1): Check size
+ of type to guard against a crash.
+
2009-02-04 Jerome Guitton <guitton@adacore.com>
* 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;