diff options
| author | tb <> | 2026-04-26 04:19:11 +0000 |
|---|---|---|
| committer | tb <> | 2026-04-26 04:19:11 +0000 |
| commit | 38105b7cb94d5e0839470521c269b2c565624ff1 (patch) | |
| tree | e0e4abdd14a864650ef78f548f6d58ec768f6a3c /src/lib | |
| parent | b4ec5423044982c2b2b2b182abe4cb2b99808e57 (diff) | |
| download | openbsd-38105b7cb94d5e0839470521c269b2c565624ff1.tar.gz openbsd-38105b7cb94d5e0839470521c269b2c565624ff1.tar.bz2 openbsd-38105b7cb94d5e0839470521c269b2c565624ff1.zip | |
Fix PKCS7_set_{un,}signed_attributes()
In both these functions, if the X509_ATTRIBUTE_dup() fails, the
remainder of the sk stack is shared with p7si->{un,}auth_attr and
the caller will likely end up freeing it twice.
Fix this by writing another sk_deep_copy() patterned after the existing
ones in x509_lu.c and x509_vpm.c. PKCS7_set_{un,}signed_attributes()
become trivial wrappers of that.
ok jsing kenjiro
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/libcrypto/pkcs7/pk7_doit.c | 63 |
1 files changed, 35 insertions, 28 deletions
diff --git a/src/lib/libcrypto/pkcs7/pk7_doit.c b/src/lib/libcrypto/pkcs7/pk7_doit.c index c999cbef2b..c191329b56 100644 --- a/src/lib/libcrypto/pkcs7/pk7_doit.c +++ b/src/lib/libcrypto/pkcs7/pk7_doit.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: pk7_doit.c,v 1.67 2026/04/25 10:54:30 tb Exp $ */ | 1 | /* $OpenBSD: pk7_doit.c,v 1.68 2026/04/26 04:19:11 tb Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -1147,24 +1147,42 @@ PKCS7_digest_from_attributes(STACK_OF(X509_ATTRIBUTE) *sk) | |||
| 1147 | } | 1147 | } |
| 1148 | LCRYPTO_ALIAS(PKCS7_digest_from_attributes); | 1148 | LCRYPTO_ALIAS(PKCS7_digest_from_attributes); |
| 1149 | 1149 | ||
| 1150 | int | 1150 | static STACK_OF(X509_ATTRIBUTE) * |
| 1151 | PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO *p7si, | 1151 | sk_X509_ATTRIBUTE_deep_copy(const STACK_OF(X509_ATTRIBUTE) *in_attrs) |
| 1152 | STACK_OF(X509_ATTRIBUTE) *sk) | ||
| 1153 | { | 1152 | { |
| 1153 | STACK_OF(X509_ATTRIBUTE) *attrs = NULL; | ||
| 1154 | X509_ATTRIBUTE *attr = NULL; | ||
| 1154 | int i; | 1155 | int i; |
| 1155 | 1156 | ||
| 1156 | if (p7si->auth_attr != NULL) | 1157 | if ((attrs = sk_X509_ATTRIBUTE_new_null()) == NULL) { |
| 1157 | sk_X509_ATTRIBUTE_pop_free(p7si->auth_attr, | 1158 | X509error(ERR_R_MALLOC_FAILURE); |
| 1158 | X509_ATTRIBUTE_free); | 1159 | goto err; |
| 1159 | p7si->auth_attr = sk_X509_ATTRIBUTE_dup(sk); | 1160 | } |
| 1160 | if (p7si->auth_attr == NULL) | 1161 | |
| 1161 | return 0; | 1162 | for (i = 0; i < sk_X509_ATTRIBUTE_num(in_attrs); i++) { |
| 1162 | for (i = 0; i < sk_X509_ATTRIBUTE_num(sk); i++) { | 1163 | attr = X509_ATTRIBUTE_dup(sk_X509_ATTRIBUTE_value(in_attrs, i)); |
| 1163 | if ((sk_X509_ATTRIBUTE_set(p7si->auth_attr, i, | 1164 | if (attr == NULL) |
| 1164 | X509_ATTRIBUTE_dup(sk_X509_ATTRIBUTE_value(sk, i)))) | 1165 | goto err; |
| 1165 | == NULL) | 1166 | if (!sk_X509_ATTRIBUTE_push(attrs, attr)) |
| 1166 | return 0; | 1167 | goto err; |
| 1168 | attr = NULL; | ||
| 1167 | } | 1169 | } |
| 1170 | |||
| 1171 | return attrs; | ||
| 1172 | |||
| 1173 | err: | ||
| 1174 | X509_ATTRIBUTE_free(attr); | ||
| 1175 | sk_X509_ATTRIBUTE_pop_free(attrs, X509_ATTRIBUTE_free); | ||
| 1176 | |||
| 1177 | return NULL; | ||
| 1178 | } | ||
| 1179 | |||
| 1180 | int | ||
| 1181 | PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO *p7si, STACK_OF(X509_ATTRIBUTE) *sk) | ||
| 1182 | { | ||
| 1183 | sk_X509_ATTRIBUTE_pop_free(p7si->auth_attr, X509_ATTRIBUTE_free); | ||
| 1184 | if ((p7si->auth_attr = sk_X509_ATTRIBUTE_deep_copy(sk)) == NULL) | ||
| 1185 | return 0; | ||
| 1168 | return 1; | 1186 | return 1; |
| 1169 | } | 1187 | } |
| 1170 | LCRYPTO_ALIAS(PKCS7_set_signed_attributes); | 1188 | LCRYPTO_ALIAS(PKCS7_set_signed_attributes); |
| @@ -1172,20 +1190,9 @@ LCRYPTO_ALIAS(PKCS7_set_signed_attributes); | |||
| 1172 | int | 1190 | int |
| 1173 | PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si, STACK_OF(X509_ATTRIBUTE) *sk) | 1191 | PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si, STACK_OF(X509_ATTRIBUTE) *sk) |
| 1174 | { | 1192 | { |
| 1175 | int i; | 1193 | sk_X509_ATTRIBUTE_pop_free(p7si->unauth_attr, X509_ATTRIBUTE_free); |
| 1176 | 1194 | if ((p7si->unauth_attr = sk_X509_ATTRIBUTE_deep_copy(sk)) == NULL) | |
| 1177 | if (p7si->unauth_attr != NULL) | ||
| 1178 | sk_X509_ATTRIBUTE_pop_free(p7si->unauth_attr, | ||
| 1179 | X509_ATTRIBUTE_free); | ||
| 1180 | p7si->unauth_attr = sk_X509_ATTRIBUTE_dup(sk); | ||
| 1181 | if (p7si->unauth_attr == NULL) | ||
| 1182 | return 0; | 1195 | return 0; |
| 1183 | for (i = 0; i < sk_X509_ATTRIBUTE_num(sk); i++) { | ||
| 1184 | if ((sk_X509_ATTRIBUTE_set(p7si->unauth_attr, i, | ||
| 1185 | X509_ATTRIBUTE_dup(sk_X509_ATTRIBUTE_value(sk, i)))) | ||
| 1186 | == NULL) | ||
| 1187 | return 0; | ||
| 1188 | } | ||
| 1189 | return 1; | 1196 | return 1; |
| 1190 | } | 1197 | } |
| 1191 | LCRYPTO_ALIAS(PKCS7_set_attributes); | 1198 | LCRYPTO_ALIAS(PKCS7_set_attributes); |
