diff options
Diffstat (limited to 'lib/minitasn1/decoding.c')
-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; |