diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2004-05-18 10:44:15 +0000 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2004-05-18 10:44:15 +0000 |
commit | 6064a67c1772d0a5cd2142b8b92a3c19535802df (patch) | |
tree | 501e63424d39cb1c24e651853a7edd4faf205a9b /lib | |
parent | 91461a180cb0d2a9f8741ea32e0d430eb499c5da (diff) | |
download | gnutls-6064a67c1772d0a5cd2142b8b92a3c19535802df.tar.gz |
*** empty log message ***
Diffstat (limited to 'lib')
-rw-r--r-- | lib/minitasn1/decoding.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/lib/minitasn1/decoding.c b/lib/minitasn1/decoding.c index 976777e40f..de3573a386 100644 --- a/lib/minitasn1/decoding.c +++ b/lib/minitasn1/decoding.c @@ -122,18 +122,22 @@ _asn1_get_octet_der(const unsigned char *der,int *der_len,unsigned char *str,int - -void +/* Returns ASN1_SUCCESS on success or an error code on error. + */ +int _asn1_get_time_der(const unsigned char *der,int *der_len,unsigned char *str,int str_size) { int len_len,str_len; - if(str==NULL) return; + if(str==NULL) return ASN1_DER_ERROR; str_len=_asn1_get_length_der(der,&len_len); - if (str_len < 0 || str_size < str_len) return; + if (str_len < 0 || str_size < str_len) + return ASN1_DER_ERROR; memcpy(str,der+len_len,str_len); str[str_len]=0; *der_len=str_len+len_len; + + return ASN1_SUCCESS; } @@ -513,7 +517,7 @@ asn1_der_decoding(ASN1_TYPE *element,const void *ider,int len, int counter,len2,len3,len4,move,ris; unsigned char class,*temp2; unsigned int tag; - int indefinite; + int indefinite, result; const unsigned char* der = ider; node=*element; @@ -687,7 +691,11 @@ asn1_der_decoding(ASN1_TYPE *element,const void *ider,int len, move=RIGHT; break; case TYPE_TIME: - _asn1_get_time_der(der+counter,&len2,temp,sizeof(temp)-1); + result = _asn1_get_time_der(der+counter,&len2,temp,sizeof(temp)-1); + if (result != ASN1_SUCCESS) { + asn1_delete_structure(element); + return result; + } _asn1_set_value(p,temp,strlen(temp)+1); counter+=len2; move=RIGHT; @@ -933,7 +941,7 @@ asn1_der_decoding_element(ASN1_TYPE *structure,const char *elementName, int counter,len2,len3,len4,move,ris; unsigned char class,*temp2; unsigned int tag; - int indefinite; + int indefinite, result; const unsigned char* der = ider; node=*structure; @@ -1159,7 +1167,12 @@ asn1_der_decoding_element(ASN1_TYPE *structure,const char *elementName, break; case TYPE_TIME: if(state==FOUND){ - _asn1_get_time_der(der+counter,&len2,temp,sizeof(temp)-1); + result = _asn1_get_time_der(der+counter,&len2,temp,sizeof(temp)-1); + if (result != ASN1_SUCCESS) { + asn1_delete_structure(structure); + return result; + } + _asn1_set_value(p,temp,strlen(temp)+1); if(p==nodeFound) state=EXIT; |