drm: fix memory leak around mode_group (v2)
authorDave Airlie <airlied@redhat.com>
Fri, 2 May 2014 03:22:19 +0000 (13:22 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 16 May 2014 01:46:06 +0000 (11:46 +1000)
This mode group id_list was never being freed.

v2: take David's suggestion to free in minor_free.

Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/drm_crtc.c
drivers/gpu/drm/drm_stub.c
include/drm/drm_crtc.h

index d8b7099abece7b9ccc44ee21550aa67423855f3f..a3fe32439a5b2a0163f7a4b6f1b2a4542353851e 100644 (file)
@@ -1378,6 +1378,12 @@ static int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *gr
        return 0;
 }
 
+void drm_mode_group_destroy(struct drm_mode_group *group)
+{
+       kfree(group->id_list);
+       group->id_list = NULL;
+}
+
 /*
  * NOTE: Driver's shouldn't ever call drm_mode_group_init_legacy_group - it is
  * the drm core's responsibility to set up mode control groups.
index 1447b0ee367685a4d8435effa9ca6b10df513141..3727ac8bc310156b0cbf40563ef80392caf4addd 100644 (file)
@@ -294,6 +294,7 @@ static void drm_minor_free(struct drm_device *dev, unsigned int type)
 
        slot = drm_minor_get_slot(dev, type);
        if (*slot) {
+               drm_mode_group_destroy(&(*slot)->mode_group);
                kfree(*slot);
                *slot = NULL;
        }
index e55fccbe7c42373940ff8fee459d076cd5e6d4bf..c6b9e8ab0a266dc520984fc9deb9ede4dfb14d0d 100644 (file)
@@ -915,6 +915,7 @@ extern const char *drm_get_tv_subconnector_name(int val);
 extern const char *drm_get_tv_select_name(int val);
 extern void drm_fb_release(struct drm_file *file_priv);
 extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group);
+extern void drm_mode_group_destroy(struct drm_mode_group *group);
 extern bool drm_probe_ddc(struct i2c_adapter *adapter);
 extern struct edid *drm_get_edid(struct drm_connector *connector,
                                 struct i2c_adapter *adapter);