From 9d333103069cbc720e7532e8daddb089ed8eebec Mon Sep 17 00:00:00 2001 From: bcook <> Date: Sun, 6 Nov 2016 14:00:49 +0000 Subject: simplify error handling in c2i_ASN1_OBJECT ok beck@, miod@ --- src/lib/libcrypto/asn1/a_object.c | 22 ++++++++++++---------- 1 file 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 @@ -/* $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); } -- cgit v1.2.3-55-g6feb