A trace array can be destroyed from userspace or kernel. Verify if the
trace array exists before proceeding to destroy/remove it.

Signed-off-by: Divya Indi <divya.i...@oracle.com>
Reviewed-By: Aruna Ramakrishna <aruna.ramakris...@oracle.com>
---
 kernel/trace/trace.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 1c80521..468ecc5 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -8421,17 +8421,27 @@ static int __remove_instance(struct trace_array *tr)
        return 0;
 }
 
-int trace_array_destroy(struct trace_array *tr)
+int trace_array_destroy(struct trace_array *this_tr)
 {
+       struct trace_array *tr;
        int ret;
 
-       if (!tr)
+       if (!this_tr) {
                return -EINVAL;
+       }
 
        mutex_lock(&event_mutex);
        mutex_lock(&trace_types_lock);
 
-       ret = __remove_instance(tr);
+       ret = -ENODEV;
+
+       /* Making sure trace array exists before destroying it. */
+       list_for_each_entry(tr, &ftrace_trace_arrays, list) {
+               if (tr == this_tr) {
+                       ret = __remove_instance(tr);
+                       break;
+               }
+       }
 
        mutex_unlock(&trace_types_lock);
        mutex_unlock(&event_mutex);
-- 
1.8.3.1

Reply via email to