drm/i915/bios: fix slab-out-of-bounds access
authorJani Nikula <jani.nikula@intel.com>
Wed, 22 Dec 2021 08:16:54 +0000 (10:16 +0200)
committerJani Nikula <jani.nikula@intel.com>
Thu, 23 Dec 2021 10:05:42 +0000 (12:05 +0200)
If VBT size is not a multiple of 4, the last 4-byte store will be out of
bounds of the allocated buffer. Spotted with KASAN. Round up the
allocation size.

v2: Use round_up() intead of roundup() as it's a power of 2 (Thomas)

Reported-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Fixes: a36e7dc0af1c ("drm/i915/dg1: Read OPROM via SPI controller")
Cc: Clint Taylor <clinton.a.taylor@intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211222081654.1843211-1-jani.nikula@intel.com
drivers/gpu/drm/i915/display/intel_bios.c

index 76a8f00..c7a8d51 100644 (file)
@@ -2369,7 +2369,7 @@ static struct vbt_header *spi_oprom_get_vbt(struct drm_i915_private *i915)
        vbt_size = intel_uncore_read(&i915->uncore, PRIMARY_SPI_TRIGGER);
        vbt_size &= 0xffff;
 
-       vbt = kzalloc(vbt_size, GFP_KERNEL);
+       vbt = kzalloc(round_up(vbt_size, 4), GFP_KERNEL);
        if (!vbt)
                goto err_not_found;