summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2004-05-18 10:43:35 +0000
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2004-05-18 10:43:35 +0000
commitb09f068c261b6c272c0d197d153de2f34ba54249 (patch)
tree77f362178816052c75d66fd9ebda7299ba8febff
parentbc1c5c21cc77ef6e52e7371ca27dbfe289016350 (diff)
downloadgnutls-b09f068c261b6c272c0d197d153de2f34ba54249.tar.gz
*** empty log message ***
-rw-r--r--lib/minitasn1/decoding.c29
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;