mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 23:03:54 -06:00
linux-user: Allocate thunk size dynamically
We store all struct types in an array of static size without ever checking whether we overrun it. Of course some day someone (like me in another, ancient ALSA enabling patch set) will run into the limit without realizing it. So let's make the allocation dynamic. We already know the number of structs that we want to allocate, so we only need to pass the variable into the respective piece of code. Also, to ensure we don't accidently overwrite random memory, add some asserts to sanity check whether a thunk is actually part of our array. Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Riku Voipio <riku.voipio@linaro.org>
This commit is contained in:
parent
0a2df857a7
commit
8be656b87c
3 changed files with 18 additions and 5 deletions
16
thunk.c
16
thunk.c
|
@ -25,10 +25,8 @@
|
|||
|
||||
//#define DEBUG
|
||||
|
||||
#define MAX_STRUCTS 128
|
||||
|
||||
/* XXX: make it dynamic */
|
||||
StructEntry struct_entries[MAX_STRUCTS];
|
||||
static unsigned int max_struct_entries;
|
||||
StructEntry *struct_entries;
|
||||
|
||||
static const argtype *thunk_type_next_ptr(const argtype *type_ptr);
|
||||
|
||||
|
@ -70,6 +68,7 @@ void thunk_register_struct(int id, const char *name, const argtype *types)
|
|||
StructEntry *se;
|
||||
int nb_fields, offset, max_align, align, size, i, j;
|
||||
|
||||
assert(id < max_struct_entries);
|
||||
se = struct_entries + id;
|
||||
|
||||
/* first we count the number of fields */
|
||||
|
@ -117,6 +116,8 @@ void thunk_register_struct_direct(int id, const char *name,
|
|||
const StructEntry *se1)
|
||||
{
|
||||
StructEntry *se;
|
||||
|
||||
assert(id < max_struct_entries);
|
||||
se = struct_entries + id;
|
||||
*se = *se1;
|
||||
se->name = name;
|
||||
|
@ -244,6 +245,7 @@ const argtype *thunk_convert(void *dst, const void *src,
|
|||
const argtype *field_types;
|
||||
const int *dst_offsets, *src_offsets;
|
||||
|
||||
assert(*type_ptr < max_struct_entries);
|
||||
se = struct_entries + *type_ptr++;
|
||||
if (se->convert[0] != NULL) {
|
||||
/* specific conversion is needed */
|
||||
|
@ -314,3 +316,9 @@ int thunk_type_align_array(const argtype *type_ptr, int is_host)
|
|||
return thunk_type_align(type_ptr, is_host);
|
||||
}
|
||||
#endif /* ndef NO_THUNK_TYPE_SIZE */
|
||||
|
||||
void thunk_init(unsigned int max_structs)
|
||||
{
|
||||
max_struct_entries = max_structs;
|
||||
struct_entries = g_new0(StructEntry, max_structs);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue