On Tue, Mar 06, 2018 at 07:22:51PM +0100, Daniel Vetter wrote: > On Tue, Mar 06, 2018 at 06:48:49PM +0200, Ville Syrjala wrote: > > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > > > Pimp drm_property_type_valid() to check for more fails with the > > property flags. Also make the check before adding the property, > > and bail out if things look bad. > > > > Since we're now chekcing for more than the type let's also > > change the function name to drm_property_flags_valid(). > > > > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > --- > > drivers/gpu/drm/drm_property.c | 29 +++++++++++++++++++++++------ > > 1 file changed, 23 insertions(+), 6 deletions(-) > > > > diff --git a/drivers/gpu/drm/drm_property.c b/drivers/gpu/drm/drm_property.c > > index 027a50e55e96..6ac6ee41a6a3 100644 > > --- a/drivers/gpu/drm/drm_property.c > > +++ b/drivers/gpu/drm/drm_property.c > > @@ -50,11 +50,27 @@ > > * IOCTL and in the get/set property IOCTL. > > */ > > > > -static bool drm_property_type_valid(struct drm_property *property) > > +static bool drm_property_flags_valid(u32 flags) > > { > > - if (property->flags & DRM_MODE_PROP_EXTENDED_TYPE) > > - return !(property->flags & DRM_MODE_PROP_LEGACY_TYPE); > > - return !!(property->flags & DRM_MODE_PROP_LEGACY_TYPE); > > + u32 legacy_type = flags & DRM_MODE_PROP_LEGACY_TYPE; > > + u32 ext_type = flags & DRM_MODE_PROP_EXTENDED_TYPE; > > + > > + /* Reject undefined/deprecated flags */ > > + if (flags & ~(DRM_MODE_PROP_LEGACY_TYPE | > > + DRM_MODE_PROP_EXTENDED_TYPE | > > + DRM_MODE_PROP_IMMUTABLE | > > + DRM_MODE_PROP_ATOMIC)) > > + return false; > > + > > + /* We want either a legacy type or an extended type, but not both */ > > + if (!legacy_type == !ext_type) > > + return false; > > + > > + /* Only one legacy type at a time please */ > > + if (legacy_type && !is_power_of_2(legacy_type)) > > + return false; > > + > > + return true; > > } > > I think this catches everything. Well except not-yet-assigned > EXTENDED_TYPE defines, but really we can overdo this :-) Hmm. Yeah, I guess that kind of a fail is fairly unlikely because the defines won't be there. Would require the driver to basically pass in utter garbage instead of just a bad combination of existing flags. > > Reviewed-by: Daniel Vetter <daniel.vetter@xxxxxxxx> Thanks. Series pushed to drm-misc-next. > > > > /** > > @@ -79,6 +95,9 @@ struct drm_property *drm_property_create(struct drm_device *dev, > > struct drm_property *property = NULL; > > int ret; > > > > + if (WARN_ON(!drm_property_flags_valid(flags))) > > + return NULL; > > + > > if (WARN_ON(strlen(name) >= DRM_PROP_NAME_LEN)) > > return NULL; > > > > @@ -108,8 +127,6 @@ struct drm_property *drm_property_create(struct drm_device *dev, > > > > list_add_tail(&property->head, &dev->mode_config.property_list); > > > > - WARN_ON(!drm_property_type_valid(property)); > > - > > return property; > > fail: > > kfree(property->values); > > -- > > 2.16.1 > > > > _______________________________________________ > > dri-devel mailing list > > dri-devel@xxxxxxxxxxxxxxxxxxxxx > > https://lists.freedesktop.org/mailman/listinfo/dri-devel > > -- > Daniel Vetter > Software Engineer, Intel Corporation > http://blog.ffwll.ch -- Ville Syrjälä Intel OTC _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel