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 :-) Reviewed-by: Daniel Vetter <daniel.vetter@xxxxxxxx> > > /** > @@ -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 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel