summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authortb <>2026-04-26 04:19:11 +0000
committertb <>2026-04-26 04:19:11 +0000
commit38105b7cb94d5e0839470521c269b2c565624ff1 (patch)
treee0e4abdd14a864650ef78f548f6d58ec768f6a3c /src/lib
parentb4ec5423044982c2b2b2b182abe4cb2b99808e57 (diff)
downloadopenbsd-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.c63
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}
1148LCRYPTO_ALIAS(PKCS7_digest_from_attributes); 1148LCRYPTO_ALIAS(PKCS7_digest_from_attributes);
1149 1149
1150int 1150static STACK_OF(X509_ATTRIBUTE) *
1151PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO *p7si, 1151sk_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
1180int
1181PKCS7_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}
1170LCRYPTO_ALIAS(PKCS7_set_signed_attributes); 1188LCRYPTO_ALIAS(PKCS7_set_signed_attributes);
@@ -1172,20 +1190,9 @@ LCRYPTO_ALIAS(PKCS7_set_signed_attributes);
1172int 1190int
1173PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si, STACK_OF(X509_ATTRIBUTE) *sk) 1191PKCS7_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}
1191LCRYPTO_ALIAS(PKCS7_set_attributes); 1198LCRYPTO_ALIAS(PKCS7_set_attributes);