Index: openssl/crypto/objects/obj_lib.c |
=================================================================== |
--- openssl/crypto/objects/obj_lib.c (revision 105093) |
+++ openssl/crypto/objects/obj_lib.c (working copy) |
@@ -66,7 +66,8 @@ |
{ |
ASN1_OBJECT *r; |
int i; |
- char *ln=NULL; |
+ char *ln=NULL,*sn=NULL; |
+ unsigned char *data=NULL; |
if (o == NULL) return(NULL); |
if (!(o->flags & ASN1_OBJECT_FLAG_DYNAMIC)) |
@@ -79,42 +80,42 @@ |
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) goto err; |
+ 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) goto err; |
- memcpy(s,o->sn,i); |
+ sn=OPENSSL_malloc(i); |
+ if (sn == NULL) goto err; |
+ memcpy(sn,o->sn,i); |
+ r->sn=sn; |
} |
r->flags=o->flags|(ASN1_OBJECT_FLAG_DYNAMIC| |
ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|ASN1_OBJECT_FLAG_DYNAMIC_DATA); |
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); |
- OPENSSL_free(r); |
- } |
+ 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); |
} |