From: Mitchel Humpherys <mitch...@codeaurora.org>

Currently, we copy the pointer passed in to ion_client_create without
making a copy of the string itself. This approach is problematic since
it relies on the client keeping the name string in working order.

Cc: Greg KH <gre...@linuxfoundation.org>
Cc: Colin Cross <ccr...@android.com>
Cc: Android Kernel Team <kernel-t...@android.com>
Signed-off-by: Mitchel Humpherys <mitch...@codeaurora.org>
[jstultz: Minor commit subject tweaks]
Signed-off-by: John Stultz <john.stu...@linaro.org>
---
 drivers/staging/android/ion/ion.c | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/drivers/staging/android/ion/ion.c 
b/drivers/staging/android/ion/ion.c
index 684f240..47163bd 100644
--- a/drivers/staging/android/ion/ion.c
+++ b/drivers/staging/android/ion/ion.c
@@ -734,19 +734,18 @@ struct ion_client *ion_client_create(struct ion_device 
*dev,
        task_unlock(current->group_leader);
 
        client = kzalloc(sizeof(struct ion_client), GFP_KERNEL);
-       if (!client) {
-               if (task)
-                       put_task_struct(current->group_leader);
-               return ERR_PTR(-ENOMEM);
-       }
+       if (!client)
+               goto err_put_task_struct;
 
        client->dev = dev;
        client->handles = RB_ROOT;
        idr_init(&client->idr);
        mutex_init(&client->lock);
-       client->name = name;
        client->task = task;
        client->pid = pid;
+       client->name = kstrdup(name, GFP_KERNEL);
+       if (!client->name)
+               goto err_free_client;
 
        down_write(&dev->lock);
        p = &dev->clients.rb_node;
@@ -775,6 +774,13 @@ struct ion_client *ion_client_create(struct ion_device 
*dev,
        up_write(&dev->lock);
 
        return client;
+
+err_free_client:
+       kfree(client);
+err_put_task_struct:
+       if (task)
+               put_task_struct(current->group_leader);
+       return ERR_PTR(-ENOMEM);
 }
 EXPORT_SYMBOL(ion_client_create);
 
@@ -799,6 +805,7 @@ void ion_client_destroy(struct ion_client *client)
        debugfs_remove_recursive(client->debug_root);
        up_write(&dev->lock);
 
+       kfree(client->name);
        kfree(client);
 }
 EXPORT_SYMBOL(ion_client_destroy);
-- 
1.8.3.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to