Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/displayid: return struct displayid_header from validate_displayid()

Avoid figuring out the header pointer multiple times.

Cc: Iaroslav Boliukin <iam@lach.pw>
Cc: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Reviewed-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Link: https://patchwork.freedesktop.org/patch/msgid/e840c744d165608a41db5a5e2bd4b0205783c697.1676580180.git.jani.nikula@intel.com

authored by

Jani Nikula and committed by
Dmitry Osipenko
5631f6a0 5bacecc3

+8 -9
+8 -9
drivers/gpu/drm/drm_displayid.c
··· 20 20 return base; 21 21 } 22 22 23 - static int validate_displayid(const u8 *displayid, int length, int idx) 23 + static const struct displayid_header * 24 + validate_displayid(const u8 *displayid, int length, int idx) 24 25 { 25 26 int i, dispid_length; 26 27 u8 csum = 0; ··· 29 28 30 29 base = displayid_get_header(displayid, length, idx); 31 30 if (IS_ERR(base)) 32 - return PTR_ERR(base); 31 + return base; 33 32 34 33 DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n", 35 34 base->rev, base->bytes, base->prod_id, base->ext_count); ··· 37 36 /* +1 for DispID checksum */ 38 37 dispid_length = sizeof(*base) + base->bytes + 1; 39 38 if (dispid_length > length - idx) 40 - return -EINVAL; 39 + return ERR_PTR(-EINVAL); 41 40 42 41 for (i = 0; i < dispid_length; i++) 43 42 csum += displayid[idx + i]; 44 43 if (csum) { 45 44 DRM_NOTE("DisplayID checksum invalid, remainder is %d\n", csum); 46 - return -EINVAL; 45 + return ERR_PTR(-EINVAL); 47 46 } 48 47 49 - return 0; 48 + return base; 50 49 } 51 50 52 51 static const u8 *drm_find_displayid_extension(const struct drm_edid *drm_edid, ··· 55 54 { 56 55 const u8 *displayid = drm_find_edid_extension(drm_edid, DISPLAYID_EXT, ext_index); 57 56 const struct displayid_header *base; 58 - int ret; 59 57 60 58 if (!displayid) 61 59 return NULL; ··· 63 63 *length = EDID_LENGTH - 1; 64 64 *idx = 1; 65 65 66 - ret = validate_displayid(displayid, *length, *idx); 67 - if (ret) 66 + base = validate_displayid(displayid, *length, *idx); 67 + if (IS_ERR(base)) 68 68 return NULL; 69 69 70 - base = (const struct displayid_header *)&displayid[*idx]; 71 70 *length = *idx + sizeof(*base) + base->bytes; 72 71 73 72 return displayid;