Add a helper to get a pointer to struct displayid_header. To be
pedantic, add buffer overflow checks to not touch the base if that
itself would overflow.

Cc: Iaroslav Boliukin <i...@lach.pw>
Cc: Dmitry Osipenko <dmitry.osipe...@collabora.com>
Signed-off-by: Jani Nikula <jani.nik...@intel.com>
---
 drivers/gpu/drm/drm_displayid.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/drm_displayid.c b/drivers/gpu/drm/drm_displayid.c
index 38ea8203df45..7d03159dc146 100644
--- a/drivers/gpu/drm/drm_displayid.c
+++ b/drivers/gpu/drm/drm_displayid.c
@@ -7,13 +7,28 @@
 #include <drm/drm_edid.h>
 #include <drm/drm_print.h>
 
+static const struct displayid_header *
+displayid_get_header(const u8 *displayid, int length, int index)
+{
+       const struct displayid_header *base;
+
+       if (sizeof(*base) > length - index)
+               return ERR_PTR(-EINVAL);
+
+       base = (const struct displayid_header *)&displayid[index];
+
+       return base;
+}
+
 static int validate_displayid(const u8 *displayid, int length, int idx)
 {
        int i, dispid_length;
        u8 csum = 0;
        const struct displayid_header *base;
 
-       base = (const struct displayid_header *)&displayid[idx];
+       base = displayid_get_header(displayid, length, idx);
+       if (IS_ERR(base))
+               return PTR_ERR(base);
 
        DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n",
                      base->rev, base->bytes, base->prod_id, base->ext_count);
-- 
2.34.1

Reply via email to