tracing/filters: Always free pred on filter_add_subsystem_pred() failure
[deliverable/linux.git] / kernel / trace / trace_events_filter.c
1 /*
2 * trace_events_filter - generic event filtering
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 *
18 * Copyright (C) 2009 Tom Zanussi <tzanussi@gmail.com>
19 */
20
21 #include <linux/debugfs.h>
22 #include <linux/uaccess.h>
23 #include <linux/module.h>
24 #include <linux/ctype.h>
25 #include <linux/mutex.h>
26
27 #include "trace.h"
28 #include "trace_output.h"
29
30 enum filter_op_ids
31 {
32 OP_OR,
33 OP_AND,
34 OP_NE,
35 OP_EQ,
36 OP_LT,
37 OP_LE,
38 OP_GT,
39 OP_GE,
40 OP_NONE,
41 OP_OPEN_PAREN,
42 };
43
44 struct filter_op {
45 int id;
46 char *string;
47 int precedence;
48 };
49
50 static struct filter_op filter_ops[] = {
51 { OP_OR, "||", 1 },
52 { OP_AND, "&&", 2 },
53 { OP_NE, "!=", 4 },
54 { OP_EQ, "==", 4 },
55 { OP_LT, "<", 5 },
56 { OP_LE, "<=", 5 },
57 { OP_GT, ">", 5 },
58 { OP_GE, ">=", 5 },
59 { OP_NONE, "OP_NONE", 0 },
60 { OP_OPEN_PAREN, "(", 0 },
61 };
62
63 enum {
64 FILT_ERR_NONE,
65 FILT_ERR_INVALID_OP,
66 FILT_ERR_UNBALANCED_PAREN,
67 FILT_ERR_TOO_MANY_OPERANDS,
68 FILT_ERR_OPERAND_TOO_LONG,
69 FILT_ERR_FIELD_NOT_FOUND,
70 FILT_ERR_ILLEGAL_FIELD_OP,
71 FILT_ERR_ILLEGAL_INTVAL,
72 FILT_ERR_BAD_SUBSYS_FILTER,
73 FILT_ERR_TOO_MANY_PREDS,
74 FILT_ERR_MISSING_FIELD,
75 FILT_ERR_INVALID_FILTER,
76 };
77
78 static char *err_text[] = {
79 "No error",
80 "Invalid operator",
81 "Unbalanced parens",
82 "Too many operands",
83 "Operand too long",
84 "Field not found",
85 "Illegal operation for field type",
86 "Illegal integer value",
87 "Couldn't find or set field in one of a subsystem's events",
88 "Too many terms in predicate expression",
89 "Missing field name and/or value",
90 "Meaningless filter expression",
91 };
92
93 struct opstack_op {
94 int op;
95 struct list_head list;
96 };
97
98 struct postfix_elt {
99 int op;
100 char *operand;
101 struct list_head list;
102 };
103
104 struct filter_parse_state {
105 struct filter_op *ops;
106 struct list_head opstack;
107 struct list_head postfix;
108 int lasterr;
109 int lasterr_pos;
110
111 struct {
112 char *string;
113 unsigned int cnt;
114 unsigned int tail;
115 } infix;
116
117 struct {
118 char string[MAX_FILTER_STR_VAL];
119 int pos;
120 unsigned int tail;
121 } operand;
122 };
123
124 DEFINE_COMPARISON_PRED(s64);
125 DEFINE_COMPARISON_PRED(u64);
126 DEFINE_COMPARISON_PRED(s32);
127 DEFINE_COMPARISON_PRED(u32);
128 DEFINE_COMPARISON_PRED(s16);
129 DEFINE_COMPARISON_PRED(u16);
130 DEFINE_COMPARISON_PRED(s8);
131 DEFINE_COMPARISON_PRED(u8);
132
133 DEFINE_EQUALITY_PRED(64);
134 DEFINE_EQUALITY_PRED(32);
135 DEFINE_EQUALITY_PRED(16);
136 DEFINE_EQUALITY_PRED(8);
137
138 static int filter_pred_and(struct filter_pred *pred __attribute((unused)),
139 void *event __attribute((unused)),
140 int val1, int val2)
141 {
142 return val1 && val2;
143 }
144
145 static int filter_pred_or(struct filter_pred *pred __attribute((unused)),
146 void *event __attribute((unused)),
147 int val1, int val2)
148 {
149 return val1 || val2;
150 }
151
152 /* Filter predicate for fixed sized arrays of characters */
153 static int filter_pred_string(struct filter_pred *pred, void *event,
154 int val1, int val2)
155 {
156 char *addr = (char *)(event + pred->offset);
157 int cmp, match;
158
159 cmp = strncmp(addr, pred->str_val, pred->str_len);
160
161 match = (!cmp) ^ pred->not;
162
163 return match;
164 }
165
166 /*
167 * Filter predicate for dynamic sized arrays of characters.
168 * These are implemented through a list of strings at the end
169 * of the entry.
170 * Also each of these strings have a field in the entry which
171 * contains its offset from the beginning of the entry.
172 * We have then first to get this field, dereference it
173 * and add it to the address of the entry, and at last we have
174 * the address of the string.
175 */
176 static int filter_pred_strloc(struct filter_pred *pred, void *event,
177 int val1, int val2)
178 {
179 unsigned short str_loc = *(unsigned short *)(event + pred->offset);
180 char *addr = (char *)(event + str_loc);
181 int cmp, match;
182
183 cmp = strncmp(addr, pred->str_val, pred->str_len);
184
185 match = (!cmp) ^ pred->not;
186
187 return match;
188 }
189
190 static int filter_pred_none(struct filter_pred *pred, void *event,
191 int val1, int val2)
192 {
193 return 0;
194 }
195
196 /* return 1 if event matches, 0 otherwise (discard) */
197 int filter_match_preds(struct ftrace_event_call *call, void *rec)
198 {
199 struct event_filter *filter = call->filter;
200 int match, top = 0, val1 = 0, val2 = 0;
201 int stack[MAX_FILTER_PRED];
202 struct filter_pred *pred;
203 int i;
204
205 for (i = 0; i < filter->n_preds; i++) {
206 pred = filter->preds[i];
207 if (!pred->pop_n) {
208 match = pred->fn(pred, rec, val1, val2);
209 stack[top++] = match;
210 continue;
211 }
212 if (pred->pop_n > top) {
213 WARN_ON_ONCE(1);
214 return 0;
215 }
216 val1 = stack[--top];
217 val2 = stack[--top];
218 match = pred->fn(pred, rec, val1, val2);
219 stack[top++] = match;
220 }
221
222 return stack[--top];
223 }
224 EXPORT_SYMBOL_GPL(filter_match_preds);
225
226 static void parse_error(struct filter_parse_state *ps, int err, int pos)
227 {
228 ps->lasterr = err;
229 ps->lasterr_pos = pos;
230 }
231
232 static void remove_filter_string(struct event_filter *filter)
233 {
234 kfree(filter->filter_string);
235 filter->filter_string = NULL;
236 }
237
238 static int replace_filter_string(struct event_filter *filter,
239 char *filter_string)
240 {
241 kfree(filter->filter_string);
242 filter->filter_string = kstrdup(filter_string, GFP_KERNEL);
243 if (!filter->filter_string)
244 return -ENOMEM;
245
246 return 0;
247 }
248
249 static int append_filter_string(struct event_filter *filter,
250 char *string)
251 {
252 int newlen;
253 char *new_filter_string;
254
255 BUG_ON(!filter->filter_string);
256 newlen = strlen(filter->filter_string) + strlen(string) + 1;
257 new_filter_string = kmalloc(newlen, GFP_KERNEL);
258 if (!new_filter_string)
259 return -ENOMEM;
260
261 strcpy(new_filter_string, filter->filter_string);
262 strcat(new_filter_string, string);
263 kfree(filter->filter_string);
264 filter->filter_string = new_filter_string;
265
266 return 0;
267 }
268
269 static void append_filter_err(struct filter_parse_state *ps,
270 struct event_filter *filter)
271 {
272 int pos = ps->lasterr_pos;
273 char *buf, *pbuf;
274
275 buf = (char *)__get_free_page(GFP_TEMPORARY);
276 if (!buf)
277 return;
278
279 append_filter_string(filter, "\n");
280 memset(buf, ' ', PAGE_SIZE);
281 if (pos > PAGE_SIZE - 128)
282 pos = 0;
283 buf[pos] = '^';
284 pbuf = &buf[pos] + 1;
285
286 sprintf(pbuf, "\nparse_error: %s\n", err_text[ps->lasterr]);
287 append_filter_string(filter, buf);
288 free_page((unsigned long) buf);
289 }
290
291 void print_event_filter(struct ftrace_event_call *call, struct trace_seq *s)
292 {
293 struct event_filter *filter = call->filter;
294
295 mutex_lock(&event_mutex);
296 if (filter->filter_string)
297 trace_seq_printf(s, "%s\n", filter->filter_string);
298 else
299 trace_seq_printf(s, "none\n");
300 mutex_unlock(&event_mutex);
301 }
302
303 void print_subsystem_event_filter(struct event_subsystem *system,
304 struct trace_seq *s)
305 {
306 struct event_filter *filter = system->filter;
307
308 mutex_lock(&event_mutex);
309 if (filter->filter_string)
310 trace_seq_printf(s, "%s\n", filter->filter_string);
311 else
312 trace_seq_printf(s, "none\n");
313 mutex_unlock(&event_mutex);
314 }
315
316 static struct ftrace_event_field *
317 find_event_field(struct ftrace_event_call *call, char *name)
318 {
319 struct ftrace_event_field *field;
320
321 list_for_each_entry(field, &call->fields, link) {
322 if (!strcmp(field->name, name))
323 return field;
324 }
325
326 return NULL;
327 }
328
329 static void filter_free_pred(struct filter_pred *pred)
330 {
331 if (!pred)
332 return;
333
334 kfree(pred->field_name);
335 kfree(pred);
336 }
337
338 static void filter_clear_pred(struct filter_pred *pred)
339 {
340 kfree(pred->field_name);
341 pred->field_name = NULL;
342 pred->str_len = 0;
343 }
344
345 static int filter_set_pred(struct filter_pred *dest,
346 struct filter_pred *src,
347 filter_pred_fn_t fn)
348 {
349 *dest = *src;
350 if (src->field_name) {
351 dest->field_name = kstrdup(src->field_name, GFP_KERNEL);
352 if (!dest->field_name)
353 return -ENOMEM;
354 }
355 dest->fn = fn;
356
357 return 0;
358 }
359
360 static void filter_disable_preds(struct ftrace_event_call *call)
361 {
362 struct event_filter *filter = call->filter;
363 int i;
364
365 call->filter_active = 0;
366 filter->n_preds = 0;
367
368 for (i = 0; i < MAX_FILTER_PRED; i++)
369 filter->preds[i]->fn = filter_pred_none;
370 }
371
372 void destroy_preds(struct ftrace_event_call *call)
373 {
374 struct event_filter *filter = call->filter;
375 int i;
376
377 for (i = 0; i < MAX_FILTER_PRED; i++) {
378 if (filter->preds[i])
379 filter_free_pred(filter->preds[i]);
380 }
381 kfree(filter->preds);
382 kfree(filter->filter_string);
383 kfree(filter);
384 call->filter = NULL;
385 }
386
387 int init_preds(struct ftrace_event_call *call)
388 {
389 struct event_filter *filter;
390 struct filter_pred *pred;
391 int i;
392
393 filter = call->filter = kzalloc(sizeof(*filter), GFP_KERNEL);
394 if (!call->filter)
395 return -ENOMEM;
396
397 call->filter_active = 0;
398 filter->n_preds = 0;
399
400 filter->preds = kzalloc(MAX_FILTER_PRED * sizeof(pred), GFP_KERNEL);
401 if (!filter->preds)
402 goto oom;
403
404 for (i = 0; i < MAX_FILTER_PRED; i++) {
405 pred = kzalloc(sizeof(*pred), GFP_KERNEL);
406 if (!pred)
407 goto oom;
408 pred->fn = filter_pred_none;
409 filter->preds[i] = pred;
410 }
411
412 return 0;
413
414 oom:
415 destroy_preds(call);
416
417 return -ENOMEM;
418 }
419 EXPORT_SYMBOL_GPL(init_preds);
420
421 static void filter_free_subsystem_preds(struct event_subsystem *system)
422 {
423 struct event_filter *filter = system->filter;
424 struct ftrace_event_call *call;
425 int i;
426
427 if (filter->n_preds) {
428 for (i = 0; i < filter->n_preds; i++)
429 filter_free_pred(filter->preds[i]);
430 kfree(filter->preds);
431 filter->preds = NULL;
432 filter->n_preds = 0;
433 }
434
435 list_for_each_entry(call, &ftrace_events, list) {
436 if (!call->define_fields)
437 continue;
438
439 if (!strcmp(call->system, system->name)) {
440 filter_disable_preds(call);
441 remove_filter_string(call->filter);
442 }
443 }
444 }
445
446 static int filter_add_pred_fn(struct filter_parse_state *ps,
447 struct ftrace_event_call *call,
448 struct filter_pred *pred,
449 filter_pred_fn_t fn)
450 {
451 struct event_filter *filter = call->filter;
452 int idx, err;
453
454 if (filter->n_preds == MAX_FILTER_PRED) {
455 parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
456 return -ENOSPC;
457 }
458
459 idx = filter->n_preds;
460 filter_clear_pred(filter->preds[idx]);
461 err = filter_set_pred(filter->preds[idx], pred, fn);
462 if (err)
463 return err;
464
465 filter->n_preds++;
466 call->filter_active = 1;
467
468 return 0;
469 }
470
471 enum {
472 FILTER_STATIC_STRING = 1,
473 FILTER_DYN_STRING
474 };
475
476 static int is_string_field(const char *type)
477 {
478 if (strstr(type, "__data_loc") && strstr(type, "char"))
479 return FILTER_DYN_STRING;
480
481 if (strchr(type, '[') && strstr(type, "char"))
482 return FILTER_STATIC_STRING;
483
484 return 0;
485 }
486
487 static int is_legal_op(struct ftrace_event_field *field, int op)
488 {
489 if (is_string_field(field->type) && (op != OP_EQ && op != OP_NE))
490 return 0;
491
492 return 1;
493 }
494
495 static filter_pred_fn_t select_comparison_fn(int op, int field_size,
496 int field_is_signed)
497 {
498 filter_pred_fn_t fn = NULL;
499
500 switch (field_size) {
501 case 8:
502 if (op == OP_EQ || op == OP_NE)
503 fn = filter_pred_64;
504 else if (field_is_signed)
505 fn = filter_pred_s64;
506 else
507 fn = filter_pred_u64;
508 break;
509 case 4:
510 if (op == OP_EQ || op == OP_NE)
511 fn = filter_pred_32;
512 else if (field_is_signed)
513 fn = filter_pred_s32;
514 else
515 fn = filter_pred_u32;
516 break;
517 case 2:
518 if (op == OP_EQ || op == OP_NE)
519 fn = filter_pred_16;
520 else if (field_is_signed)
521 fn = filter_pred_s16;
522 else
523 fn = filter_pred_u16;
524 break;
525 case 1:
526 if (op == OP_EQ || op == OP_NE)
527 fn = filter_pred_8;
528 else if (field_is_signed)
529 fn = filter_pred_s8;
530 else
531 fn = filter_pred_u8;
532 break;
533 }
534
535 return fn;
536 }
537
538 static int filter_add_pred(struct filter_parse_state *ps,
539 struct ftrace_event_call *call,
540 struct filter_pred *pred)
541 {
542 struct ftrace_event_field *field;
543 filter_pred_fn_t fn;
544 unsigned long long val;
545 int string_type;
546 int ret;
547
548 pred->fn = filter_pred_none;
549
550 if (pred->op == OP_AND) {
551 pred->pop_n = 2;
552 return filter_add_pred_fn(ps, call, pred, filter_pred_and);
553 } else if (pred->op == OP_OR) {
554 pred->pop_n = 2;
555 return filter_add_pred_fn(ps, call, pred, filter_pred_or);
556 }
557
558 field = find_event_field(call, pred->field_name);
559 if (!field) {
560 parse_error(ps, FILT_ERR_FIELD_NOT_FOUND, 0);
561 return -EINVAL;
562 }
563
564 pred->offset = field->offset;
565
566 if (!is_legal_op(field, pred->op)) {
567 parse_error(ps, FILT_ERR_ILLEGAL_FIELD_OP, 0);
568 return -EINVAL;
569 }
570
571 string_type = is_string_field(field->type);
572 if (string_type) {
573 if (string_type == FILTER_STATIC_STRING)
574 fn = filter_pred_string;
575 else
576 fn = filter_pred_strloc;
577 pred->str_len = field->size;
578 if (pred->op == OP_NE)
579 pred->not = 1;
580 return filter_add_pred_fn(ps, call, pred, fn);
581 } else {
582 if (field->is_signed)
583 ret = strict_strtoll(pred->str_val, 0, &val);
584 else
585 ret = strict_strtoull(pred->str_val, 0, &val);
586 if (ret) {
587 parse_error(ps, FILT_ERR_ILLEGAL_INTVAL, 0);
588 return -EINVAL;
589 }
590 pred->val = val;
591 }
592
593 fn = select_comparison_fn(pred->op, field->size, field->is_signed);
594 if (!fn) {
595 parse_error(ps, FILT_ERR_INVALID_OP, 0);
596 return -EINVAL;
597 }
598
599 if (pred->op == OP_NE)
600 pred->not = 1;
601
602 return filter_add_pred_fn(ps, call, pred, fn);
603 }
604
605 static int filter_add_subsystem_pred(struct filter_parse_state *ps,
606 struct event_subsystem *system,
607 struct filter_pred *pred,
608 char *filter_string)
609 {
610 struct event_filter *filter = system->filter;
611 struct ftrace_event_call *call;
612 int err = 0;
613
614 if (!filter->preds) {
615 filter->preds = kzalloc(MAX_FILTER_PRED * sizeof(pred),
616 GFP_KERNEL);
617
618 if (!filter->preds)
619 return -ENOMEM;
620 }
621
622 if (filter->n_preds == MAX_FILTER_PRED) {
623 parse_error(ps, FILT_ERR_TOO_MANY_PREDS, 0);
624 return -ENOSPC;
625 }
626
627 list_for_each_entry(call, &ftrace_events, list) {
628
629 if (!call->define_fields)
630 continue;
631
632 if (strcmp(call->system, system->name))
633 continue;
634
635 err = filter_add_pred(ps, call, pred);
636 if (err) {
637 filter_free_subsystem_preds(system);
638 parse_error(ps, FILT_ERR_BAD_SUBSYS_FILTER, 0);
639 goto out;
640 }
641 replace_filter_string(call->filter, filter_string);
642 }
643
644 filter->preds[filter->n_preds] = pred;
645 filter->n_preds++;
646 out:
647 return err;
648 }
649
650 static void parse_init(struct filter_parse_state *ps,
651 struct filter_op *ops,
652 char *infix_string)
653 {
654 memset(ps, '\0', sizeof(*ps));
655
656 ps->infix.string = infix_string;
657 ps->infix.cnt = strlen(infix_string);
658 ps->ops = ops;
659
660 INIT_LIST_HEAD(&ps->opstack);
661 INIT_LIST_HEAD(&ps->postfix);
662 }
663
664 static char infix_next(struct filter_parse_state *ps)
665 {
666 ps->infix.cnt--;
667
668 return ps->infix.string[ps->infix.tail++];
669 }
670
671 static char infix_peek(struct filter_parse_state *ps)
672 {
673 if (ps->infix.tail == strlen(ps->infix.string))
674 return 0;
675
676 return ps->infix.string[ps->infix.tail];
677 }
678
679 static void infix_advance(struct filter_parse_state *ps)
680 {
681 ps->infix.cnt--;
682 ps->infix.tail++;
683 }
684
685 static inline int is_precedence_lower(struct filter_parse_state *ps,
686 int a, int b)
687 {
688 return ps->ops[a].precedence < ps->ops[b].precedence;
689 }
690
691 static inline int is_op_char(struct filter_parse_state *ps, char c)
692 {
693 int i;
694
695 for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
696 if (ps->ops[i].string[0] == c)
697 return 1;
698 }
699
700 return 0;
701 }
702
703 static int infix_get_op(struct filter_parse_state *ps, char firstc)
704 {
705 char nextc = infix_peek(ps);
706 char opstr[3];
707 int i;
708
709 opstr[0] = firstc;
710 opstr[1] = nextc;
711 opstr[2] = '\0';
712
713 for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
714 if (!strcmp(opstr, ps->ops[i].string)) {
715 infix_advance(ps);
716 return ps->ops[i].id;
717 }
718 }
719
720 opstr[1] = '\0';
721
722 for (i = 0; strcmp(ps->ops[i].string, "OP_NONE"); i++) {
723 if (!strcmp(opstr, ps->ops[i].string))
724 return ps->ops[i].id;
725 }
726
727 return OP_NONE;
728 }
729
730 static inline void clear_operand_string(struct filter_parse_state *ps)
731 {
732 memset(ps->operand.string, '\0', MAX_FILTER_STR_VAL);
733 ps->operand.tail = 0;
734 }
735
736 static inline int append_operand_char(struct filter_parse_state *ps, char c)
737 {
738 if (ps->operand.tail == MAX_FILTER_STR_VAL - 1)
739 return -EINVAL;
740
741 ps->operand.string[ps->operand.tail++] = c;
742
743 return 0;
744 }
745
746 static int filter_opstack_push(struct filter_parse_state *ps, int op)
747 {
748 struct opstack_op *opstack_op;
749
750 opstack_op = kmalloc(sizeof(*opstack_op), GFP_KERNEL);
751 if (!opstack_op)
752 return -ENOMEM;
753
754 opstack_op->op = op;
755 list_add(&opstack_op->list, &ps->opstack);
756
757 return 0;
758 }
759
760 static int filter_opstack_empty(struct filter_parse_state *ps)
761 {
762 return list_empty(&ps->opstack);
763 }
764
765 static int filter_opstack_top(struct filter_parse_state *ps)
766 {
767 struct opstack_op *opstack_op;
768
769 if (filter_opstack_empty(ps))
770 return OP_NONE;
771
772 opstack_op = list_first_entry(&ps->opstack, struct opstack_op, list);
773
774 return opstack_op->op;
775 }
776
777 static int filter_opstack_pop(struct filter_parse_state *ps)
778 {
779 struct opstack_op *opstack_op;
780 int op;
781
782 if (filter_opstack_empty(ps))
783 return OP_NONE;
784
785 opstack_op = list_first_entry(&ps->opstack, struct opstack_op, list);
786 op = opstack_op->op;
787 list_del(&opstack_op->list);
788
789 kfree(opstack_op);
790
791 return op;
792 }
793
794 static void filter_opstack_clear(struct filter_parse_state *ps)
795 {
796 while (!filter_opstack_empty(ps))
797 filter_opstack_pop(ps);
798 }
799
800 static char *curr_operand(struct filter_parse_state *ps)
801 {
802 return ps->operand.string;
803 }
804
805 static int postfix_append_operand(struct filter_parse_state *ps, char *operand)
806 {
807 struct postfix_elt *elt;
808
809 elt = kmalloc(sizeof(*elt), GFP_KERNEL);
810 if (!elt)
811 return -ENOMEM;
812
813 elt->op = OP_NONE;
814 elt->operand = kstrdup(operand, GFP_KERNEL);
815 if (!elt->operand) {
816 kfree(elt);
817 return -ENOMEM;
818 }
819
820 list_add_tail(&elt->list, &ps->postfix);
821
822 return 0;
823 }
824
825 static int postfix_append_op(struct filter_parse_state *ps, int op)
826 {
827 struct postfix_elt *elt;
828
829 elt = kmalloc(sizeof(*elt), GFP_KERNEL);
830 if (!elt)
831 return -ENOMEM;
832
833 elt->op = op;
834 elt->operand = NULL;
835
836 list_add_tail(&elt->list, &ps->postfix);
837
838 return 0;
839 }
840
841 static void postfix_clear(struct filter_parse_state *ps)
842 {
843 struct postfix_elt *elt;
844
845 while (!list_empty(&ps->postfix)) {
846 elt = list_first_entry(&ps->postfix, struct postfix_elt, list);
847 kfree(elt->operand);
848 list_del(&elt->list);
849 }
850 }
851
852 static int filter_parse(struct filter_parse_state *ps)
853 {
854 int in_string = 0;
855 int op, top_op;
856 char ch;
857
858 while ((ch = infix_next(ps))) {
859 if (ch == '"') {
860 in_string ^= 1;
861 continue;
862 }
863
864 if (in_string)
865 goto parse_operand;
866
867 if (isspace(ch))
868 continue;
869
870 if (is_op_char(ps, ch)) {
871 op = infix_get_op(ps, ch);
872 if (op == OP_NONE) {
873 parse_error(ps, FILT_ERR_INVALID_OP, 0);
874 return -EINVAL;
875 }
876
877 if (strlen(curr_operand(ps))) {
878 postfix_append_operand(ps, curr_operand(ps));
879 clear_operand_string(ps);
880 }
881
882 while (!filter_opstack_empty(ps)) {
883 top_op = filter_opstack_top(ps);
884 if (!is_precedence_lower(ps, top_op, op)) {
885 top_op = filter_opstack_pop(ps);
886 postfix_append_op(ps, top_op);
887 continue;
888 }
889 break;
890 }
891
892 filter_opstack_push(ps, op);
893 continue;
894 }
895
896 if (ch == '(') {
897 filter_opstack_push(ps, OP_OPEN_PAREN);
898 continue;
899 }
900
901 if (ch == ')') {
902 if (strlen(curr_operand(ps))) {
903 postfix_append_operand(ps, curr_operand(ps));
904 clear_operand_string(ps);
905 }
906
907 top_op = filter_opstack_pop(ps);
908 while (top_op != OP_NONE) {
909 if (top_op == OP_OPEN_PAREN)
910 break;
911 postfix_append_op(ps, top_op);
912 top_op = filter_opstack_pop(ps);
913 }
914 if (top_op == OP_NONE) {
915 parse_error(ps, FILT_ERR_UNBALANCED_PAREN, 0);
916 return -EINVAL;
917 }
918 continue;
919 }
920 parse_operand:
921 if (append_operand_char(ps, ch)) {
922 parse_error(ps, FILT_ERR_OPERAND_TOO_LONG, 0);
923 return -EINVAL;
924 }
925 }
926
927 if (strlen(curr_operand(ps)))
928 postfix_append_operand(ps, curr_operand(ps));
929
930 while (!filter_opstack_empty(ps)) {
931 top_op = filter_opstack_pop(ps);
932 if (top_op == OP_NONE)
933 break;
934 if (top_op == OP_OPEN_PAREN) {
935 parse_error(ps, FILT_ERR_UNBALANCED_PAREN, 0);
936 return -EINVAL;
937 }
938 postfix_append_op(ps, top_op);
939 }
940
941 return 0;
942 }
943
944 static struct filter_pred *create_pred(int op, char *operand1, char *operand2)
945 {
946 struct filter_pred *pred;
947
948 pred = kzalloc(sizeof(*pred), GFP_KERNEL);
949 if (!pred)
950 return NULL;
951
952 pred->field_name = kstrdup(operand1, GFP_KERNEL);
953 if (!pred->field_name) {
954 kfree(pred);
955 return NULL;
956 }
957
958 strcpy(pred->str_val, operand2);
959 pred->str_len = strlen(operand2);
960
961 pred->op = op;
962
963 return pred;
964 }
965
966 static struct filter_pred *create_logical_pred(int op)
967 {
968 struct filter_pred *pred;
969
970 pred = kzalloc(sizeof(*pred), GFP_KERNEL);
971 if (!pred)
972 return NULL;
973
974 pred->op = op;
975
976 return pred;
977 }
978
979 static int check_preds(struct filter_parse_state *ps)
980 {
981 int n_normal_preds = 0, n_logical_preds = 0;
982 struct postfix_elt *elt;
983
984 list_for_each_entry(elt, &ps->postfix, list) {
985 if (elt->op == OP_NONE)
986 continue;
987
988 if (elt->op == OP_AND || elt->op == OP_OR) {
989 n_logical_preds++;
990 continue;
991 }
992 n_normal_preds++;
993 }
994
995 if (!n_normal_preds || n_logical_preds >= n_normal_preds) {
996 parse_error(ps, FILT_ERR_INVALID_FILTER, 0);
997 return -EINVAL;
998 }
999
1000 return 0;
1001 }
1002
1003 static int replace_preds(struct event_subsystem *system,
1004 struct ftrace_event_call *call,
1005 struct filter_parse_state *ps,
1006 char *filter_string)
1007 {
1008 char *operand1 = NULL, *operand2 = NULL;
1009 struct filter_pred *pred;
1010 struct postfix_elt *elt;
1011 int err;
1012
1013 err = check_preds(ps);
1014 if (err)
1015 return err;
1016
1017 list_for_each_entry(elt, &ps->postfix, list) {
1018 if (elt->op == OP_NONE) {
1019 if (!operand1)
1020 operand1 = elt->operand;
1021 else if (!operand2)
1022 operand2 = elt->operand;
1023 else {
1024 parse_error(ps, FILT_ERR_TOO_MANY_OPERANDS, 0);
1025 return -EINVAL;
1026 }
1027 continue;
1028 }
1029
1030 if (elt->op == OP_AND || elt->op == OP_OR) {
1031 pred = create_logical_pred(elt->op);
1032 if (!pred)
1033 return -ENOMEM;
1034 if (call) {
1035 err = filter_add_pred(ps, call, pred);
1036 filter_free_pred(pred);
1037 } else {
1038 err = filter_add_subsystem_pred(ps, system,
1039 pred, filter_string);
1040 if (err)
1041 filter_free_pred(pred);
1042 }
1043 if (err)
1044 return err;
1045
1046 operand1 = operand2 = NULL;
1047 continue;
1048 }
1049
1050 if (!operand1 || !operand2) {
1051 parse_error(ps, FILT_ERR_MISSING_FIELD, 0);
1052 return -EINVAL;
1053 }
1054
1055 pred = create_pred(elt->op, operand1, operand2);
1056 if (!pred)
1057 return -ENOMEM;
1058 if (call) {
1059 err = filter_add_pred(ps, call, pred);
1060 filter_free_pred(pred);
1061 } else {
1062 err = filter_add_subsystem_pred(ps, system, pred,
1063 filter_string);
1064 if (err)
1065 filter_free_pred(pred);
1066 }
1067 if (err)
1068 return err;
1069
1070 operand1 = operand2 = NULL;
1071 }
1072
1073 return 0;
1074 }
1075
1076 int apply_event_filter(struct ftrace_event_call *call, char *filter_string)
1077 {
1078 int err;
1079
1080 struct filter_parse_state *ps;
1081
1082 mutex_lock(&event_mutex);
1083
1084 if (!strcmp(strstrip(filter_string), "0")) {
1085 filter_disable_preds(call);
1086 remove_filter_string(call->filter);
1087 mutex_unlock(&event_mutex);
1088 return 0;
1089 }
1090
1091 err = -ENOMEM;
1092 ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1093 if (!ps)
1094 goto out_unlock;
1095
1096 filter_disable_preds(call);
1097 replace_filter_string(call->filter, filter_string);
1098
1099 parse_init(ps, filter_ops, filter_string);
1100 err = filter_parse(ps);
1101 if (err) {
1102 append_filter_err(ps, call->filter);
1103 goto out;
1104 }
1105
1106 err = replace_preds(NULL, call, ps, filter_string);
1107 if (err)
1108 append_filter_err(ps, call->filter);
1109
1110 out:
1111 filter_opstack_clear(ps);
1112 postfix_clear(ps);
1113 kfree(ps);
1114 out_unlock:
1115 mutex_unlock(&event_mutex);
1116
1117 return err;
1118 }
1119
1120 int apply_subsystem_event_filter(struct event_subsystem *system,
1121 char *filter_string)
1122 {
1123 int err;
1124
1125 struct filter_parse_state *ps;
1126
1127 mutex_lock(&event_mutex);
1128
1129 if (!strcmp(strstrip(filter_string), "0")) {
1130 filter_free_subsystem_preds(system);
1131 remove_filter_string(system->filter);
1132 mutex_unlock(&event_mutex);
1133 return 0;
1134 }
1135
1136 err = -ENOMEM;
1137 ps = kzalloc(sizeof(*ps), GFP_KERNEL);
1138 if (!ps)
1139 goto out_unlock;
1140
1141 filter_free_subsystem_preds(system);
1142 replace_filter_string(system->filter, filter_string);
1143
1144 parse_init(ps, filter_ops, filter_string);
1145 err = filter_parse(ps);
1146 if (err) {
1147 append_filter_err(ps, system->filter);
1148 goto out;
1149 }
1150
1151 err = replace_preds(system, NULL, ps, filter_string);
1152 if (err)
1153 append_filter_err(ps, system->filter);
1154
1155 out:
1156 filter_opstack_clear(ps);
1157 postfix_clear(ps);
1158 kfree(ps);
1159 out_unlock:
1160 mutex_unlock(&event_mutex);
1161
1162 return err;
1163 }
1164
This page took 0.08153 seconds and 5 git commands to generate.