]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
accel/qaic: Use check_add_overflow in sahara for 64b types
authorZack McKevitt <zmckevit@qti.qualcomm.com>
Wed, 15 Oct 2025 16:54:08 +0000 (18:54 +0200)
committerJeff Hugo <jeff.hugo@oss.qualcomm.com>
Mon, 20 Oct 2025 14:30:37 +0000 (08:30 -0600)
Use check_add_overflow instead of size_add in sahara when
64b types are being added to ensure compatibility with 32b
systems. The size_add function parameters are of size_t, so
64b data types may be truncated when cast to size_t on 32b
systems. When using check_add_overflow, no type casts are made,
making it a more portable option.

Signed-off-by: Zack McKevitt <zmckevit@qti.qualcomm.com>
Signed-off-by: Youssef Samir <youssef.abdulrahman@oss.qualcomm.com>
Reviewed-by: Jeff Hugo <jeff.hugo@oss.qualcomm.com>
Reviewed-by: Carl Vanderlip <carl.vanderlip@oss.qualcomm.com>
Signed-off-by: Jeff Hugo <jeff.hugo@oss.qualcomm.com>
Link: https://lore.kernel.org/r/20251015165408.213645-1-youssef.abdulrahman@oss.qualcomm.com
drivers/accel/qaic/sahara.c

index b126cca937a95973c56bbc807df4a286b03c015d..b78f0106ddb058b001b86bb61709d1ef6ad95e57 100644 (file)
@@ -575,6 +575,7 @@ static void sahara_parse_dump_table(struct sahara_context *context)
        struct sahara_memory_dump_meta_v1 *dump_meta;
        u64 table_nents;
        u64 dump_length;
+       u64 mul_bytes;
        int ret;
        u64 i;
 
@@ -588,8 +589,9 @@ static void sahara_parse_dump_table(struct sahara_context *context)
                dev_table[i].description[SAHARA_TABLE_ENTRY_STR_LEN - 1] = 0;
                dev_table[i].filename[SAHARA_TABLE_ENTRY_STR_LEN - 1] = 0;
 
-               dump_length = size_add(dump_length, le64_to_cpu(dev_table[i].length));
-               if (dump_length == SIZE_MAX) {
+               if (check_add_overflow(dump_length,
+                                      le64_to_cpu(dev_table[i].length),
+                                      &dump_length)) {
                        /* Discard the dump */
                        sahara_send_reset(context);
                        return;
@@ -605,14 +607,17 @@ static void sahara_parse_dump_table(struct sahara_context *context)
                        dev_table[i].filename);
        }
 
-       dump_length = size_add(dump_length, sizeof(*dump_meta));
-       if (dump_length == SIZE_MAX) {
+       if (check_add_overflow(dump_length, (u64)sizeof(*dump_meta), &dump_length)) {
                /* Discard the dump */
                sahara_send_reset(context);
                return;
        }
-       dump_length = size_add(dump_length, size_mul(sizeof(*image_out_table), table_nents));
-       if (dump_length == SIZE_MAX) {
+       if (check_mul_overflow((u64)sizeof(*image_out_table), table_nents, &mul_bytes)) {
+               /* Discard the dump */
+               sahara_send_reset(context);
+               return;
+       }
+       if (check_add_overflow(dump_length, mul_bytes, &dump_length)) {
                /* Discard the dump */
                sahara_send_reset(context);
                return;