Make it possible to signal an error from an i2c_* function.
authorjsing <jsing@openbsd.org>
Sat, 20 Aug 2022 17:55:08 +0000 (17:55 +0000)
committerjsing <jsing@openbsd.org>
Sat, 20 Aug 2022 17:55:08 +0000 (17:55 +0000)
commit0407cd7c56b59085abc3cfdac1915ff58387c4bd
tree7e46c90cf09fac3e4fa6718c7a21cbc2a3396f22
parentc1d0be48fa851189ddd292c260f8fc90835711eb
Make it possible to signal an error from an i2c_* function.

In asn1_i2d_ex_primitive(), asn1_ex_i2c() returning -1 is used to indicate
that the object is optional and should be skipped, while -2 is used to
indicate that indefinite length encoding should be used. Any other negative
value was treated as success, resulting in the out pointer being walked
backwards. Avoid this by treating any negative value (aside from -1 and -2)
as a failure, propagating it up the stack.

Additionally, check the return value of the second asn1_ex_i2c() call to
ensure that it matches the value returned by the first call. This makes
sure that the length of the encoded object is correct, plus it detects the
case where a failure occurs during the second call.

Discussed with tb@ (who also flagged the negative value issue).
lib/libcrypto/asn1/tasn_enc.c