Skip to content

Commit a3248b5

Browse files
committed
libdrgn: fix use after free when formatting compound types
compound_initializer_init_next() saves a pointer to the compound initializer stack and uses it after appending to the stack, which may have reallocated the stack.
1 parent ecef9d7 commit a3248b5

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

libdrgn/language_c.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,6 +1007,7 @@ compound_initializer_iter_next(struct initializer_iter *iter_,
10071007
struct compound_initializer_iter *iter =
10081008
container_of(iter_, struct compound_initializer_iter, iter);
10091009
struct compound_initializer_state *top;
1010+
uint64_t bit_offset;
10101011
struct drgn_type_member *member;
10111012
struct drgn_qualified_type member_type;
10121013

@@ -1022,6 +1023,7 @@ compound_initializer_iter_next(struct initializer_iter *iter_,
10221023
continue;
10231024
}
10241025

1026+
bit_offset = top->bit_offset;
10251027
member = top->member++;
10261028
err = drgn_member_type(member, &member_type);
10271029
if (err)
@@ -1037,7 +1039,7 @@ compound_initializer_iter_next(struct initializer_iter *iter_,
10371039
!(iter->flags & DRGN_FORMAT_OBJECT_MEMBER_NAMES) ||
10381040
!drgn_type_has_members(member_type.type)) {
10391041
err = drgn_object_slice(obj_ret, iter->obj, member_type,
1040-
top->bit_offset + member->bit_offset,
1042+
bit_offset + member->bit_offset,
10411043
member->bit_field_size);
10421044
if (err)
10431045
return err;
@@ -1062,7 +1064,7 @@ compound_initializer_iter_next(struct initializer_iter *iter_,
10621064
return &drgn_enomem;
10631065
new->member = drgn_type_members(member_type.type);
10641066
new->end = new->member + drgn_type_num_members(member_type.type);
1065-
new->bit_offset = top->bit_offset + member->bit_offset;
1067+
new->bit_offset = bit_offset + member->bit_offset;
10661068
}
10671069

10681070
*flags_ret = iter->member_flags;

0 commit comments

Comments
 (0)