diff options
-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 | } |