summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjsing <>2022-08-20 17:55:08 +0000
committerjsing <>2022-08-20 17:55:08 +0000
commit8ac1b2953068d5c968e516c4bd4ab89d61c5f3d6 (patch)
tree89a2da2d04ce101edf0271b14ed00f7b9bc2022e
parent95b7defd486f5736d9f91a6f71156c20f91756e9 (diff)
downloadopenbsd-8ac1b2953068d5c968e516c4bd4ab89d61c5f3d6.tar.gz
openbsd-8ac1b2953068d5c968e516c4bd4ab89d61c5f3d6.tar.bz2
openbsd-8ac1b2953068d5c968e516c4bd4ab89d61c5f3d6.zip
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).
-rw-r--r--src/lib/libcrypto/asn1/tasn_enc.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/lib/libcrypto/asn1/tasn_enc.c b/src/lib/libcrypto/asn1/tasn_enc.c
index ee2320f856..d42c5ea369 100644
--- a/src/lib/libcrypto/asn1/tasn_enc.c
+++ b/src/lib/libcrypto/asn1/tasn_enc.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tasn_enc.c,v 1.24 2022/01/07 11:13:54 tb Exp $ */ 1/* $OpenBSD: tasn_enc.c,v 1.25 2022/08/20 17:55:08 jsing Exp $ */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project 2000. 3 * project 2000.
4 */ 4 */
@@ -529,6 +529,10 @@ asn1_i2d_ex_primitive(ASN1_VALUE **pval, unsigned char **out,
529 len = 0; 529 len = 0;
530 } 530 }
531 531
532 /* Treat any other negative value as an error. */
533 if (len < 0)
534 return -1;
535
532 /* If not implicitly tagged get tag from underlying type */ 536 /* If not implicitly tagged get tag from underlying type */
533 if (tag == -1) 537 if (tag == -1)
534 tag = utype; 538 tag = utype;
@@ -537,7 +541,8 @@ asn1_i2d_ex_primitive(ASN1_VALUE **pval, unsigned char **out,
537 if (out) { 541 if (out) {
538 if (usetag) 542 if (usetag)
539 ASN1_put_object(out, ndef, len, tag, aclass); 543 ASN1_put_object(out, ndef, len, tag, aclass);
540 asn1_ex_i2c(pval, *out, &utype, it); 544 if (asn1_ex_i2c(pval, *out, &utype, it) != len)
545 return -1;
541 if (ndef) 546 if (ndef)
542 ASN1_put_eoc(out); 547 ASN1_put_eoc(out);
543 else 548 else