提交 ee34ab5b 编写于 作者: V Ville Syrjälä 提交者: Dave Airlie

drm: Fix memory leak in drm_mode_setcrtc()

The mode passed to the .set_config() hook was never freed. The drivers
will make a copy of the mode, so simply free it when done.
Signed-off-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: NAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: NDave Airlie <airlied@redhat.com>
上级 1dd6c8bd
...@@ -643,6 +643,9 @@ EXPORT_SYMBOL(drm_mode_create); ...@@ -643,6 +643,9 @@ EXPORT_SYMBOL(drm_mode_create);
*/ */
void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode) void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode)
{ {
if (!mode)
return;
drm_mode_object_put(dev, &mode->base); drm_mode_object_put(dev, &mode->base);
kfree(mode); kfree(mode);
...@@ -1812,6 +1815,11 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, ...@@ -1812,6 +1815,11 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
} }
mode = drm_mode_create(dev); mode = drm_mode_create(dev);
if (!mode) {
ret = -ENOMEM;
goto out;
}
drm_crtc_convert_umode(mode, &crtc_req->mode); drm_crtc_convert_umode(mode, &crtc_req->mode);
drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
} }
...@@ -1881,6 +1889,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data, ...@@ -1881,6 +1889,7 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
out: out:
kfree(connector_set); kfree(connector_set);
drm_mode_destroy(dev, mode);
mutex_unlock(&dev->mode_config.mutex); mutex_unlock(&dev->mode_config.mutex);
return ret; return ret;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册