Merge tag 'trace-v5.2-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 29 May 2019 18:26:40 +0000 (11:26 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 29 May 2019 18:26:40 +0000 (11:26 -0700)
Pull tracing fix from Steven Rostedt:
 "This fixes a memory leak from the error path in the event filter
  logic"

* tag 'trace-v5.2-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
  tracing: Avoid memory leak in predicate_parse()

kernel/trace/trace_events_filter.c

index d3e59312ef405072e941464d5f66a8ef79433750..5079d1db3754a0bc872f39c12905aa0192d7839c 100644 (file)
@@ -428,7 +428,7 @@ predicate_parse(const char *str, int nr_parens, int nr_preds,
        op_stack = kmalloc_array(nr_parens, sizeof(*op_stack), GFP_KERNEL);
        if (!op_stack)
                return ERR_PTR(-ENOMEM);
-       prog_stack = kmalloc_array(nr_preds, sizeof(*prog_stack), GFP_KERNEL);
+       prog_stack = kcalloc(nr_preds, sizeof(*prog_stack), GFP_KERNEL);
        if (!prog_stack) {
                parse_error(pe, -ENOMEM, 0);
                goto out_free;
@@ -579,7 +579,11 @@ predicate_parse(const char *str, int nr_parens, int nr_preds,
 out_free:
        kfree(op_stack);
        kfree(inverts);
-       kfree(prog_stack);
+       if (prog_stack) {
+               for (i = 0; prog_stack[i].pred; i++)
+                       kfree(prog_stack[i].pred);
+               kfree(prog_stack);
+       }
        return ERR_PTR(ret);
 }