* [PATCH v2] drm/vc4: Fix resource leak in 'vc4_get_hang_state_ioctl()' in error handling path
@ 2017-05-12 12:38 Christophe JAILLET
2017-06-13 0:13 ` Eric Anholt
0 siblings, 1 reply; 2+ messages in thread
From: Christophe JAILLET @ 2017-05-12 12:38 UTC (permalink / raw)
To: eric, airlied
Cc: dri-devel, linux-kernel, kernel-janitors, Christophe JAILLET
If one 'drm_gem_handle_create()' fails, we leak somes handles and some
memory.
In order to fix it:
- move the 'free(bo_state)' at the end of the function so that it is also
called in the eror handling path. This has the side effect to also try
to free it if the first 'kcalloc' fails. This is harmless.
- add a new label, err_delete_handle, in order to delete already
allocated handles in error handling path
- remove the now useless 'err' label
The way the code is now written will also delete the handles if the
'copy_to_user()' call fails.
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
---
v2: reorder code and add a 'err_delete_handle' label in order to free
resources in the correct order and avoid NULL pointer dereference
---
drivers/gpu/drm/vc4/vc4_gem.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c
index e9c381c42139..891c7a22cf81 100644
--- a/drivers/gpu/drm/vc4/vc4_gem.c
+++ b/drivers/gpu/drm/vc4/vc4_gem.c
@@ -111,8 +111,8 @@ vc4_get_hang_state_ioctl(struct drm_device *dev, void *data,
&handle);
if (ret) {
- state->bo_count = i - 1;
- goto err;
+ state->bo_count = i;
+ goto err_delete_handle;
}
bo_state[i].handle = handle;
bo_state[i].paddr = vc4_bo->base.paddr;
@@ -124,13 +124,16 @@ vc4_get_hang_state_ioctl(struct drm_device *dev, void *data,
state->bo_count * sizeof(*bo_state)))
ret = -EFAULT;
- kfree(bo_state);
+err_delete_handle:
+ if (ret) {
+ for (i = 0; i < state->bo_count; i++)
+ drm_gem_handle_delete(file_priv, bo_state[i].handle);
+ }
err_free:
-
vc4_free_hang_state(dev, kernel_state);
+ kfree(bo_state);
-err:
return ret;
}
--
2.11.0
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH v2] drm/vc4: Fix resource leak in 'vc4_get_hang_state_ioctl()' in error handling path
2017-05-12 12:38 [PATCH v2] drm/vc4: Fix resource leak in 'vc4_get_hang_state_ioctl()' in error handling path Christophe JAILLET
@ 2017-06-13 0:13 ` Eric Anholt
0 siblings, 0 replies; 2+ messages in thread
From: Eric Anholt @ 2017-06-13 0:13 UTC (permalink / raw)
To: Christophe JAILLET, airlied
Cc: dri-devel, linux-kernel, kernel-janitors, Christophe JAILLET
[-- Attachment #1: Type: text/plain, Size: 591 bytes --]
Christophe JAILLET <christophe.jaillet@wanadoo.fr> writes:
> If one 'drm_gem_handle_create()' fails, we leak somes handles and some
> memory.
>
> In order to fix it:
> - move the 'free(bo_state)' at the end of the function so that it is also
> called in the eror handling path. This has the side effect to also try
> to free it if the first 'kcalloc' fails. This is harmless.
> - add a new label, err_delete_handle, in order to delete already
> allocated handles in error handling path
> - remove the now useless 'err' label
Reviewed and applied. Thanks!
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-06-13 0:13 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-05-12 12:38 [PATCH v2] drm/vc4: Fix resource leak in 'vc4_get_hang_state_ioctl()' in error handling path Christophe JAILLET
2017-06-13 0:13 ` Eric Anholt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®