summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libcrypto/asn1/a_object.c22
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:
284ASN1_OBJECT * 284ASN1_OBJECT *
285c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, long len) 285c2i_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
349err: 352err:
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}