Re: [PATCH v2] drm: Fix drm_pending_vblank_event leak in error path for out_fence_ptr

Thadeu Lima de Souza Cascardo <[email protected]> Wed, 29 Jul 2026 04:02:57 -0300
Newsgroups dev.linux.lists.sashiko-reviews,org.freedesktop.lists.dri-devel
Message-ID <[email protected]>
On Wed, Jul 29, 2026 at 06:23:42AM +0000, [email protected] wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> 
> Pre-existing issues:
> - [Medium] API Contract Violation: out_fence_ptr is not set to -1 on certain error paths
> --
> 
> --- Patch [1]: [PATCH v2] drm: Fix drm_pending_vblank_event leak in error path for out_fence_ptr ---
> commit ee648481e8c7946df39aedd0d40de2f6f6522bf2
> Author: Thadeu Lima de Souza Cascardo <[email protected]>
> 
> drm: Fix drm_pending_vblank_event leak in error path for out_fence_ptr
> 
> This commit fixes a memory leak in the error path of prepare_signaling when
> DRM_MODE_PAGE_FLIP_EVENT is not set but an out_fence_ptr is provided. It
> ensures the pending vblank event is properly released and the crtc state
> event pointer is cleared on allocation or fence creation failures.
> 
> Link: https://patch.msgid.link/20260728-drm_pending_vblank_event_leak-v1-1-08429b920b16@igalia.com
> 
> > diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
> > index 1050dddadb17e..aed6040182eb6 100644
> > --- a/drivers/gpu/drm/drm_atomic_uapi.c
> > +++ b/drivers/gpu/drm/drm_atomic_uapi.c
> > @@ -1464,11 +1464,15 @@ static int prepare_signaling(struct drm_device *dev,
> >  		if (fence_ptr) {
> >  			struct dma_fence *fence;
> >  			struct drm_out_fence_state *f;
> > +			struct drm_pending_vblank_event *e = crtc_state->event;
> >  
> >  			f = krealloc(*fence_state, sizeof(**fence_state) *
> >  				     (*num_fences + 1), GFP_KERNEL);
> > -			if (!f)
> > +			if (!f) {
> > +				drm_event_cancel_free(dev, &e->base);
> > +				crtc_state->event = NULL;
> >  				return -ENOMEM;
> > +			}
> 
> [Severity: Medium]
> This is a pre-existing issue, but I noticed a potential UAPI contract
> violation here.
> 
> If krealloc fails, we return -ENOMEM before out_fence_ptr is added
> to the fence_state array or num_fences is incremented.
> 
> Does this mean complete_signaling() will skip this element and fail to write
> -1 back to the userspace out_fence_ptr, leaving userspace with an
> uninitialized or stale fd value?
> 

This is set to -1 at drm_atomic_crtc_set_property().

> >  
> >  			memset(&f[*num_fences], 0, sizeof(*f));
> >  
> > @@ -1476,12 +1480,17 @@ static int prepare_signaling(struct drm_device *dev,
> >  			*fence_state = f;
> >  
> >  			fence = drm_crtc_create_fence(crtc);
> > -			if (!fence)
> > +			if (!fence) {
> > +				drm_event_cancel_free(dev, &e->base);
> > +				crtc_state->event = NULL;
> >  				return -ENOMEM;
> > +			}
> 
> [Severity: Medium]
> This is also a pre-existing issue, but similarly, if drm_crtc_create_fence
> fails, out_fence_ptr is written to the array but num_fences is not
> incremented.
> 
> Will the cleanup routine skip this pointer and fail to write -1 to userspace?
> 

Same as above.

> It looks like this same pattern also exists in the connector loop later in
> prepare_signaling() when drm_writeback_get_out_fence() fails.
> 

Same for set_out_fence_for_connector(). As for the connector loop, I don't
see such potential leaks there.

Regards.
Cascardo.

> >  
> >  			ret = setup_out_fence(&f[(*num_fences)++], fence);
> >  			if (ret) {
> >  				dma_fence_put(fence);
> > +				drm_event_cancel_free(dev, &e->base);
> > +				crtc_state->event = NULL;
> >  				return ret;
> >  			}
> 
> -- 
> Sashiko AI review · https://sashiko.dev/#/patchset/20260729-drm_pending_vblank_event_leak-v2-1-a5074aae07df@igalia.com?part=1