[PATCH libdrm] Fix memory leak with drmModeGetConnectorCurrent()

Chris Wilson chris at chris-wilson.co.uk
Tue Dec 15 06:05:45 PST 2015


On Tue, Dec 15, 2015 at 03:59:28PM +0200, ville.syrjala at linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> 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 at chris-wilson.co.uk>
> Fixes: 5ed5fa10600f ("mode: Retrieve only the current information for a Connector")
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
>  xf86drmMode.c | 11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/xf86drmMode.c b/xf86drmMode.c
> index ab6b5195e8d3..7710061865ee 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 you just made this change, we wouldn't need the hunks below (and I
wouln't have to look at so much shouting).

Either way,
Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the dri-devel mailing list