parse-events: Fix segfault of print array processing
The reading of an element in an array assumed the arg was a field
type event though the arg could have been of a dynamic array type.
This caused a Seg fault when processing dynamic arrays.
Reported-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
diff --git a/parse-events.c b/parse-events.c
index 0f7b1f1..91d6788 100644
--- a/parse-events.c
+++ b/parse-events.c
@@ -2839,6 +2839,7 @@
struct print_arg *typearg = NULL;
struct print_arg *larg;
unsigned long offset;
+ unsigned int field_size;
switch (arg->type) {
case PRINT_NULL:
@@ -2885,6 +2886,9 @@
larg = larg->typecast.item;
}
+ /* Default to long size */
+ field_size = pevent->long_size;
+
switch (larg->type) {
case PRINT_DYNAMIC_ARRAY:
offset = pevent_read_number(pevent,
@@ -2905,6 +2909,7 @@
if (!larg->field.field)
die("field %s not found", larg->field.name);
}
+ field_size = larg->field.field->elementsize;
offset = larg->field.field->offset +
right * larg->field.field->elementsize;
break;
@@ -2912,7 +2917,7 @@
goto default_op; /* oops, all bets off */
}
val = pevent_read_number(pevent,
- data + offset, larg->field.field->elementsize);
+ data + offset, field_size);
if (typearg)
val = eval_type(val, typearg, 1);
break;