diff options
author | Daniel Kurtz <djkurtz@chromium.org> | 2014-03-16 23:28:06 -0400 |
---|---|---|
committer | Inki Dae <inki.dae@samsung.com> | 2014-03-19 22:42:24 -0400 |
commit | 85d898bf8f638b7a23af95dc7d32b4a72c178637 (patch) | |
tree | 8c56ea605e46842cf7690545ab9196b955bfd123 | |
parent | 27410e8248c64f5c6d28891389083b1022c15a10 (diff) |
drm/exynos: Fix (more) freeing issues in exynos_drm_drv.c
The following commit [0] fixed a use-after-free, but left the subdrv open
in the error path.
[0] commit 6ca605f7c70895a35737435f17ae9cc5e36f1466
drm/exynos: Fix freeing issues in exynos_drm_drv.c
Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
Acked-by: Sachin Kamat <sachin.kamat@linaro.org>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_drv.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 215131ab1dd2..c204b4e3356e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c | |||
@@ -172,20 +172,24 @@ static int exynos_drm_open(struct drm_device *dev, struct drm_file *file) | |||
172 | 172 | ||
173 | ret = exynos_drm_subdrv_open(dev, file); | 173 | ret = exynos_drm_subdrv_open(dev, file); |
174 | if (ret) | 174 | if (ret) |
175 | goto out; | 175 | goto err_file_priv_free; |
176 | 176 | ||
177 | anon_filp = anon_inode_getfile("exynos_gem", &exynos_drm_gem_fops, | 177 | anon_filp = anon_inode_getfile("exynos_gem", &exynos_drm_gem_fops, |
178 | NULL, 0); | 178 | NULL, 0); |
179 | if (IS_ERR(anon_filp)) { | 179 | if (IS_ERR(anon_filp)) { |
180 | ret = PTR_ERR(anon_filp); | 180 | ret = PTR_ERR(anon_filp); |
181 | goto out; | 181 | goto err_subdrv_close; |
182 | } | 182 | } |
183 | 183 | ||
184 | anon_filp->f_mode = FMODE_READ | FMODE_WRITE; | 184 | anon_filp->f_mode = FMODE_READ | FMODE_WRITE; |
185 | file_priv->anon_filp = anon_filp; | 185 | file_priv->anon_filp = anon_filp; |
186 | 186 | ||
187 | return ret; | 187 | return ret; |
188 | out: | 188 | |
189 | err_subdrv_close: | ||
190 | exynos_drm_subdrv_close(dev, file); | ||
191 | |||
192 | err_file_priv_free: | ||
189 | kfree(file_priv); | 193 | kfree(file_priv); |
190 | file->driver_priv = NULL; | 194 | file->driver_priv = NULL; |
191 | return ret; | 195 | return ret; |