return -ENOSPC;
        }
 
-       filter->preds[filter->n_preds] = pred;
-       filter->n_preds++;
-
        list_for_each_entry(call, &ftrace_events, list) {
 
                if (!call->define_fields)
                }
                replace_filter_string(call->filter, filter_string);
        }
+
+       filter->preds[filter->n_preds] = pred;
+       filter->n_preds++;
 out:
        return err;
 }
                        if (call) {
                                err = filter_add_pred(ps, call, pred);
                                filter_free_pred(pred);
-                       } else
+                       } else {
                                err = filter_add_subsystem_pred(ps, system,
                                                        pred, filter_string);
+                               if (err)
+                                       filter_free_pred(pred);
+                       }
                        if (err)
                                return err;
 
                if (call) {
                        err = filter_add_pred(ps, call, pred);
                        filter_free_pred(pred);
-               } else
+               } else {
                        err = filter_add_subsystem_pred(ps, system, pred,
                                                        filter_string);
+                       if (err)
+                               filter_free_pred(pred);
+               }
                if (err)
                        return err;