Hi,
From the grub2 Coverity report, it raised a potential integer argument overflow
in asn1_der_decoding2() (CID 463073).
***** CID 463073
1481 DECR_LEN (ider_len, len2);
1482
1483 len4 =
1484 asn1_get_length_der (der + counter + len2, ider_len, &len3);
1485 if (IS_ERR (len4, flags))
1486 {
1487 result = ASN1_DER_ERROR;
1488 warn ();
1489 goto cleanup;
1490 }
1491 if (len4 != -1) /* definite */
1492 {
433. overflow: The expression len2 is considered to have possibly
overflowed.
1493 len2 += len4;
1494
434. Condition ider_len < 0, taking false branch.
1495 DECR_LEN (ider_len, len4 + len3);
435. overflow: The expression len2 + len3 is deemed overflowed because
at least one of its arguments has overflowed.
CID 463073: (#1 of 1): Overflowed integer argument (INTEGER_OVERFLOW)
436. overflow_sink: len2 + len3, which might have underflowed, is passed to
_asn1_set_value_lv(p, der + counter, len2 + len3).[show details]
1496 _asn1_set_value_lv (p, der + counter, len2 + len3);
*****
However, it seems to be false positive.
DECR_LEN (ider_len, len2) at line 1481 subtracts len2 from ider_len.
The remaining ider_len is passed to asn1_get_length_der(), which ensures:
- len4 < INT_MAX
- len4 + len3 doesn’t overflow,
- len4 + len3 <= ider_len
This implies that the sum len2 + len3 + len4 is bounded by ider_len. Therefore,
the argument, len2 + len3, passed to _asn1_set_value_lv() is within safe bound.
Since I'm not familiar with libtasn1, I'd need libtasn1 upstream to confirm
that.
Thanks,
Lidong