Message ID | 20180306164849.2862-6-ville.syrjala@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, Mar 06, 2018 at 06:48:49PM +0200, Ville Syrjala wrote: > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > 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@linux.intel.com> > --- > 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@ffwll.ch> > > /** > @@ -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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel
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@linux.intel.com> > > > > 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@linux.intel.com> > > --- > > 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@ffwll.ch> 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@lists.freedesktop.org > > https://lists.freedesktop.org/mailman/listinfo/dri-devel > > -- > Daniel Vetter > Software Engineer, Intel Corporation > http://blog.ffwll.ch
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; } /** @@ -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);