diff options
Diffstat (limited to 'common/recipes-graphics/drm/libdrm-2.4.66/0002-Fix-memory-leak-with-drmModeGetConnectorCurrent.patch')
-rw-r--r-- | common/recipes-graphics/drm/libdrm-2.4.66/0002-Fix-memory-leak-with-drmModeGetConnectorCurrent.patch | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/common/recipes-graphics/drm/libdrm-2.4.66/0002-Fix-memory-leak-with-drmModeGetConnectorCurrent.patch b/common/recipes-graphics/drm/libdrm-2.4.66/0002-Fix-memory-leak-with-drmModeGetConnectorCurrent.patch new file mode 100644 index 00000000..ff2d910f --- /dev/null +++ b/common/recipes-graphics/drm/libdrm-2.4.66/0002-Fix-memory-leak-with-drmModeGetConnectorCurrent.patch @@ -0,0 +1,77 @@ +From e342c0fc250f3f16b817c43e96ab9b839fcb15c2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com> +Date: Tue, 15 Dec 2015 14:18:32 +0200 +Subject: [PATCH 002/117] Fix memory leak with drmModeGetConnectorCurrent() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +drmModeGetConnectorCurrent() must provide temporary storage for the +kernel to fill in at least one mode (asking for !=0 modes is how +you prevent the heavyweight probe in the kernel). Currently we malloc +that temp storage but we fail to free it before overwriting the +pointer with the address of the actual storage we use to store the +real mode list we get from the kernel in the second ioctl call. + +Let's just keep the temporary storage on the stack and thus we avoid the +leak and also eliminate some pointless mallocs. + +Cc: Chris Wilson <chris@chris-wilson.co.uk> +Fixes: 5ed5fa10600f ("mode: Retrieve only the current information for a Connector") +Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> +Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> +--- + xf86drmMode.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +diff --git a/xf86drmMode.c b/xf86drmMode.c +index ab6b519..7710061 100644 +--- a/xf86drmMode.c ++++ b/xf86drmMode.c +@@ -475,12 +475,13 @@ _drmModeGetConnector(int fd, uint32_t connector_id, int probe) + { + struct drm_mode_get_connector conn, counts; + drmModeConnectorPtr r = NULL; ++ struct drm_mode_modeinfo stack_mode; + + memclear(conn); + conn.connector_id = connector_id; + if (!probe) { + conn.count_modes = 1; +- conn.modes_ptr = VOID2U64(drmMalloc(sizeof(struct drm_mode_modeinfo))); ++ conn.modes_ptr = VOID2U64(&stack_mode); + } + + if (drmIoctl(fd, DRM_IOCTL_MODE_GETCONNECTOR, &conn)) +@@ -504,7 +505,7 @@ retry: + goto err_allocs; + } else { + conn.count_modes = 1; +- conn.modes_ptr = VOID2U64(drmMalloc(sizeof(struct drm_mode_modeinfo))); ++ conn.modes_ptr = VOID2U64(&stack_mode); + } + + if (conn.count_encoders) { +@@ -525,7 +526,8 @@ retry: + counts.count_encoders < conn.count_encoders) { + drmFree(U642VOID(conn.props_ptr)); + drmFree(U642VOID(conn.prop_values_ptr)); +- drmFree(U642VOID(conn.modes_ptr)); ++ if (U642VOID(conn.modes_ptr) != &stack_mode) ++ drmFree(U642VOID(conn.modes_ptr)); + drmFree(U642VOID(conn.encoders_ptr)); + + goto retry; +@@ -567,7 +569,8 @@ retry: + err_allocs: + drmFree(U642VOID(conn.prop_values_ptr)); + drmFree(U642VOID(conn.props_ptr)); +- drmFree(U642VOID(conn.modes_ptr)); ++ if (U642VOID(conn.modes_ptr) != &stack_mode) ++ drmFree(U642VOID(conn.modes_ptr)); + drmFree(U642VOID(conn.encoders_ptr)); + + return r; +-- +2.7.4 + |