[PATCH v3 1/3] drm: Plumb modifiers through plane init
Liviu Dudau
Liviu.Dudau at arm.com
Thu May 18 08:45:27 UTC 2017
On Wed, May 17, 2017 at 05:26:14PM -0700, Ben Widawsky wrote:
> On 17-05-17 11:17:57, Liviu Dudau wrote:
> > On Tue, May 16, 2017 at 02:31:24PM -0700, Ben Widawsky wrote:
> > > This is the plumbing for supporting fb modifiers on planes. Modifiers
> > > have already been introduced to some extent, but this series will extend
> > > this to allow querying modifiers per plane. Based on this, the client to
> > > enable optimal modifications for framebuffers.
> > >
> > > This patch simply allows the DRM drivers to initialize their list of
> > > supported modifiers upon initializing the plane.
> > >
> > > v2: A minor addition from Daniel
> > >
> > > v3: Updated commit message
> > > s/INVALID/DRM_FORMAT_MOD_INVALID (Liviu)
> > > Remove some excess newlines (Liviu)
> > > Update comment for > 64 modifiers (Liviu)
> > >
> > > Cc: Liviu Dudau <Liviu.Dudau at arm.com>
> > > Reviewed-by: Daniel Stone <daniels at collabora.com> (v2)
> > > Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
> >
> > Minor nits, see below, but otherwise:
> >
> > Reviewed-by: Liviu Dudau <Liviu.Dudau at arm.com>
> >
> > Thanks,
> > Liviu
> >
>
> Thank you. I took them all but the memcpy change, which I'm pretty sure is okay.
> Take a quick look again and let me know.
[snip]
>
> > > + * format is encoded as a bit and the current code only supports a u64.
> > > + */
> > > + if (WARN_ON(format_count > 64))
> > > + return -EINVAL;
> > > +
> > > + if (format_modifiers) {
> > > + const uint64_t *temp_modifiers = format_modifiers;
> > > + while (*temp_modifiers++ != DRM_FORMAT_MOD_INVALID)
> > > + format_modifier_count++;
> > > + }
> > > +
> > > + plane->modifier_count = format_modifier_count;
> > > + plane->modifiers = kmalloc_array(format_modifier_count,
> > > + sizeof(format_modifiers[0]),
> > > + GFP_KERNEL);
> > > +
> > > + if (format_modifier_count && !plane->modifiers) {
> > > + DRM_DEBUG_KMS("out of memory when allocating plane\n");
> > > + kfree(plane->format_types);
> > > + drm_mode_object_unregister(dev, &plane->base);
> > > + return -ENOMEM;
> > > + }
> > > +
> > > if (name) {
> > > va_list ap;
> > >
> > > @@ -117,12 +145,15 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane,
> > > }
> > > if (!plane->name) {
> > > kfree(plane->format_types);
> > > + kfree(plane->modifiers);
> > > drm_mode_object_unregister(dev, &plane->base);
> > > return -ENOMEM;
> > > }
> > >
> > > memcpy(plane->format_types, formats, format_count * sizeof(uint32_t));
> > > plane->format_count = format_count;
> > > + memcpy(plane->modifiers, format_modifiers,
> > > + format_modifier_count * sizeof(format_modifiers[0]));
> >
> > I'm still worried that we can reach the memcpy with a NULL format_modifiers and we are opening
> > a security hole here.
> >
>
> I didn't notice your feedback here before, I apologize. I'm pretty certain you
> can't get here with !format_modifiers (well you can, but then the 'n' for memcpy
> will be 0). format_modifier_count is only !0 if format_modifiers is !NULL.
That is a valid point. It then makes me ask why we even go through the dance of allocating
a 0 array for plane->modifiers, can we not skip the whole thing around plane->modifiers if
format_modifiers is NULL?
[snip]
> --
> Ben Widawsky, Intel Open Source Technology Center
Thanks for the effort,
Liviu
--
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯
More information about the dri-devel
mailing list