diff options
| author | bcook <> | 2016-11-06 14:00:49 +0000 |
|---|---|---|
| committer | bcook <> | 2016-11-06 14:00:49 +0000 |
| commit | 42bce16c83873657b57addca6d88aa13e2d620f8 (patch) | |
| tree | 4d2e14a3af1ed9b5d1c38354a9a2b6d04a5b6ed8 | |
| parent | 711cbee72a1d7fbbf56d4a876b5b67ee4286aefe (diff) | |
| download | openbsd-42bce16c83873657b57addca6d88aa13e2d620f8.tar.gz openbsd-42bce16c83873657b57addca6d88aa13e2d620f8.tar.bz2 openbsd-42bce16c83873657b57addca6d88aa13e2d620f8.zip | |
simplify error handling in c2i_ASN1_OBJECT
ok beck@, miod@
| -rw-r--r-- | src/lib/libcrypto/asn1/a_object.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/src/lib/libcrypto/asn1/a_object.c b/src/lib/libcrypto/asn1/a_object.c index 5bf450d0e1..3cb0cf7c4b 100644 --- a/src/lib/libcrypto/asn1/a_object.c +++ b/src/lib/libcrypto/asn1/a_object.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: a_object.c,v 1.26 2016/03/17 03:51:49 beck Exp $ */ | 1 | /* $OpenBSD: a_object.c,v 1.27 2016/11/06 14:00:49 bcook 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 | * |
| @@ -284,7 +284,7 @@ err: | |||
| 284 | ASN1_OBJECT * | 284 | ASN1_OBJECT * |
| 285 | c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, long len) | 285 | c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, long len) |
| 286 | { | 286 | { |
| 287 | ASN1_OBJECT *ret = NULL; | 287 | ASN1_OBJECT *ret; |
| 288 | const unsigned char *p; | 288 | const unsigned char *p; |
| 289 | unsigned char *data; | 289 | unsigned char *data; |
| 290 | int i, length; | 290 | int i, length; |
| @@ -307,7 +307,7 @@ c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, long len) | |||
| 307 | if (*p == 0x80 && (!i || !(p[-1] & 0x80))) { | 307 | if (*p == 0x80 && (!i || !(p[-1] & 0x80))) { |
| 308 | ASN1err(ASN1_F_C2I_ASN1_OBJECT, | 308 | ASN1err(ASN1_F_C2I_ASN1_OBJECT, |
| 309 | ASN1_R_INVALID_OBJECT_ENCODING); | 309 | ASN1_R_INVALID_OBJECT_ENCODING); |
| 310 | return NULL; | 310 | return (NULL); |
| 311 | } | 311 | } |
| 312 | } | 312 | } |
| 313 | 313 | ||
| @@ -318,37 +318,39 @@ c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, long len) | |||
| 318 | if ((ret = ASN1_OBJECT_new()) == NULL) | 318 | if ((ret = ASN1_OBJECT_new()) == NULL) |
| 319 | return (NULL); | 319 | return (NULL); |
| 320 | } else | 320 | } else |
| 321 | ret = (*a); | 321 | ret = *a; |
| 322 | 322 | ||
| 323 | p = *pp; | 323 | p = *pp; |
| 324 | |||
| 324 | /* detach data from object */ | 325 | /* detach data from object */ |
| 325 | data = (unsigned char *)ret->data; | 326 | data = (unsigned char *)ret->data; |
| 326 | if (data != NULL) | 327 | if (data != NULL) |
| 327 | explicit_bzero(data, ret->length); | 328 | explicit_bzero(data, ret->length); |
| 328 | free(data); | 329 | free(data); |
| 330 | |||
| 329 | data = malloc(length); | 331 | data = malloc(length); |
| 330 | if (data == NULL) { | 332 | if (data == NULL) { |
| 331 | i = ERR_R_MALLOC_FAILURE; | 333 | ASN1err(ASN1_F_C2I_ASN1_OBJECT, ERR_R_MALLOC_FAILURE); |
| 332 | goto err; | 334 | goto err; |
| 333 | } | 335 | } |
| 334 | ret->flags |= ASN1_OBJECT_FLAG_DYNAMIC_DATA; | 336 | |
| 335 | memcpy(data, p, length); | 337 | memcpy(data, p, length); |
| 338 | |||
| 336 | /* reattach data to object, after which it remains const */ | 339 | /* reattach data to object, after which it remains const */ |
| 337 | ret->data = data; | 340 | ret->data = data; |
| 338 | ret->length = length; | 341 | ret->length = length; |
| 339 | ret->sn = NULL; | 342 | ret->sn = NULL; |
| 340 | ret->ln = NULL; | 343 | ret->ln = NULL; |
| 341 | /* ret->flags=ASN1_OBJECT_FLAG_DYNAMIC; we know it is dynamic */ | 344 | ret->flags |= ASN1_OBJECT_FLAG_DYNAMIC_DATA; |
| 342 | p += length; | 345 | p += length; |
| 343 | 346 | ||
| 344 | if (a != NULL) | 347 | if (a != NULL) |
| 345 | (*a) = ret; | 348 | *a = ret; |
| 346 | *pp = p; | 349 | *pp = p; |
| 347 | return (ret); | 350 | return (ret); |
| 348 | 351 | ||
| 349 | err: | 352 | err: |
| 350 | ASN1err(ASN1_F_C2I_ASN1_OBJECT, i); | 353 | if (ret != *a) |
| 351 | if ((ret != NULL) && ((a == NULL) || (*a != ret))) | ||
| 352 | ASN1_OBJECT_free(ret); | 354 | ASN1_OBJECT_free(ret); |
| 353 | return (NULL); | 355 | return (NULL); |
| 354 | } | 356 | } |
