Skip to content

Commit 5a6d033

Browse files
alewi-westermoandersson
authored andcommitted
soc: qcom: check QMI basic element error codes
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>
1 parent ccef4b2 commit 5a6d033

1 file changed

Lines changed: 24 additions & 0 deletions

File tree

drivers/soc/qcom/qmi_encdec.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,11 +267,15 @@ static int qmi_encode_string_elem(const struct qmi_elem_info *ei_array,
267267
}
268268
rc = qmi_encode_basic_elem(buf_dst, &string_len,
269269
1, string_len_sz);
270+
if (rc < 0)
271+
return rc;
270272
encoded_bytes += rc;
271273
}
272274

273275
rc = qmi_encode_basic_elem(buf_dst + encoded_bytes, buf_src,
274276
string_len, temp_ei->elem_size);
277+
if (rc < 0)
278+
return rc;
275279
encoded_bytes += rc;
276280

277281
return encoded_bytes;
@@ -333,6 +337,8 @@ static int qmi_encode(const struct qmi_elem_info *ei_array, void *out_buf,
333337
case QMI_OPT_FLAG:
334338
rc = qmi_encode_basic_elem(&opt_flag_value, buf_src,
335339
1, sizeof(u8));
340+
if (rc < 0)
341+
return rc;
336342
if (opt_flag_value)
337343
temp_ei = temp_ei + 1;
338344
else
@@ -354,11 +360,15 @@ static int qmi_encode(const struct qmi_elem_info *ei_array, void *out_buf,
354360
data_len_value = (u32)val8;
355361
rc = qmi_encode_basic_elem(buf_dst, &val8,
356362
1, data_len_sz);
363+
if (rc < 0)
364+
return rc;
357365
} else {
358366
val16 = *(u16 *)buf_src;
359367
data_len_value = (u32)le16_to_cpu(val16);
360368
rc = qmi_encode_basic_elem(buf_dst, &val16,
361369
1, data_len_sz);
370+
if (rc < 0)
371+
return rc;
362372
}
363373
UPDATE_ENCODE_VARIABLES(temp_ei, buf_dst,
364374
encoded_bytes, tlv_len,
@@ -386,6 +396,8 @@ static int qmi_encode(const struct qmi_elem_info *ei_array, void *out_buf,
386396
rc = qmi_encode_basic_elem(buf_dst, buf_src,
387397
data_len_value,
388398
temp_ei->elem_size);
399+
if (rc < 0)
400+
return rc;
389401
UPDATE_ENCODE_VARIABLES(temp_ei, buf_dst,
390402
encoded_bytes, tlv_len,
391403
encode_tlv, rc);
@@ -544,10 +556,14 @@ static int qmi_decode_string_elem(const struct qmi_elem_info *ei_array,
544556
if (string_len_sz == sizeof(u8)) {
545557
rc = qmi_decode_basic_elem(&val8, buf_src,
546558
1, string_len_sz);
559+
if (rc < 0)
560+
return rc;
547561
string_len = (u32)val8;
548562
} else {
549563
rc = qmi_decode_basic_elem(&val16, buf_src,
550564
1, string_len_sz);
565+
if (rc < 0)
566+
return rc;
551567
string_len = (u32)val16;
552568
}
553569
decoded_bytes += rc;
@@ -565,6 +581,8 @@ static int qmi_decode_string_elem(const struct qmi_elem_info *ei_array,
565581

566582
rc = qmi_decode_basic_elem(buf_dst, buf_src + decoded_bytes,
567583
string_len, temp_ei->elem_size);
584+
if (rc < 0)
585+
return rc;
568586
*((char *)buf_dst + string_len) = '\0';
569587
decoded_bytes += rc;
570588

@@ -667,10 +685,14 @@ static int qmi_decode(const struct qmi_elem_info *ei_array, void *out_c_struct,
667685
if (data_len_sz == sizeof(u8)) {
668686
rc = qmi_decode_basic_elem(&val8, buf_src,
669687
1, data_len_sz);
688+
if (rc < 0)
689+
return rc;
670690
data_len_value = (u32)val8;
671691
} else {
672692
rc = qmi_decode_basic_elem(&val16, buf_src,
673693
1, data_len_sz);
694+
if (rc < 0)
695+
return rc;
674696
data_len_value = (u32)val16;
675697
}
676698
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,
701723
rc = qmi_decode_basic_elem(buf_dst, buf_src,
702724
data_len_value,
703725
temp_ei->elem_size);
726+
if (rc < 0)
727+
return rc;
704728
UPDATE_DECODE_VARIABLES(buf_src, decoded_bytes, rc);
705729
break;
706730

0 commit comments

Comments
 (0)