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