summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/x509v3/v3_akey.c
diff options
context:
space:
mode:
authortb <>2019-04-22 17:10:01 +0000
committertb <>2019-04-22 17:10:01 +0000
commita2339aa009b2ac9b2d96975d578bb9f9fc757cea (patch)
tree268a5bb33a01011111228f72e3d2be40eeae915b /src/lib/libcrypto/x509v3/v3_akey.c
parente9d90e49492029ba1aa3e87e920475ddc0aeb803 (diff)
downloadopenbsd-a2339aa009b2ac9b2d96975d578bb9f9fc757cea.tar.gz
openbsd-a2339aa009b2ac9b2d96975d578bb9f9fc757cea.tar.bz2
openbsd-a2339aa009b2ac9b2d96975d578bb9f9fc757cea.zip
Avoid potential double frees in i2v_AUTHORITY_KEYID(), i2v_GENERAL_NAME()
and i2v_GENERAL_NAMES() by taking ownership of the extlist only if we were passed NULL. Otherwise it remains the caller's responsibility to free it. To do so, we allocate the extlist explicitly instead of using X509V3_add_value()'s implicit allocation feature. Preserve behavior in i2v_AUTHORITY_KEYID() by adding an explicit check that something was pushed onto the stack. The other i2v_* functions will receive a similar treatment in upcoming commits. ok jsing
Diffstat (limited to 'src/lib/libcrypto/x509v3/v3_akey.c')
-rw-r--r--src/lib/libcrypto/x509v3/v3_akey.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/lib/libcrypto/x509v3/v3_akey.c b/src/lib/libcrypto/x509v3/v3_akey.c
index 65184b19b6..e49f45fe0a 100644
--- a/src/lib/libcrypto/x509v3/v3_akey.c
+++ b/src/lib/libcrypto/x509v3/v3_akey.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: v3_akey.c,v 1.21 2019/04/21 16:50:34 tb Exp $ */ 1/* $OpenBSD: v3_akey.c,v 1.22 2019/04/22 17:10:01 tb 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 1999. 3 * project 1999.
4 */ 4 */
@@ -91,8 +91,14 @@ static STACK_OF(CONF_VALUE) *
91i2v_AUTHORITY_KEYID(X509V3_EXT_METHOD *method, AUTHORITY_KEYID *akeyid, 91i2v_AUTHORITY_KEYID(X509V3_EXT_METHOD *method, AUTHORITY_KEYID *akeyid,
92 STACK_OF(CONF_VALUE) *extlist) 92 STACK_OF(CONF_VALUE) *extlist)
93{ 93{
94 STACK_OF(CONF_VALUE) *free_extlist = NULL;
94 char *tmpstr = NULL; 95 char *tmpstr = NULL;
95 96
97 if (extlist == NULL) {
98 if ((free_extlist = extlist = sk_CONF_VALUE_new_null()) == NULL)
99 return NULL;
100 }
101
96 if (akeyid->keyid != NULL) { 102 if (akeyid->keyid != NULL) {
97 if ((tmpstr = hex_to_string(akeyid->keyid->data, 103 if ((tmpstr = hex_to_string(akeyid->keyid->data,
98 akeyid->keyid->length)) == NULL) 104 akeyid->keyid->length)) == NULL)
@@ -119,11 +125,14 @@ i2v_AUTHORITY_KEYID(X509V3_EXT_METHOD *method, AUTHORITY_KEYID *akeyid,
119 tmpstr = NULL; 125 tmpstr = NULL;
120 } 126 }
121 127
128 if (sk_CONF_VALUE_num(extlist) <= 0)
129 goto err;
130
122 return extlist; 131 return extlist;
123 132
124 err: 133 err:
125 free(tmpstr); 134 free(tmpstr);
126 sk_CONF_VALUE_pop_free(extlist, X509V3_conf_free); 135 sk_CONF_VALUE_pop_free(free_extlist, X509V3_conf_free);
127 136
128 return NULL; 137 return NULL;
129} 138}