drm/tegra: dc: Properly cleanup overlay planes
authorThierry Reding <treding@nvidia.com>
Mon, 8 Jan 2018 15:16:06 +0000 (16:16 +0100)
committerThierry Reding <treding@nvidia.com>
Mon, 8 Jan 2018 15:24:13 +0000 (16:24 +0100)
The first overlay plane can leak if initialization of the second overlay
plane fails. Fix this by properly destroying the first overlay plane on
error.

Suggested-by: Dmitry Osipenko <digetx@gmail.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/drm/tegra/dc.c

index 7a9c9ff8b4d7d68a7168ea1d01ddc799494f87a2..b8403ed48285288c277d224e253285caebed3adb 100644 (file)
@@ -937,20 +937,24 @@ static struct drm_plane *tegra_dc_add_shared_planes(struct drm_device *drm,
 static struct drm_plane *tegra_dc_add_planes(struct drm_device *drm,
                                             struct tegra_dc *dc)
 {
-       struct drm_plane *plane, *primary;
+       struct drm_plane *planes[2], *primary;
        unsigned int i;
+       int err;
 
        primary = tegra_primary_plane_create(drm, dc);
        if (IS_ERR(primary))
                return primary;
 
        for (i = 0; i < 2; i++) {
-               plane = tegra_dc_overlay_plane_create(drm, dc, 1 + i);
-               if (IS_ERR(plane)) {
-                       /* XXX tegra_plane_destroy() */
-                       drm_plane_cleanup(primary);
-                       kfree(primary);
-                       return plane;
+               planes[i] = tegra_dc_overlay_plane_create(drm, dc, 1 + i);
+               if (IS_ERR(planes[i])) {
+                       err = PTR_ERR(planes[i]);
+
+                       while (i--)
+                               tegra_plane_funcs.destroy(planes[i]);
+
+                       tegra_plane_funcs.destroy(primary);
+                       return ERR_PTR(err);
                }
        }