]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
rockchip: avoid out-of-bounds when computing cpuid
authorQuentin Schulz <quentin.schulz@theobroma-systems.com>
Mon, 11 Mar 2024 12:01:44 +0000 (13:01 +0100)
committerKever Yang <kever.yang@rock-chips.com>
Wed, 13 Mar 2024 10:14:19 +0000 (18:14 +0800)
The expected length of the cpuid, as passed with cpuid_length,
determines the size of cpuid_str string. Therefore, care should be taken
to make sure nothing is accessing data out-of-bounds.

Instead of using hardcoded values, derive them from cpuid_length.

Cc: Quentin Schulz <foss+uboot@0leil.net>
Reviewed-by: Kever Yang <kever.yang@rock-chips.com>
Reviewed-by: Dragan Simic <dsimic@manjaro.org>
Signed-off-by: Quentin Schulz <quentin.schulz@theobroma-systems.com>
arch/arm/mach-rockchip/misc.c

index 7d03f0c2b6792c669fd2352aa6c9cf8283978f5d..15397cff009b91c11018c56ba21a21863890da6c 100644 (file)
@@ -102,7 +102,7 @@ int rockchip_cpuid_set(const u8 *cpuid, const u32 cpuid_length)
        int i;
 
        memset(cpuid_str, 0, sizeof(cpuid_str));
-       for (i = 0; i < 16; i++)
+       for (i = 0; i < cpuid_length; i++)
                sprintf(&cpuid_str[i * 2], "%02x", cpuid[i]);
 
        debug("cpuid: %s\n", cpuid_str);
@@ -111,13 +111,13 @@ int rockchip_cpuid_set(const u8 *cpuid, const u32 cpuid_length)
         * Mix the cpuid bytes using the same rules as in
         *   ${linux}/drivers/soc/rockchip/rockchip-cpuinfo.c
         */
-       for (i = 0; i < 8; i++) {
+       for (i = 0; i < cpuid_length / 2; i++) {
                low[i] = cpuid[1 + (i << 1)];
                high[i] = cpuid[i << 1];
        }
 
-       serialno = crc32_no_comp(0, low, 8);
-       serialno |= (u64)crc32_no_comp(serialno, high, 8) << 32;
+       serialno = crc32_no_comp(0, low, cpuid_length / 2);
+       serialno |= (u64)crc32_no_comp(serialno, high, cpuid_length / 2) << 32;
        snprintf(serialno_str, sizeof(serialno_str), "%016llx", serialno);
 
        oldid = env_get("cpuid#");