silence cppcheck

This commit is contained in:
leitner
2015-05-07 23:49:14 +00:00
parent 34c4ff4912
commit 0303876114
2 changed files with 47 additions and 38 deletions

View File

@@ -6,7 +6,6 @@ size_t fmt_asn1generic(char* dest,const char* fmt,...) {
size_t containerstack[100];
size_t curinstack=0;
va_list args;
va_start(args,fmt);
unsigned long* application=0;
struct string* s;
struct oid* o;
@@ -17,6 +16,7 @@ size_t fmt_asn1generic(char* dest,const char* fmt,...) {
unsigned long desttag=0;
unsigned long appstore;
int stringtype;
va_start(args,fmt);
while (*fmt) {
char* realdest=dest?dest+cursor:NULL;
switch (*fmt) {
@@ -35,7 +35,10 @@ size_t fmt_asn1generic(char* dest,const char* fmt,...) {
case 'B': // send boolean
{
int i=va_arg(args,int);
if (i!=0 && i!=1) return 0;
if (i!=0 && i!=1) {
va_end(args);
return 0;
}
if (application)
curlen=fmt_asn1int(realdest,APPLICATION,PRIMITIVE,*application,i);
else
@@ -133,7 +136,10 @@ stringcopy_alt:
* sequence data backwards to make room to write the ASN.1 length */
{
char* anfang;
if (!curinstack) return 0;
if (!curinstack) {
va_end(args);
return 0;
}
anfang=dest+containerstack[--curinstack];
seqlen=dest+cursor-anfang;
curlen=fmt_asn1length(NULL,seqlen);
@@ -146,5 +152,6 @@ stringcopy_alt:
cursor+=curlen;
++fmt;
}
va_end(args);
return cursor;
}

View File

@@ -34,13 +34,13 @@ size_t scan_asn1generic(const char* src,const char* max,const char* fmt,...) {
if (*fmt=='B') *bdest=0; else *dest=0;
curlen=scan_asn1int(src,maxstack[curmax],&tc,&tt,&tag,&l);
if (application) {
if (tc!=APPLICATION) return 0;
if (tc!=APPLICATION) goto error;
*application=tag;
} else {
if (tc!=UNIVERSAL || tt!=PRIMITIVE || tag!=(*fmt=='B'?BOOLEAN:INTEGER))
return 0;
goto error;
}
if (!curlen) { if (optional) break; else return 0; }
if (!curlen) { if (optional) break; else goto error; }
if (*fmt=='B')
*bdest=l;
else
@@ -53,8 +53,8 @@ size_t scan_asn1generic(const char* src,const char* max,const char* fmt,...) {
{
size_t* dest=va_arg(args,size_t*);
size_t len,tmp,tlen,j,t;
if (!(len=scan_asn1tag(src,maxstack[curmax],&tc,&tt,&tag))) return 0;
if (!(tmp=scan_asn1length(src+len,maxstack[curmax],&tlen))) return 0;
if (!(len=scan_asn1tag(src,maxstack[curmax],&tc,&tt,&tag))) goto error;
if (!(tmp=scan_asn1length(src+len,maxstack[curmax],&tlen))) goto error;
len+=tmp;
j=0; t=1;
src+=len;
@@ -101,18 +101,18 @@ stringmain:
dest->l=0;
dest->s=0;
curlen=scan_asn1string(src,maxstack[curmax],&tc,&tt,&tag,&dest->s,&dest->l);
if (!curlen) { if (optional) break; else return 0; }
if (!curlen) { if (optional) break; else goto error; }
if (application) {
if (tc!=APPLICATION) return 0;
if (tc!=APPLICATION) goto error;
*application=tag;
} else {
if (tc!=UNIVERSAL || tt!=PRIMITIVE || tag!=wantedtag)
return 0;
goto error;
}
if (wantedtag==BIT_STRING) { // additional checks for bit strings
if (dest->l==0 || // length can't be 0 because the format starts with 1 octet that contains the number of unused bits in the last octet
((unsigned char)(dest->s[0])>7) || // it's the number of unused bits in an octet, must be [0..7]
(dest->l==1 && dest->s[0])) return 0; // if there is no last octet, there can't be any unused bits in there
(dest->l==1 && dest->s[0])) goto error; // if there is no last octet, there can't be any unused bits in there
dest->l=(dest->l-1)*8-dest->s[0];
dest->s+=1;
} else if (wantedtag==PrintableString) {
@@ -128,10 +128,10 @@ stringmain:
&& dest->s[i]!='/'
&& dest->s[i]!=':'
&& dest->s[i]!='?'
&& dest->s[i]!=' ') return 0;
&& dest->s[i]!=' ') goto error;
} else if (wantedtag==IA5String) {
for (i=0; i<dest->l; ++i) // IA5String is an ASCII string, which means 0 <= s[i] <= 127
if ((unsigned char)(dest->s[i]) > 127) return 0;
if ((unsigned char)(dest->s[i]) > 127) goto error;
} else if (wantedtag==UTCTIME) {
size_t j;
struct tm t;
@@ -144,50 +144,50 @@ stringmain:
YYMMDDhhmmss+hh'mm'
YYMMDDhhmmss-hh'mm'
*/
if (dest->l<11 || dest->l>17) return 0;
if (dest->l<11 || dest->l>17) goto error;
j=(dest->s[0]-'0')*10+dest->s[1]-'0';
t.tm_year=j+(j<70)*100;
for (i=0; i<10; ++i)
if (!isdigit(dest->s[i])) return 0;
if (!isdigit(dest->s[i])) goto error;
j=(dest->s[2]-'0')*10+dest->s[3]-'0'; // is the month plausible?
if (j<1 || j>12) return 0;
if (j<1 || j>12) goto error;
t.tm_mon=j-1;
j=(dest->s[4]-'0')*10+dest->s[5]-'0'; // is the day plausible?
if (j<1 || j>31) return 0;
if (j<1 || j>31) goto error;
t.tm_mday=j;
j=(dest->s[6]-'0')*10+dest->s[7]-'0'; // is the hour plausible?
if (j>23) return 0;
if (j>23) goto error;
t.tm_hour=j;
j=(dest->s[8]-'0')*10+dest->s[9]-'0'; // is the minutes plausible?
if (j>59) return 0;
if (j>59) goto error;
t.tm_min=j;
i=10;
if (isdigit(dest->s[10])) {
i+=2;
j=(dest->s[10]-'0')*10+dest->s[11]-'0'; // is the seconds plausible?
if (j>59) return 0;
if (j>59) goto error;
t.tm_sec=j;
}
*desttime=mktime(&t);
if (dest->s[i]=='+' || dest->s[i]=='-') {
size_t j;
if (dest->l!=15) return 0;
if (dest->l!=15) goto error;
for (j=i; j<i+4; ++j)
if (!isdigit(dest->s[j])) return 0;
if (!isdigit(dest->s[j])) goto error;
j=(dest->s[i]-'0')*10+dest->s[i+1]-'0'; // is the offset minutes plausible?
if (j>59) return 0;
if (j>59) goto error;
if (dest->s[i]=='+')
*desttime+=j*60;
else
*desttime-=j*60;
j=(dest->s[i+2]-'0')*10+dest->s[i+3]-'0'; // is the offset seconds plausible?
if (j>59) return 0;
if (j>59) goto error;
if (dest->s[i]=='+')
*desttime+=j;
else
*desttime-=j;
} else if (dest->s[i]!='Z') return 0;
} else if (dest->s[i]!='Z') goto error;
}
src+=curlen;
application=NULL;
@@ -197,17 +197,17 @@ stringmain:
{
struct string* dest=va_arg(args,struct string*);
curlen=scan_asn1tag(src,maxstack[curmax],&tc,&tt,&tag);
if (!curlen) { if (optional) break; else return 0; }
if (!curlen) { if (optional) break; else goto error; }
if (application) {
if (tc!=APPLICATION) return 0;
if (tc!=APPLICATION) goto error;
*application=tag;
} else {
if (tc!=UNIVERSAL || tt!=PRIMITIVE || tag!=OBJECT_IDENTIFIER)
return 0;
goto error;
}
src+=curlen;
curlen=scan_asn1length(src,maxstack[curmax],&seqlen);
if (!curlen) return 0;
if (!curlen) goto error;
src+=curlen;
dest->s=src;
dest->l=seqlen;
@@ -227,24 +227,23 @@ stringmain:
case '{': // { = SEQUENCE
{
curlen=scan_asn1tag(src,maxstack[curmax],&tc,&tt,&tag);
if (!curlen) { if (optional) break; else return 0; }
if (!curlen) { if (optional) break; else goto error; }
if (application) {
if (tc!=APPLICATION || tt!=CONSTRUCTED) return 0;
if (tc!=APPLICATION || tt!=CONSTRUCTED) goto error;
*application=tag;
} else {
if (*fmt=='c') {
if (tc!=PRIVATE || tt!=CONSTRUCTED)
return 0;
goto error;
*desttag=tag;
} else {
if (tc!=UNIVERSAL || tt!=CONSTRUCTED || tag!=(*fmt=='{'?SEQUENCE_OF:SET_OF))
return 0;
goto error;
}
}
src+=curlen;
curlen=scan_asn1length(src,maxstack[curmax],&seqlen);
if (!curlen) return 0;
if (curmax>99) return 0;
if (!curlen || curmax>99) goto error;
maxstack[++curmax]=src+curlen+seqlen;
src+=curlen;
application=NULL;
@@ -262,16 +261,19 @@ stringmain:
case '}': // } = end of SEQUENCE
{
optional=0;
if (curmax==0) return 0;
if (curmax==0) goto error;
src=maxstack[curmax];
--curmax;
break;
}
default:
return 0;
goto error;
}
++fmt;
}
va_end(args);
return src-orig;
error:
va_end(args);
return 0;
}