diff options
Diffstat (limited to 'Cryptlib/OpenSSL/crypto/objects/obj_lib.c')
| -rw-r--r-- | Cryptlib/OpenSSL/crypto/objects/obj_lib.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/Cryptlib/OpenSSL/crypto/objects/obj_lib.c b/Cryptlib/OpenSSL/crypto/objects/obj_lib.c index 0687602a..8851baff 100644 --- a/Cryptlib/OpenSSL/crypto/objects/obj_lib.c +++ b/Cryptlib/OpenSSL/crypto/objects/obj_lib.c @@ -66,7 +66,8 @@ ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *o) { ASN1_OBJECT *r; int i; - char *ln = NULL; + char *ln = NULL, *sn = NULL; + unsigned char *data = NULL; if (o == NULL) return (NULL); @@ -79,30 +80,32 @@ ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *o) OBJerr(OBJ_F_OBJ_DUP, ERR_R_ASN1_LIB); return (NULL); } - r->data = OPENSSL_malloc(o->length); - if (r->data == NULL) + data = OPENSSL_malloc(o->length); + if (data == NULL) goto err; if (o->data != NULL) - memcpy(r->data, o->data, o->length); + memcpy(data, o->data, o->length); + /* once data attached to object it remains const */ + r->data = data; r->length = o->length; r->nid = o->nid; r->ln = r->sn = NULL; if (o->ln != NULL) { i = strlen(o->ln) + 1; - r->ln = ln = OPENSSL_malloc(i); - if (r->ln == NULL) + ln = OPENSSL_malloc(i); + if (ln == NULL) goto err; memcpy(ln, o->ln, i); + r->ln = ln; } if (o->sn != NULL) { - char *s; - i = strlen(o->sn) + 1; - r->sn = s = OPENSSL_malloc(i); - if (r->sn == NULL) + sn = OPENSSL_malloc(i); + if (sn == NULL) goto err; - memcpy(s, o->sn, i); + memcpy(sn, o->sn, i); + r->sn = sn; } r->flags = o->flags | (ASN1_OBJECT_FLAG_DYNAMIC | ASN1_OBJECT_FLAG_DYNAMIC_STRINGS | @@ -110,13 +113,14 @@ ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *o) return (r); err: OBJerr(OBJ_F_OBJ_DUP, ERR_R_MALLOC_FAILURE); - if (r != NULL) { - if (ln != NULL) - OPENSSL_free(ln); - if (r->data != NULL) - OPENSSL_free(r->data); + if (ln != NULL) + OPENSSL_free(ln); + if (sn != NULL) + OPENSSL_free(sn); + if (data != NULL) + OPENSSL_free(data); + if (r != NULL) OPENSSL_free(r); - } return (NULL); } |
