diff options
author | tb <> | 2019-04-22 17:18:30 +0000 |
---|---|---|
committer | tb <> | 2019-04-22 17:18:30 +0000 |
commit | 4c449633b2bc47af1ff9a4e6d2468ab43560947c (patch) | |
tree | 6730741791bc15c8fb9b40a7eb81810595fe1fa6 /src | |
parent | a2339aa009b2ac9b2d96975d578bb9f9fc757cea (diff) | |
download | openbsd-4c449633b2bc47af1ff9a4e6d2468ab43560947c.tar.gz openbsd-4c449633b2bc47af1ff9a4e6d2468ab43560947c.tar.bz2 openbsd-4c449633b2bc47af1ff9a4e6d2468ab43560947c.zip |
Add error checking to i2v_AUTHORITY_INFO_ACCESS(). While there, replace
an ugly strlen + malloc + strcat/strcpy dance by a simple asprintf().
ok jsing
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libcrypto/x509v3/v3_info.c | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/src/lib/libcrypto/x509v3/v3_info.c b/src/lib/libcrypto/x509v3/v3_info.c index ebacbf5b0a..a895985510 100644 --- a/src/lib/libcrypto/x509v3/v3_info.c +++ b/src/lib/libcrypto/x509v3/v3_info.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: v3_info.c,v 1.26 2018/05/19 10:37:02 tb Exp $ */ | 1 | /* $OpenBSD: v3_info.c,v 1.27 2019/04/22 17:18:30 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 | */ |
@@ -207,33 +207,41 @@ i2v_AUTHORITY_INFO_ACCESS(X509V3_EXT_METHOD *method, | |||
207 | AUTHORITY_INFO_ACCESS *ainfo, STACK_OF(CONF_VALUE) *ret) | 207 | AUTHORITY_INFO_ACCESS *ainfo, STACK_OF(CONF_VALUE) *ret) |
208 | { | 208 | { |
209 | ACCESS_DESCRIPTION *desc; | 209 | ACCESS_DESCRIPTION *desc; |
210 | int i, nlen; | ||
211 | char objtmp[80], *ntmp; | ||
212 | CONF_VALUE *vtmp; | 210 | CONF_VALUE *vtmp; |
211 | STACK_OF(CONF_VALUE) *free_ret = NULL; | ||
212 | char objtmp[80], *ntmp; | ||
213 | int i; | ||
214 | |||
215 | if (ret == NULL) { | ||
216 | if ((free_ret = ret = sk_CONF_VALUE_new_null()) == NULL) | ||
217 | return NULL; | ||
218 | } | ||
213 | 219 | ||
214 | for (i = 0; i < sk_ACCESS_DESCRIPTION_num(ainfo); i++) { | 220 | for (i = 0; i < sk_ACCESS_DESCRIPTION_num(ainfo); i++) { |
215 | desc = sk_ACCESS_DESCRIPTION_value(ainfo, i); | 221 | if ((desc = sk_ACCESS_DESCRIPTION_value(ainfo, i)) == NULL) |
216 | ret = i2v_GENERAL_NAME(method, desc->location, ret); | 222 | goto err; |
217 | if (!ret) | 223 | if ((ret = i2v_GENERAL_NAME(method, desc->location, |
218 | break; | 224 | ret)) == NULL) |
219 | vtmp = sk_CONF_VALUE_value(ret, i); | 225 | goto err; |
220 | i2t_ASN1_OBJECT(objtmp, sizeof objtmp, desc->method); | 226 | if ((vtmp = sk_CONF_VALUE_value(ret, i)) == NULL) |
221 | nlen = strlen(objtmp) + strlen(vtmp->name) + 5; | 227 | goto err; |
222 | ntmp = malloc(nlen); | 228 | if (!i2t_ASN1_OBJECT(objtmp, sizeof objtmp, desc->method)) |
223 | if (!ntmp) { | 229 | goto err; |
230 | if (asprintf(&ntmp, "%s - %s", objtmp, vtmp->name) == -1) { | ||
231 | ntmp = NULL; | ||
224 | X509V3error(ERR_R_MALLOC_FAILURE); | 232 | X509V3error(ERR_R_MALLOC_FAILURE); |
225 | return NULL; | 233 | goto err; |
226 | } | 234 | } |
227 | strlcpy(ntmp, objtmp, nlen); | ||
228 | strlcat(ntmp, " - ", nlen); | ||
229 | strlcat(ntmp, vtmp->name, nlen); | ||
230 | free(vtmp->name); | 235 | free(vtmp->name); |
231 | vtmp->name = ntmp; | 236 | vtmp->name = ntmp; |
232 | |||
233 | } | 237 | } |
234 | if (!ret) | 238 | |
235 | return sk_CONF_VALUE_new_null(); | ||
236 | return ret; | 239 | return ret; |
240 | |||
241 | err: | ||
242 | sk_CONF_VALUE_pop_free(free_ret, X509V3_conf_free); | ||
243 | |||
244 | return NULL; | ||
237 | } | 245 | } |
238 | 246 | ||
239 | static AUTHORITY_INFO_ACCESS * | 247 | static AUTHORITY_INFO_ACCESS * |