summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortb <>2019-04-21 16:50:34 +0000
committertb <>2019-04-21 16:50:34 +0000
commit6cb76fe84ed5d0dde673a8aea04318d4dbcc96d9 (patch)
tree796d18cc54886cb2407e36d7d31d982c243ecd05
parent7bbdab19e025dac2cb71c1027b0419b712f48447 (diff)
downloadopenbsd-6cb76fe84ed5d0dde673a8aea04318d4dbcc96d9.tar.gz
openbsd-6cb76fe84ed5d0dde673a8aea04318d4dbcc96d9.tar.bz2
openbsd-6cb76fe84ed5d0dde673a8aea04318d4dbcc96d9.zip
Add error checking to i2v_AUTHORITY_KEYID(), i2v_GENERAL_NAME()
and i2v_GENERAL_NAMES(). This fixes a couple of leaks and other ugliness. tweaks & ok jsing
-rw-r--r--src/lib/libcrypto/x509v3/v3_akey.c45
-rw-r--r--src/lib/libcrypto/x509v3/v3_alt.c67
2 files changed, 80 insertions, 32 deletions
diff --git a/src/lib/libcrypto/x509v3/v3_akey.c b/src/lib/libcrypto/x509v3/v3_akey.c
index 3b57fd21f7..65184b19b6 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.20 2019/04/21 08:07:47 tb Exp $ */ 1/* $OpenBSD: v3_akey.c,v 1.21 2019/04/21 16:50:34 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,22 +91,41 @@ 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 char *tmp; 94 char *tmpstr = NULL;
95 95
96 if (akeyid->keyid) { 96 if (akeyid->keyid != NULL) {
97 tmp = hex_to_string(akeyid->keyid->data, akeyid->keyid->length); 97 if ((tmpstr = hex_to_string(akeyid->keyid->data,
98 X509V3_add_value("keyid", tmp, &extlist); 98 akeyid->keyid->length)) == NULL)
99 free(tmp); 99 goto err;
100 if (!X509V3_add_value("keyid", tmpstr, &extlist))
101 goto err;
102 free(tmpstr);
103 tmpstr = NULL;
100 } 104 }
101 if (akeyid->issuer) 105
102 extlist = i2v_GENERAL_NAMES(NULL, akeyid->issuer, extlist); 106 if (akeyid->issuer != NULL) {
103 if (akeyid->serial) { 107 if ((extlist = i2v_GENERAL_NAMES(NULL, akeyid->issuer,
104 tmp = hex_to_string(akeyid->serial->data, 108 extlist)) == NULL)
105 akeyid->serial->length); 109 goto err;
106 X509V3_add_value("serial", tmp, &extlist);
107 free(tmp);
108 } 110 }
111
112 if (akeyid->serial != NULL) {
113 if ((tmpstr = hex_to_string(akeyid->serial->data,
114 akeyid->serial->length)) == NULL)
115 goto err;
116 if (!X509V3_add_value("serial", tmpstr, &extlist))
117 goto err;
118 free(tmpstr);
119 tmpstr = NULL;
120 }
121
109 return extlist; 122 return extlist;
123
124 err:
125 free(tmpstr);
126 sk_CONF_VALUE_pop_free(extlist, X509V3_conf_free);
127
128 return NULL;
110} 129}
111 130
112/* 131/*
diff --git a/src/lib/libcrypto/x509v3/v3_alt.c b/src/lib/libcrypto/x509v3/v3_alt.c
index 08063d191b..2dc07b4025 100644
--- a/src/lib/libcrypto/x509v3/v3_alt.c
+++ b/src/lib/libcrypto/x509v3/v3_alt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: v3_alt.c,v 1.28 2018/05/18 19:34:37 tb Exp $ */ 1/* $OpenBSD: v3_alt.c,v 1.29 2019/04/21 16:50:34 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. 3 * project.
4 */ 4 */
@@ -127,16 +127,27 @@ STACK_OF(CONF_VALUE) *
127i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, GENERAL_NAMES *gens, 127i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, GENERAL_NAMES *gens,
128 STACK_OF(CONF_VALUE) *ret) 128 STACK_OF(CONF_VALUE) *ret)
129{ 129{
130 int i;
131 GENERAL_NAME *gen; 130 GENERAL_NAME *gen;
131 int i;
132
133 if (ret == NULL) {
134 if ((ret = sk_CONF_VALUE_new_null()) == NULL)
135 return NULL;
136 }
132 137
133 for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) { 138 for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
134 gen = sk_GENERAL_NAME_value(gens, i); 139 if ((gen = sk_GENERAL_NAME_value(gens, i)) == NULL)
135 ret = i2v_GENERAL_NAME(method, gen, ret); 140 goto err;
141 if ((ret = i2v_GENERAL_NAME(method, gen, ret)) == NULL)
142 goto err;
136 } 143 }
137 if (!ret) 144
138 return sk_CONF_VALUE_new_null();
139 return ret; 145 return ret;
146
147 err:
148 sk_CONF_VALUE_pop_free(ret, X509V3_conf_free);
149
150 return NULL;
140} 151}
141 152
142STACK_OF(CONF_VALUE) * 153STACK_OF(CONF_VALUE) *
@@ -149,35 +160,43 @@ i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, GENERAL_NAME *gen,
149 160
150 switch (gen->type) { 161 switch (gen->type) {
151 case GEN_OTHERNAME: 162 case GEN_OTHERNAME:
152 X509V3_add_value("othername", "<unsupported>", &ret); 163 if (!X509V3_add_value("othername", "<unsupported>", &ret))
164 goto err;
153 break; 165 break;
154 166
155 case GEN_X400: 167 case GEN_X400:
156 X509V3_add_value("X400Name", "<unsupported>", &ret); 168 if (!X509V3_add_value("X400Name", "<unsupported>", &ret))
169 goto err;
157 break; 170 break;
158 171
159 case GEN_EDIPARTY: 172 case GEN_EDIPARTY:
160 X509V3_add_value("EdiPartyName", "<unsupported>", &ret); 173 if (!X509V3_add_value("EdiPartyName", "<unsupported>", &ret))
174 goto err;
161 break; 175 break;
162 176
163 case GEN_EMAIL: 177 case GEN_EMAIL:
164 X509V3_add_value_uchar("email", gen->d.ia5->data, &ret); 178 if (!X509V3_add_value_uchar("email", gen->d.ia5->data, &ret))
179 goto err;
165 break; 180 break;
166 181
167 case GEN_DNS: 182 case GEN_DNS:
168 X509V3_add_value_uchar("DNS", gen->d.ia5->data, &ret); 183 if (!X509V3_add_value_uchar("DNS", gen->d.ia5->data, &ret))
184 goto err;
169 break; 185 break;
170 186
171 case GEN_URI: 187 case GEN_URI:
172 X509V3_add_value_uchar("URI", gen->d.ia5->data, &ret); 188 if (!X509V3_add_value_uchar("URI", gen->d.ia5->data, &ret))
189 goto err;
173 break; 190 break;
174 191
175 case GEN_DIRNAME: 192 case GEN_DIRNAME:
176 X509_NAME_oneline(gen->d.dirn, oline, 256); 193 if (X509_NAME_oneline(gen->d.dirn, oline, 256) == NULL)
177 X509V3_add_value("DirName", oline, &ret); 194 goto err;
195 if (!X509V3_add_value("DirName", oline, &ret))
196 goto err;
178 break; 197 break;
179 198
180 case GEN_IPADD: 199 case GEN_IPADD: /* XXX */
181 p = gen->d.ip->data; 200 p = gen->d.ip->data;
182 if (gen->d.ip->length == 4) 201 if (gen->d.ip->length == 4)
183 (void) snprintf(oline, sizeof oline, 202 (void) snprintf(oline, sizeof oline,
@@ -193,18 +212,28 @@ i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, GENERAL_NAME *gen,
193 strlcat(oline, ":", sizeof(oline)); 212 strlcat(oline, ":", sizeof(oline));
194 } 213 }
195 } else { 214 } else {
196 X509V3_add_value("IP Address", "<invalid>", &ret); 215 if (!X509V3_add_value("IP Address", "<invalid>", &ret))
216 goto err;
197 break; 217 break;
198 } 218 }
199 X509V3_add_value("IP Address", oline, &ret); 219 if (!X509V3_add_value("IP Address", oline, &ret))
220 goto err;
200 break; 221 break;
201 222
202 case GEN_RID: 223 case GEN_RID:
203 i2t_ASN1_OBJECT(oline, 256, gen->d.rid); 224 if (!i2t_ASN1_OBJECT(oline, 256, gen->d.rid))
204 X509V3_add_value("Registered ID", oline, &ret); 225 goto err;
226 if (!X509V3_add_value("Registered ID", oline, &ret))
227 goto err;
205 break; 228 break;
206 } 229 }
230
207 return ret; 231 return ret;
232
233 err:
234 sk_CONF_VALUE_pop_free(ret, X509V3_conf_free);
235
236 return NULL;
208} 237}
209 238
210int 239int