summaryrefslogtreecommitdiff
path: root/drivers/gpu/ion
diff options
context:
space:
mode:
authorRebecca Schultz Zavin <rebecca@android.com>2011-07-07 17:07:56 -0700
committerRebecca Schultz Zavin <rebecca@android.com>2011-07-08 15:41:32 -0700
commitc72866db6b303d3af1f579a0270bc88353dd8458 (patch)
tree279f251b0726c9f16aefda29ac86011128faf584 /drivers/gpu/ion
parent0226f8a76da6bc97c9bb4af3fd2f6eeb03c5b0b0 (diff)
gpu: ion: Validate handles passed via the kernel api
Before freeing or sharing handles, confirm that they are valid in the provided client Change-Id: I06ec599c0b277fcb5417325a12ecbf8b2d248a7b Signed-off-by: Rebecca Schultz Zavin <rebecca@android.com>
Diffstat (limited to 'drivers/gpu/ion')
-rw-r--r--drivers/gpu/ion/ion.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/gpu/ion/ion.c b/drivers/gpu/ion/ion.c
index 1c25940a1fd..9cb5b25bb11 100644
--- a/drivers/gpu/ion/ion.c
+++ b/drivers/gpu/ion/ion.c
@@ -333,6 +333,18 @@ end:
void ion_free(struct ion_client *client, struct ion_handle *handle)
{
+ bool valid_handle;
+
+ BUG_ON(client != handle->client);
+
+ mutex_lock(&client->lock);
+ valid_handle = ion_handle_validate(client, handle);
+ mutex_unlock(&client->lock);
+
+ if (!valid_handle) {
+ WARN("%s: invalid handle passed to free.\n", __func__);
+ return;
+ }
ion_handle_put(handle);
}
@@ -500,6 +512,16 @@ void ion_unmap_dma(struct ion_client *client, struct ion_handle *handle)
struct ion_buffer *ion_share(struct ion_client *client,
struct ion_handle *handle)
{
+ bool valid_handle;
+
+ mutex_lock(&client->lock);
+ valid_handle = ion_handle_validate(client, handle);
+ mutex_unlock(&client->lock);
+ if (!valid_handle) {
+ WARN("%s: invalid handle passed to share.\n", __func__);
+ return ERR_PTR(-EINVAL);
+ }
+
/* don't not take an extra refernce here, the burden is on the caller
* to make sure the buffer doesn't go away while it's passing it
* to another client -- ion_free should not be called on this handle