diff options
author | Simon Marchi <simon.marchi@efficios.com> | 2020-05-19 14:20:23 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@efficios.com> | 2020-05-19 14:20:23 -0400 |
commit | f408d82c7a140268c3b7be35970c96d8385b5902 (patch) | |
tree | 7920efab8daf34e13bd9ddc8cce9c3d105935b0f | |
parent | 98c59b527b1472b87a9ee4959c4bfae85061bc1d (diff) | |
download | gdb-f408d82c7a140268c3b7be35970c96d8385b5902.zip gdb-f408d82c7a140268c3b7be35970c96d8385b5902.tar.gz gdb-f408d82c7a140268c3b7be35970c96d8385b5902.tar.bz2 |
gdb: fix off-by-one error in quirk_rust_enum
Found by inspection, so I don't have a test for it (I don't think it
would be easy to have this bug cause a failure reliably).
We allocate space for N fields into `new_fields`, then memcpy N fields
at `new_fields + 1`. This overflows the allocated buffer by one field.
Fix it by allocating `N + 1` fields.
gdb/ChangeLog:
* dwarf2/read.c (quirk_rust_enum): Allocate enough fields.
-rw-r--r-- | gdb/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/dwarf2/read.c | 2 |
2 files changed, 5 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f62557d..ac0beef 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2020-05-19 Simon Marchi <simon.marchi@efficios.com> + + * dwarf2/read.c (quirk_rust_enum): Allocate enough fields. + 2020-05-19 Pedro Alves <palves@redhat.com> * NEWS (set exec-file-mismatch): Adjust entry. diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 0c6182b..2ab7c5c 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -9420,7 +9420,7 @@ quirk_rust_enum (struct type *type, struct objfile *objfile) /* Make space for the discriminant field. */ struct field *disr_field = &TYPE_FIELD (disr_type, 0); field *new_fields - = (struct field *) TYPE_ZALLOC (type, (TYPE_NFIELDS (type) + = (struct field *) TYPE_ZALLOC (type, ((TYPE_NFIELDS (type) + 1) * sizeof (struct field))); memcpy (new_fields + 1, TYPE_FIELDS (type), TYPE_NFIELDS (type) * sizeof (struct field)); |