On Wed, Jun 08, 2022 at 10:50:39AM +0300, Jani Nikula wrote:
> Unfortunately, there are still plenty of interfaces around that require
> a struct edid pointer, and it's impossible to change them all at
> once. Add an accessor to the raw EDID data to help the transition.
> 
> While there are no such cases now, be defensive against raw EDID
> extension count indicating bigger EDID than is actually allocated.
> 
> Signed-off-by: Jani Nikula <jani.nik...@intel.com>

Reviewed-by: Ville Syrjälä <ville.syrj...@linux.intel.com>

> ---
>  drivers/gpu/drm/drm_edid.c | 26 ++++++++++++++++++++++++++
>  include/drm/drm_edid.h     |  1 +
>  2 files changed, 27 insertions(+)
> 
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 952724788963..4e788c5cbf25 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -2333,6 +2333,32 @@ struct edid *drm_do_get_edid(struct drm_connector 
> *connector,
>  }
>  EXPORT_SYMBOL_GPL(drm_do_get_edid);
>  
> +/**
> + * drm_edid_raw - Get a pointer to the raw EDID data.
> + * @drm_edid: drm_edid container
> + *
> + * Get a pointer to the raw EDID data.
> + *
> + * This is for transition only. Avoid using this like the plague.
> + *
> + * Return: Pointer to raw EDID data.
> + */
> +const struct edid *drm_edid_raw(const struct drm_edid *drm_edid)
> +{
> +     if (!drm_edid || !drm_edid->size)
> +             return NULL;
> +
> +     /*
> +      * Do not return pointers where relying on EDID extension count would
> +      * lead to buffer overflow.
> +      */
> +     if (WARN_ON(edid_size(drm_edid->edid) > drm_edid->size))
> +             return NULL;
> +
> +     return drm_edid->edid;
> +}
> +EXPORT_SYMBOL(drm_edid_raw);
> +
>  /* Allocate struct drm_edid container *without* duplicating the edid data */
>  static const struct drm_edid *_drm_edid_alloc(const void *edid, size_t size)
>  {
> diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
> index aeb2fa95bc04..2181977ae683 100644
> --- a/include/drm/drm_edid.h
> +++ b/include/drm/drm_edid.h
> @@ -597,6 +597,7 @@ drm_display_mode_from_cea_vic(struct drm_device *dev,
>  const struct drm_edid *drm_edid_alloc(const void *edid, size_t size);
>  const struct drm_edid *drm_edid_dup(const struct drm_edid *drm_edid);
>  void drm_edid_free(const struct drm_edid *drm_edid);
> +const struct edid *drm_edid_raw(const struct drm_edid *drm_edid);
>  const struct drm_edid *drm_edid_read(struct drm_connector *connector);
>  const struct drm_edid *drm_edid_read_ddc(struct drm_connector *connector,
>                                        struct i2c_adapter *adapter);
> -- 
> 2.30.2

-- 
Ville Syrjälä
Intel

Reply via email to