Index: openssl/crypto/asn1/asn1_lib.c |
=================================================================== |
--- openssl/crypto/asn1/asn1_lib.c (revision 105093) |
+++ openssl/crypto/asn1/asn1_lib.c (working copy) |
@@ -340,20 +340,31 @@ |
return(1); |
} |
-ASN1_STRING *ASN1_STRING_dup(ASN1_STRING *str) |
+int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str) |
{ |
+ if (str == NULL) |
+ return 0; |
+ dst->type = str->type; |
+ if (!ASN1_STRING_set(dst,str->data,str->length)) |
+ return 0; |
+ dst->flags = str->flags; |
+ return 1; |
+ } |
+ |
+ASN1_STRING *ASN1_STRING_dup(const ASN1_STRING *str) |
+ { |
ASN1_STRING *ret; |
- |
- if (str == NULL) return(NULL); |
- if ((ret=ASN1_STRING_type_new(str->type)) == NULL) |
- return(NULL); |
- if (!ASN1_STRING_set(ret,str->data,str->length)) |
+ if (!str) |
+ return NULL; |
+ ret=ASN1_STRING_new(); |
+ if (!ret) |
+ return NULL; |
+ if (!ASN1_STRING_copy(ret,str)) |
{ |
ASN1_STRING_free(ret); |
- return(NULL); |
+ return NULL; |
} |
- ret->flags = str->flags; |
- return(ret); |
+ return ret; |
} |
int ASN1_STRING_set(ASN1_STRING *str, const void *_data, int len) |
@@ -427,11 +438,12 @@ |
void ASN1_STRING_free(ASN1_STRING *a) |
{ |
if (a == NULL) return; |
- if (a->data != NULL) OPENSSL_free(a->data); |
+ if (a->data && !(a->flags & ASN1_STRING_FLAG_NDEF)) |
+ OPENSSL_free(a->data); |
OPENSSL_free(a); |
} |
-int ASN1_STRING_cmp(ASN1_STRING *a, ASN1_STRING *b) |
+int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b) |
{ |
int i; |
@@ -457,7 +469,7 @@ |
ERR_add_error_data(4,"address=",buf1," offset=",buf2); |
} |
-int ASN1_STRING_length(ASN1_STRING *x) |
+int ASN1_STRING_length(const ASN1_STRING *x) |
{ return M_ASN1_STRING_length(x); } |
void ASN1_STRING_length_set(ASN1_STRING *x, int len) |