]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
soc: qcom: check QMI basic element error codes
authorAlexander Wilhelm <alexander.wilhelm@westermo.com>
Wed, 19 Nov 2025 10:40:05 +0000 (11:40 +0100)
committerBjorn Andersson <andersson@kernel.org>
Fri, 16 Jan 2026 14:19:46 +0000 (08:19 -0600)
Extend handling of QMI basic element types to also capture error codes.
This is required for big-endian platforms where a simple memcpy is not
sufficient and exact data type knowledge is necessary.

Signed-off-by: Alexander Wilhelm <alexander.wilhelm@westermo.com>
Link: https://lore.kernel.org/r/20251119104008.3505152-2-alexander.wilhelm@westermo.com
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
drivers/soc/qcom/qmi_encdec.c

index 7660a960fb45ea5dd03fdea3cefa08742f57d462..1d2d9e515870533b285ec41ad67f5882c6b65f29 100644 (file)
@@ -267,11 +267,15 @@ static int qmi_encode_string_elem(const struct qmi_elem_info *ei_array,
                }
                rc = qmi_encode_basic_elem(buf_dst, &string_len,
                                           1, string_len_sz);
+               if (rc < 0)
+                       return rc;
                encoded_bytes += rc;
        }
 
        rc = qmi_encode_basic_elem(buf_dst + encoded_bytes, buf_src,
                                   string_len, temp_ei->elem_size);
+       if (rc < 0)
+               return rc;
        encoded_bytes += rc;
 
        return encoded_bytes;
@@ -333,6 +337,8 @@ static int qmi_encode(const struct qmi_elem_info *ei_array, void *out_buf,
                case QMI_OPT_FLAG:
                        rc = qmi_encode_basic_elem(&opt_flag_value, buf_src,
                                                   1, sizeof(u8));
+                       if (rc < 0)
+                               return rc;
                        if (opt_flag_value)
                                temp_ei = temp_ei + 1;
                        else
@@ -354,11 +360,15 @@ static int qmi_encode(const struct qmi_elem_info *ei_array, void *out_buf,
                                data_len_value = (u32)val8;
                                rc = qmi_encode_basic_elem(buf_dst, &val8,
                                                           1, data_len_sz);
+                               if (rc < 0)
+                                       return rc;
                        } else {
                                val16 = *(u16 *)buf_src;
                                data_len_value = (u32)le16_to_cpu(val16);
                                rc = qmi_encode_basic_elem(buf_dst, &val16,
                                                           1, data_len_sz);
+                               if (rc < 0)
+                                       return rc;
                        }
                        UPDATE_ENCODE_VARIABLES(temp_ei, buf_dst,
                                                encoded_bytes, tlv_len,
@@ -386,6 +396,8 @@ static int qmi_encode(const struct qmi_elem_info *ei_array, void *out_buf,
                        rc = qmi_encode_basic_elem(buf_dst, buf_src,
                                                   data_len_value,
                                                   temp_ei->elem_size);
+                       if (rc < 0)
+                               return rc;
                        UPDATE_ENCODE_VARIABLES(temp_ei, buf_dst,
                                                encoded_bytes, tlv_len,
                                                encode_tlv, rc);
@@ -544,10 +556,14 @@ static int qmi_decode_string_elem(const struct qmi_elem_info *ei_array,
                if (string_len_sz == sizeof(u8)) {
                        rc = qmi_decode_basic_elem(&val8, buf_src,
                                                   1, string_len_sz);
+                       if (rc < 0)
+                               return rc;
                        string_len = (u32)val8;
                } else {
                        rc = qmi_decode_basic_elem(&val16, buf_src,
                                                   1, string_len_sz);
+                       if (rc < 0)
+                               return rc;
                        string_len = (u32)val16;
                }
                decoded_bytes += rc;
@@ -565,6 +581,8 @@ static int qmi_decode_string_elem(const struct qmi_elem_info *ei_array,
 
        rc = qmi_decode_basic_elem(buf_dst, buf_src + decoded_bytes,
                                   string_len, temp_ei->elem_size);
+       if (rc < 0)
+               return rc;
        *((char *)buf_dst + string_len) = '\0';
        decoded_bytes += rc;
 
@@ -667,10 +685,14 @@ static int qmi_decode(const struct qmi_elem_info *ei_array, void *out_c_struct,
                        if (data_len_sz == sizeof(u8)) {
                                rc = qmi_decode_basic_elem(&val8, buf_src,
                                                           1, data_len_sz);
+                               if (rc < 0)
+                                       return rc;
                                data_len_value = (u32)val8;
                        } else {
                                rc = qmi_decode_basic_elem(&val16, buf_src,
                                                           1, data_len_sz);
+                               if (rc < 0)
+                                       return rc;
                                data_len_value = (u32)val16;
                        }
                        val32 = cpu_to_le32(data_len_value);
@@ -701,6 +723,8 @@ static int qmi_decode(const struct qmi_elem_info *ei_array, void *out_c_struct,
                        rc = qmi_decode_basic_elem(buf_dst, buf_src,
                                                   data_len_value,
                                                   temp_ei->elem_size);
+                       if (rc < 0)
+                               return rc;
                        UPDATE_DECODE_VARIABLES(buf_src, decoded_bytes, rc);
                        break;