| 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);
|
| }
|
|
|
|
|