ftrace: If the hash for a probe fails to update then free what was initialized

If the ftrace_hash_move_and_update_ops() fails, and an ops->free() function
exists, then it needs to be called on all the ops that were added by this
registration.

Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
Steven Rostedt (VMware) 2017-04-05 13:36:18 -04:00
parent eee8ded131
commit 8d70725e45
1 changed files with 15 additions and 1 deletions

View File

@ -4003,7 +4003,7 @@ register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops,
ret = ftrace_hash_move_and_update_ops(&ops->ops, orig_hash,
hash, 1);
if (ret < 0)
goto out_unlock;
goto err_unlock;
if (list_empty(&ops->list))
list_add(&ops->list, &ftrace_func_probes);
@ -4021,6 +4021,20 @@ register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops,
free_ftrace_hash(hash);
return ret;
err_unlock:
if (!ops->free)
goto out_unlock;
/* Failed to do the move, need to call the free functions */
for (i = 0; i < size; i++) {
hlist_for_each_entry(entry, &hash->buckets[i], hlist) {
if (ftrace_lookup_ip(old_hash, entry->ip))
continue;
ops->free(ops, entry->ip, NULL);
}
}
goto out_unlock;
}
int