aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2010-05-25 09:27:37 -0400
committerSteven Rostedt <rostedt@goodmis.org>2010-05-25 09:27:37 -0400
commit0a346bad14855356892142f6f2a683f63827a757 (patch)
tree23fe246b8de5ed599ac7516ca8a15dd0980ed63e
parent3c570c713da86adc56d655865b29da47a12c6005 (diff)
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>
-rw-r--r--parse-events.c7
1 files changed, 6 insertions, 1 deletions
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 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg
2839 struct print_arg *typearg = NULL; 2839 struct print_arg *typearg = NULL;
2840 struct print_arg *larg; 2840 struct print_arg *larg;
2841 unsigned long offset; 2841 unsigned long offset;
2842 unsigned int field_size;
2842 2843
2843 switch (arg->type) { 2844 switch (arg->type) {
2844 case PRINT_NULL: 2845 case PRINT_NULL:
@@ -2885,6 +2886,9 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg
2885 larg = larg->typecast.item; 2886 larg = larg->typecast.item;
2886 } 2887 }
2887 2888
2889 /* Default to long size */
2890 field_size = pevent->long_size;
2891
2888 switch (larg->type) { 2892 switch (larg->type) {
2889 case PRINT_DYNAMIC_ARRAY: 2893 case PRINT_DYNAMIC_ARRAY:
2890 offset = pevent_read_number(pevent, 2894 offset = pevent_read_number(pevent,
@@ -2905,6 +2909,7 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg
2905 if (!larg->field.field) 2909 if (!larg->field.field)
2906 die("field %s not found", larg->field.name); 2910 die("field %s not found", larg->field.name);
2907 } 2911 }
2912 field_size = larg->field.field->elementsize;
2908 offset = larg->field.field->offset + 2913 offset = larg->field.field->offset +
2909 right * larg->field.field->elementsize; 2914 right * larg->field.field->elementsize;
2910 break; 2915 break;
@@ -2912,7 +2917,7 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg
2912 goto default_op; /* oops, all bets off */ 2917 goto default_op; /* oops, all bets off */
2913 } 2918 }
2914 val = pevent_read_number(pevent, 2919 val = pevent_read_number(pevent,
2915 data + offset, larg->field.field->elementsize); 2920 data + offset, field_size);
2916 if (typearg) 2921 if (typearg)
2917 val = eval_type(val, typearg, 1); 2922 val = eval_type(val, typearg, 1);
2918 break; 2923 break;