aboutsummaryrefslogtreecommitdiffstats
path: root/tools/lib
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung.kim@lge.com>2012-04-23 00:58:38 -0400
committerNamhyung Kim <namhyung@kernel.org>2012-07-04 00:40:31 -0400
commit0fed48341529716c38493be66591bda458921b75 (patch)
tree9064bbcee7545d37682d0c93436c08bb0382ee58 /tools/lib
parente54b34aed1c4082ed03f4d1f7a19276059b1e30a (diff)
tools lib traceevent: Check return value of arg_to_str()
The arg_to_str() can fail so we should handle that case properly. Signed-off-by: Namhyung Kim <namhyung.kim@lge.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Arnaldo Carvalho de Melo <acme@infradead.org> Cc: Borislav Petkov <bp@alien8.de> Cc: David Ahern <dsahern@gmail.com> Link: http://lkml.kernel.org/r/1335157118-14658-12-git-send-email-namhyung.kim@lge.com Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Diffstat (limited to 'tools/lib')
-rw-r--r--tools/lib/traceevent/parse-filter.c15
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);
2075out:
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
2130out:
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)