summaryrefslogtreecommitdiff
path: root/Cryptlib/OpenSSL/crypto/objects/obj_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'Cryptlib/OpenSSL/crypto/objects/obj_lib.c')
-rw-r--r--Cryptlib/OpenSSL/crypto/objects/obj_lib.c38
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);
}