diff options
-rw-r--r-- | tools/lib/traceevent/parse-filter.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/tools/lib/traceevent/parse-filter.c b/tools/lib/traceevent/parse-filter.c index d54c2b4dbd9f..f020ac61f9c1 100644 --- a/tools/lib/traceevent/parse-filter.c +++ b/tools/lib/traceevent/parse-filter.c | |||
@@ -2026,11 +2026,13 @@ static char *exp_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
2026 | char *lstr; | 2026 | char *lstr; |
2027 | char *rstr; | 2027 | char *rstr; |
2028 | char *op; | 2028 | char *op; |
2029 | char *str; | 2029 | char *str = NULL; |
2030 | int len; | 2030 | int len; |
2031 | 2031 | ||
2032 | lstr = arg_to_str(filter, arg->exp.left); | 2032 | lstr = arg_to_str(filter, arg->exp.left); |
2033 | rstr = arg_to_str(filter, arg->exp.right); | 2033 | rstr = arg_to_str(filter, arg->exp.right); |
2034 | if (!lstr || !rstr) | ||
2035 | goto out; | ||
2034 | 2036 | ||
2035 | switch (arg->exp.type) { | 2037 | switch (arg->exp.type) { |
2036 | case FILTER_EXP_ADD: | 2038 | case FILTER_EXP_ADD: |
@@ -2070,6 +2072,7 @@ static char *exp_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
2070 | len = strlen(op) + strlen(lstr) + strlen(rstr) + 4; | 2072 | len = strlen(op) + strlen(lstr) + strlen(rstr) + 4; |
2071 | str = malloc_or_die(len); | 2073 | str = malloc_or_die(len); |
2072 | snprintf(str, len, "%s %s %s", lstr, op, rstr); | 2074 | snprintf(str, len, "%s %s %s", lstr, op, rstr); |
2075 | out: | ||
2073 | free(lstr); | 2076 | free(lstr); |
2074 | free(rstr); | 2077 | free(rstr); |
2075 | 2078 | ||
@@ -2086,6 +2089,8 @@ static char *num_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
2086 | 2089 | ||
2087 | lstr = arg_to_str(filter, arg->num.left); | 2090 | lstr = arg_to_str(filter, arg->num.left); |
2088 | rstr = arg_to_str(filter, arg->num.right); | 2091 | rstr = arg_to_str(filter, arg->num.right); |
2092 | if (!lstr || !rstr) | ||
2093 | goto out; | ||
2089 | 2094 | ||
2090 | switch (arg->num.type) { | 2095 | switch (arg->num.type) { |
2091 | case FILTER_CMP_EQ: | 2096 | case FILTER_CMP_EQ: |
@@ -2122,6 +2127,7 @@ static char *num_to_str(struct event_filter *filter, struct filter_arg *arg) | |||
2122 | break; | 2127 | break; |
2123 | } | 2128 | } |
2124 | 2129 | ||
2130 | out: | ||
2125 | free(lstr); | 2131 | free(lstr); |
2126 | free(rstr); | 2132 | free(rstr); |
2127 | return str; | 2133 | return str; |
@@ -2272,7 +2278,12 @@ int pevent_filter_compare(struct event_filter *filter1, struct event_filter *fil | |||
2272 | /* The best way to compare complex filters is with strings */ | 2278 | /* The best way to compare complex filters is with strings */ |
2273 | str1 = arg_to_str(filter1, filter_type1->filter); | 2279 | str1 = arg_to_str(filter1, filter_type1->filter); |
2274 | str2 = arg_to_str(filter2, filter_type2->filter); | 2280 | str2 = arg_to_str(filter2, filter_type2->filter); |
2275 | result = strcmp(str1, str2) != 0; | 2281 | if (str1 && str2) |
2282 | result = strcmp(str1, str2) != 0; | ||
2283 | else | ||
2284 | /* bail out if allocation fails */ | ||
2285 | result = 1; | ||
2286 | |||
2276 | free(str1); | 2287 | free(str1); |
2277 | free(str2); | 2288 | free(str2); |
2278 | if (result) | 2289 | if (result) |