diff mbox series

drm: pre-fill getfb2 modifier array with INVALID

Message ID 20211111101049.269349-1-contact@emersion.fr (mailing list archive)
State New, archived
Headers show
Series drm: pre-fill getfb2 modifier array with INVALID | expand

Commit Message

Simon Ser Nov. 11, 2021, 10:10 a.m. UTC
User-space shouldn't look up the modifier array when the modifier
flag is missing, but at the moment no docs make this clear (working
on it). Right now the modifier array is pre-filled with zeroes, aka.
LINEAR. Instead, pre-fill with INVALID to avoid footguns.

This is a uAPI change, but OTOH any user-space which looks up the
modifier array without checking the flag is broken already, so
should be fine.

Signed-off-by: Simon Ser <contact@emersion.fr>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Pekka Paalanen <ppaalanen@gmail.com>
Cc: Daniel Stone <daniels@collabora.com>
---
 drivers/gpu/drm/drm_framebuffer.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Pekka Paalanen Nov. 11, 2021, 11:08 a.m. UTC | #1
On Thu, 11 Nov 2021 10:10:54 +0000
Simon Ser <contact@emersion.fr> wrote:

> User-space shouldn't look up the modifier array when the modifier
> flag is missing, but at the moment no docs make this clear (working
> on it). Right now the modifier array is pre-filled with zeroes, aka.
> LINEAR. Instead, pre-fill with INVALID to avoid footguns.
> 
> This is a uAPI change, but OTOH any user-space which looks up the
> modifier array without checking the flag is broken already, so
> should be fine.
> 
> Signed-off-by: Simon Ser <contact@emersion.fr>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: Pekka Paalanen <ppaalanen@gmail.com>
> Cc: Daniel Stone <daniels@collabora.com>
> ---
>  drivers/gpu/drm/drm_framebuffer.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c
> index 07f5abc875e9..f7041c0a0407 100644
> --- a/drivers/gpu/drm/drm_framebuffer.c
> +++ b/drivers/gpu/drm/drm_framebuffer.c
> @@ -601,7 +601,7 @@ int drm_mode_getfb2_ioctl(struct drm_device *dev,
>  		r->handles[i] = 0;
>  		r->pitches[i] = 0;
>  		r->offsets[i] = 0;
> -		r->modifier[i] = 0;
> +		r->modifier[i] = DRM_FORMAT_MOD_INVALID;
>  	}
>  
>  	for (i = 0; i < fb->format->num_planes; i++) {

Acked-by: Pekka Paalanen <pekka.paalanen@collabora.com>


Thanks,
pq
Daniel Stone Nov. 11, 2021, 11:49 a.m. UTC | #2
On Thu, 11 Nov 2021 at 10:11, Simon Ser <contact@emersion.fr> wrote:
> User-space shouldn't look up the modifier array when the modifier
> flag is missing, but at the moment no docs make this clear (working
> on it). Right now the modifier array is pre-filled with zeroes, aka.
> LINEAR. Instead, pre-fill with INVALID to avoid footguns.
>
> This is a uAPI change, but OTOH any user-space which looks up the
> modifier array without checking the flag is broken already, so
> should be fine.

I don't know of any userspace which this would break.

Acked-by: Daniel Stone <daniels@collabora.com>
Ville Syrjala Nov. 11, 2021, 12:50 p.m. UTC | #3
On Thu, Nov 11, 2021 at 10:10:54AM +0000, Simon Ser wrote:
> User-space shouldn't look up the modifier array when the modifier
> flag is missing, but at the moment no docs make this clear (working
> on it). Right now the modifier array is pre-filled with zeroes, aka.
> LINEAR. Instead, pre-fill with INVALID to avoid footguns.
> 
> This is a uAPI change, but OTOH any user-space which looks up the
> modifier array without checking the flag is broken already, so
> should be fine.
> 
> Signed-off-by: Simon Ser <contact@emersion.fr>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Cc: Pekka Paalanen <ppaalanen@gmail.com>
> Cc: Daniel Stone <daniels@collabora.com>

Isn't this going to break the test where we pass the get
getfb2 result back into addfb2?

> ---
>  drivers/gpu/drm/drm_framebuffer.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c
> index 07f5abc875e9..f7041c0a0407 100644
> --- a/drivers/gpu/drm/drm_framebuffer.c
> +++ b/drivers/gpu/drm/drm_framebuffer.c
> @@ -601,7 +601,7 @@ int drm_mode_getfb2_ioctl(struct drm_device *dev,
>  		r->handles[i] = 0;
>  		r->pitches[i] = 0;
>  		r->offsets[i] = 0;
> -		r->modifier[i] = 0;
> +		r->modifier[i] = DRM_FORMAT_MOD_INVALID;
>  	}
>  
>  	for (i = 0; i < fb->format->num_planes; i++) {
> -- 
> 2.33.1
>
Simon Ser Nov. 15, 2021, 9:18 a.m. UTC | #4
On Thursday, November 11th, 2021 at 13:50, Ville Syrjälä <ville.syrjala@linux.intel.com> wrote:

> On Thu, Nov 11, 2021 at 10:10:54AM +0000, Simon Ser wrote:
> > User-space shouldn't look up the modifier array when the modifier
> > flag is missing, but at the moment no docs make this clear (working
> > on it). Right now the modifier array is pre-filled with zeroes, aka.
> > LINEAR. Instead, pre-fill with INVALID to avoid footguns.
> >
> > This is a uAPI change, but OTOH any user-space which looks up the
> > modifier array without checking the flag is broken already, so
> > should be fine.
> >
> > Signed-off-by: Simon Ser <contact@emersion.fr>
> > Cc: Daniel Vetter <daniel@ffwll.ch>
> > Cc: Pekka Paalanen <ppaalanen@gmail.com>
> > Cc: Daniel Stone <daniels@collabora.com>
>
> Isn't this going to break the test where we pass the get
> getfb2 result back into addfb2?

Shouldn't be the case, since the kernel will ignore modifiers if the
flag isn't set.
Ville Syrjala Nov. 15, 2021, 3:22 p.m. UTC | #5
On Mon, Nov 15, 2021 at 09:18:42AM +0000, Simon Ser wrote:
> On Thursday, November 11th, 2021 at 13:50, Ville Syrjälä <ville.syrjala@linux.intel.com> wrote:
> 
> > On Thu, Nov 11, 2021 at 10:10:54AM +0000, Simon Ser wrote:
> > > User-space shouldn't look up the modifier array when the modifier
> > > flag is missing, but at the moment no docs make this clear (working
> > > on it). Right now the modifier array is pre-filled with zeroes, aka.
> > > LINEAR. Instead, pre-fill with INVALID to avoid footguns.
> > >
> > > This is a uAPI change, but OTOH any user-space which looks up the
> > > modifier array without checking the flag is broken already, so
> > > should be fine.
> > >
> > > Signed-off-by: Simon Ser <contact@emersion.fr>
> > > Cc: Daniel Vetter <daniel@ffwll.ch>
> > > Cc: Pekka Paalanen <ppaalanen@gmail.com>
> > > Cc: Daniel Stone <daniels@collabora.com>
> >
> > Isn't this going to break the test where we pass the get
> > getfb2 result back into addfb2?
> 
> Shouldn't be the case, since the kernel will ignore modifiers if the
> flag isn't set.

if (r->modifier[i] && !(r->flags & DRM_MODE_FB_MODIFIERS)) {
	DRM_DEBUG_KMS("bad fb modifier %llu for plane %d\n",
		r->modifier[i], i);
	return -EINVAL;
}
Simon Ser Nov. 15, 2021, 3:26 p.m. UTC | #6
Hm indeed, RIP. I got confused by this one:

		/* Pre-FB_MODIFIERS userspace didn't clear the structs properly. */
		if (!(r->flags & DRM_MODE_FB_MODIFIERS))
			continue;

But it's only run for unused planes.
diff mbox series

Patch

diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c
index 07f5abc875e9..f7041c0a0407 100644
--- a/drivers/gpu/drm/drm_framebuffer.c
+++ b/drivers/gpu/drm/drm_framebuffer.c
@@ -601,7 +601,7 @@  int drm_mode_getfb2_ioctl(struct drm_device *dev,
 		r->handles[i] = 0;
 		r->pitches[i] = 0;
 		r->offsets[i] = 0;
-		r->modifier[i] = 0;
+		r->modifier[i] = DRM_FORMAT_MOD_INVALID;
 	}
 
 	for (i = 0; i < fb->format->num_planes; i++) {