diff mbox

[1/2] drm/exynos: g2d: make ioctls more robust

Message ID 1406127433-3914-2-git-send-email-tjakobi@math.uni-bielefeld.de (mailing list archive)
State New, archived
Headers show

Commit Message

Tobias Jakobi July 23, 2014, 2:57 p.m. UTC
Both exynos_g2d_set_cmdlist_ioctl and exynos_g2d_exec_ioctl don't check
if the G2D was succesfully probe. If that is not the case, then g2d_priv
is just NULL and extracting 'dev' from it in the next step  is going to
produce a kernel oops.

Add proper checks and return ENODEV if the G2D is not available.

Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
---
 drivers/gpu/drm/exynos/exynos_drm_g2d.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

Comments

Inki Dae Aug. 3, 2014, 7:54 a.m. UTC | #1
2014-07-23 23:57 GMT+09:00 Tobias Jakobi <tjakobi@math.uni-bielefeld.de>:
> Both exynos_g2d_set_cmdlist_ioctl and exynos_g2d_exec_ioctl don't check
> if the G2D was succesfully probe. If that is not the case, then g2d_priv
> is just NULL and extracting 'dev' from it in the next step  is going to
> produce a kernel oops.
>
> Add proper checks and return ENODEV if the G2D is not available.
>
> Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
> ---
>  drivers/gpu/drm/exynos/exynos_drm_g2d.c | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c
> index 5fa1bb6..8c62423 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c
> @@ -1056,7 +1056,7 @@ int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data,
>  {
>         struct drm_exynos_file_private *file_priv = file->driver_priv;
>         struct exynos_drm_g2d_private *g2d_priv = file_priv->g2d_priv;
> -       struct device *dev = g2d_priv->dev;
> +       struct device *dev;
>         struct g2d_data *g2d;
>         struct drm_exynos_g2d_set_cmdlist *req = data;
>         struct drm_exynos_g2d_cmd *cmd;
> @@ -1067,6 +1067,10 @@ int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data,
>         int size;
>         int ret;
>
> +       if (!g2d_priv)
> +               return -ENODEV;
> +
> +       dev = g2d_priv->dev;
>         if (!dev)
>                 return -ENODEV;
>
> @@ -1223,13 +1227,17 @@ int exynos_g2d_exec_ioctl(struct drm_device *drm_dev, void *data,
>  {
>         struct drm_exynos_file_private *file_priv = file->driver_priv;
>         struct exynos_drm_g2d_private *g2d_priv = file_priv->g2d_priv;
> -       struct device *dev = g2d_priv->dev;
> +       struct device *dev;
>         struct g2d_data *g2d;
>         struct drm_exynos_g2d_exec *req = data;
>         struct g2d_runqueue_node *runqueue_node;
>         struct list_head *run_cmdlist;
>         struct list_head *event_list;
>
> +       if (!g2d_priv)
> +               return -ENODEV;
> +
> +       dev = g2d_priv->dev

It seems that you have no build test because above line incurs build
error. Anyway I fixed it up.

Thanks,
Inki Dae

>         if (!dev)
>                 return -ENODEV;
>
> --
> 1.8.5.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
Tobias Jakobi Aug. 3, 2014, 9:52 a.m. UTC | #2
Inki Dae wrote:
> It seems that you have no build test because above line incurs build
> error. Anyway I fixed it up.
That's why I have sent v2 of the patch.

With best wishes,
Tobias
Inki Dae Aug. 4, 2014, 12:28 a.m. UTC | #3
On 2014? 08? 03? 18:52, Tobias Jakobi wrote:
> Inki Dae wrote:
>> It seems that you have no build test because above line incurs build
>> error. Anyway I fixed it up.
> That's why I have sent v2 of the patch.
> 

Oops, sorry. I didn't check v2.

Thanks,
Inki Dae


> With best wishes,
> Tobias
> 
>
Tobias Jakobi Aug. 4, 2014, 12:02 p.m. UTC | #4
On 2014-08-04 02:28, Inki Dae wrote:
> Oops, sorry. I didn't check v2.
No problem :)

It would be good if you could also check the libdrm patches that I've 
resent some while ago.

With best wishes,
Tobias
diff mbox

Patch

diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c
index 5fa1bb6..8c62423 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c
@@ -1056,7 +1056,7 @@  int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data,
 {
 	struct drm_exynos_file_private *file_priv = file->driver_priv;
 	struct exynos_drm_g2d_private *g2d_priv = file_priv->g2d_priv;
-	struct device *dev = g2d_priv->dev;
+	struct device *dev;
 	struct g2d_data *g2d;
 	struct drm_exynos_g2d_set_cmdlist *req = data;
 	struct drm_exynos_g2d_cmd *cmd;
@@ -1067,6 +1067,10 @@  int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data,
 	int size;
 	int ret;
 
+	if (!g2d_priv)
+		return -ENODEV;
+
+	dev = g2d_priv->dev;
 	if (!dev)
 		return -ENODEV;
 
@@ -1223,13 +1227,17 @@  int exynos_g2d_exec_ioctl(struct drm_device *drm_dev, void *data,
 {
 	struct drm_exynos_file_private *file_priv = file->driver_priv;
 	struct exynos_drm_g2d_private *g2d_priv = file_priv->g2d_priv;
-	struct device *dev = g2d_priv->dev;
+	struct device *dev;
 	struct g2d_data *g2d;
 	struct drm_exynos_g2d_exec *req = data;
 	struct g2d_runqueue_node *runqueue_node;
 	struct list_head *run_cmdlist;
 	struct list_head *event_list;
 
+	if (!g2d_priv)
+		return -ENODEV;
+
+	dev = g2d_priv->dev
 	if (!dev)
 		return -ENODEV;