diff options
Diffstat (limited to 'src/lib/libcrypto/objects/obj_lib.c')
-rw-r--r-- | src/lib/libcrypto/objects/obj_lib.c | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/src/lib/libcrypto/objects/obj_lib.c b/src/lib/libcrypto/objects/obj_lib.c index 706fa0b0e7..23e9d48cdf 100644 --- a/src/lib/libcrypto/objects/obj_lib.c +++ b/src/lib/libcrypto/objects/obj_lib.c | |||
@@ -66,7 +66,8 @@ ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *o) | |||
66 | { | 66 | { |
67 | ASN1_OBJECT *r; | 67 | ASN1_OBJECT *r; |
68 | int i; | 68 | int i; |
69 | char *ln=NULL; | 69 | char *ln=NULL,*sn=NULL; |
70 | unsigned char *data=NULL; | ||
70 | 71 | ||
71 | if (o == NULL) return(NULL); | 72 | if (o == NULL) return(NULL); |
72 | if (!(o->flags & ASN1_OBJECT_FLAG_DYNAMIC)) | 73 | if (!(o->flags & ASN1_OBJECT_FLAG_DYNAMIC)) |
@@ -79,42 +80,42 @@ ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *o) | |||
79 | OBJerr(OBJ_F_OBJ_DUP,ERR_R_ASN1_LIB); | 80 | OBJerr(OBJ_F_OBJ_DUP,ERR_R_ASN1_LIB); |
80 | return(NULL); | 81 | return(NULL); |
81 | } | 82 | } |
82 | r->data=OPENSSL_malloc(o->length); | 83 | data=OPENSSL_malloc(o->length); |
83 | if (r->data == NULL) | 84 | if (data == NULL) |
84 | goto err; | 85 | goto err; |
85 | if (o->data != NULL) | 86 | if (o->data != NULL) |
86 | memcpy(r->data,o->data,o->length); | 87 | memcpy(data,o->data,o->length); |
88 | /* once data attached to object it remains const */ | ||
89 | r->data = data; | ||
87 | r->length=o->length; | 90 | r->length=o->length; |
88 | r->nid=o->nid; | 91 | r->nid=o->nid; |
89 | r->ln=r->sn=NULL; | 92 | r->ln=r->sn=NULL; |
90 | if (o->ln != NULL) | 93 | if (o->ln != NULL) |
91 | { | 94 | { |
92 | i=strlen(o->ln)+1; | 95 | i=strlen(o->ln)+1; |
93 | r->ln=ln=OPENSSL_malloc(i); | 96 | ln=OPENSSL_malloc(i); |
94 | if (r->ln == NULL) goto err; | 97 | if (ln == NULL) goto err; |
95 | memcpy(ln,o->ln,i); | 98 | memcpy(ln,o->ln,i); |
99 | r->ln=ln; | ||
96 | } | 100 | } |
97 | 101 | ||
98 | if (o->sn != NULL) | 102 | if (o->sn != NULL) |
99 | { | 103 | { |
100 | char *s; | ||
101 | |||
102 | i=strlen(o->sn)+1; | 104 | i=strlen(o->sn)+1; |
103 | r->sn=s=OPENSSL_malloc(i); | 105 | sn=OPENSSL_malloc(i); |
104 | if (r->sn == NULL) goto err; | 106 | if (sn == NULL) goto err; |
105 | memcpy(s,o->sn,i); | 107 | memcpy(sn,o->sn,i); |
108 | r->sn=sn; | ||
106 | } | 109 | } |
107 | r->flags=o->flags|(ASN1_OBJECT_FLAG_DYNAMIC| | 110 | r->flags=o->flags|(ASN1_OBJECT_FLAG_DYNAMIC| |
108 | ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|ASN1_OBJECT_FLAG_DYNAMIC_DATA); | 111 | ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|ASN1_OBJECT_FLAG_DYNAMIC_DATA); |
109 | return(r); | 112 | return(r); |
110 | err: | 113 | err: |
111 | OBJerr(OBJ_F_OBJ_DUP,ERR_R_MALLOC_FAILURE); | 114 | OBJerr(OBJ_F_OBJ_DUP,ERR_R_MALLOC_FAILURE); |
112 | if (r != NULL) | 115 | if (ln != NULL) OPENSSL_free(ln); |
113 | { | 116 | if (sn != NULL) OPENSSL_free(sn); |
114 | if (ln != NULL) OPENSSL_free(ln); | 117 | if (data != NULL) OPENSSL_free(data); |
115 | if (r->data != NULL) OPENSSL_free(r->data); | 118 | if (r != NULL) OPENSSL_free(r); |
116 | OPENSSL_free(r); | ||
117 | } | ||
118 | return(NULL); | 119 | return(NULL); |
119 | } | 120 | } |
120 | 121 | ||