|
@@ -2026,11 +2026,13 @@ static char *exp_to_str(struct event_filter *filter, struct filter_arg *arg)
|
|
|
char *lstr;
|
|
|
char *rstr;
|
|
|
char *op;
|
|
|
- char *str;
|
|
|
+ char *str = NULL;
|
|
|
int len;
|
|
|
|
|
|
lstr = arg_to_str(filter, arg->exp.left);
|
|
|
rstr = arg_to_str(filter, arg->exp.right);
|
|
|
+ if (!lstr || !rstr)
|
|
|
+ goto out;
|
|
|
|
|
|
switch (arg->exp.type) {
|
|
|
case FILTER_EXP_ADD:
|
|
@@ -2070,6 +2072,7 @@ static char *exp_to_str(struct event_filter *filter, struct filter_arg *arg)
|
|
|
len = strlen(op) + strlen(lstr) + strlen(rstr) + 4;
|
|
|
str = malloc_or_die(len);
|
|
|
snprintf(str, len, "%s %s %s", lstr, op, rstr);
|
|
|
+out:
|
|
|
free(lstr);
|
|
|
free(rstr);
|
|
|
|
|
@@ -2086,6 +2089,8 @@ static char *num_to_str(struct event_filter *filter, struct filter_arg *arg)
|
|
|
|
|
|
lstr = arg_to_str(filter, arg->num.left);
|
|
|
rstr = arg_to_str(filter, arg->num.right);
|
|
|
+ if (!lstr || !rstr)
|
|
|
+ goto out;
|
|
|
|
|
|
switch (arg->num.type) {
|
|
|
case FILTER_CMP_EQ:
|
|
@@ -2122,6 +2127,7 @@ static char *num_to_str(struct event_filter *filter, struct filter_arg *arg)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
+out:
|
|
|
free(lstr);
|
|
|
free(rstr);
|
|
|
return str;
|
|
@@ -2272,7 +2278,12 @@ int pevent_filter_compare(struct event_filter *filter1, struct event_filter *fil
|
|
|
/* The best way to compare complex filters is with strings */
|
|
|
str1 = arg_to_str(filter1, filter_type1->filter);
|
|
|
str2 = arg_to_str(filter2, filter_type2->filter);
|
|
|
- result = strcmp(str1, str2) != 0;
|
|
|
+ if (str1 && str2)
|
|
|
+ result = strcmp(str1, str2) != 0;
|
|
|
+ else
|
|
|
+ /* bail out if allocation fails */
|
|
|
+ result = 1;
|
|
|
+
|
|
|
free(str1);
|
|
|
free(str2);
|
|
|
if (result)
|