diff options
author | 2016-11-06 14:00:49 +0000 | |
---|---|---|
committer | 2016-11-06 14:00:49 +0000 | |
commit | 16290f2a1ca6928b490068003bc8c614a1a8509e (patch) | |
tree | a2fd68ced2fbc522e70be2d881e0077f1f52d30d | |
parent | Split out the DHE and ECDHE code paths from (diff) | |
download | wireguard-openbsd-16290f2a1ca6928b490068003bc8c614a1a8509e.tar.xz wireguard-openbsd-16290f2a1ca6928b490068003bc8c614a1a8509e.zip |
simplify error handling in c2i_ASN1_OBJECT
ok beck@, miod@
-rw-r--r-- | lib/libcrypto/asn1/a_object.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/lib/libcrypto/asn1/a_object.c b/lib/libcrypto/asn1/a_object.c index 5bf450d0e18..3cb0cf7c4b1 100644 --- a/lib/libcrypto/asn1/a_object.c +++ b/lib/libcrypto/asn1/a_object.c @@ -1,4 +1,4 @@ -/* $OpenBSD: a_object.c,v 1.26 2016/03/17 03:51:49 beck Exp $ */ +/* $OpenBSD: a_object.c,v 1.27 2016/11/06 14:00:49 bcook Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -284,7 +284,7 @@ err: ASN1_OBJECT * c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, long len) { - ASN1_OBJECT *ret = NULL; + ASN1_OBJECT *ret; const unsigned char *p; unsigned char *data; int i, length; @@ -307,7 +307,7 @@ c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, long len) if (*p == 0x80 && (!i || !(p[-1] & 0x80))) { ASN1err(ASN1_F_C2I_ASN1_OBJECT, ASN1_R_INVALID_OBJECT_ENCODING); - return NULL; + return (NULL); } } @@ -318,37 +318,39 @@ c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, long len) if ((ret = ASN1_OBJECT_new()) == NULL) return (NULL); } else - ret = (*a); + ret = *a; p = *pp; + /* detach data from object */ data = (unsigned char *)ret->data; if (data != NULL) explicit_bzero(data, ret->length); free(data); + data = malloc(length); if (data == NULL) { - i = ERR_R_MALLOC_FAILURE; + ASN1err(ASN1_F_C2I_ASN1_OBJECT, ERR_R_MALLOC_FAILURE); goto err; } - ret->flags |= ASN1_OBJECT_FLAG_DYNAMIC_DATA; + memcpy(data, p, length); + /* reattach data to object, after which it remains const */ ret->data = data; ret->length = length; ret->sn = NULL; ret->ln = NULL; - /* ret->flags=ASN1_OBJECT_FLAG_DYNAMIC; we know it is dynamic */ + ret->flags |= ASN1_OBJECT_FLAG_DYNAMIC_DATA; p += length; if (a != NULL) - (*a) = ret; + *a = ret; *pp = p; return (ret); err: - ASN1err(ASN1_F_C2I_ASN1_OBJECT, i); - if ((ret != NULL) && ((a == NULL) || (*a != ret))) + if (ret != *a) ASN1_OBJECT_free(ret); return (NULL); } |