Files
mars-tinyldap/scan_ldapmessage.c
leitner 41df4dbaeb add unit tests for scan_ldap*
add return 0 to unit tests for scan_asn1*
2023-09-16 09:19:19 +00:00

58 lines
1.8 KiB
C

#include "ldap.h"
size_t scan_ldapmessage(const char* src,const char* max,
unsigned long* messageid,unsigned long* op,size_t* len) {
size_t res,tmp;
if (!(res=scan_asn1SEQUENCE(src,max,len)))
goto error;
if (!(tmp=scan_asn1INTEGER(src+res,max,(long*)messageid)))
goto error;
res+=tmp;
{
enum asn1_tagclass tc;
enum asn1_tagtype tt;
if (!(tmp=scan_asn1tag(src+res,max,&tc,&tt,op)))
goto error;
if (tc!=APPLICATION)
goto error;
res+=tmp;
if (!(tmp=scan_asn1length(src+res,max,len)))
goto error;
res+=tmp;
}
return res;
error:
return 0;
}
#ifdef UNITTEST
#undef UNITTEST
#include <assert.h>
#include <string.h>
#include "scan_asn1SEQUENCE.c"
#include "scan_asn1INTEGER.c"
#include "scan_asn1tag.c"
#include "scan_asn1tagint.c"
#include "scan_asn1length.c"
#include "scan_asn1int.c"
#include "scan_asn1rawint.c"
int main() {
static char buf[] = "\x30\x0c\x02\x01\x01\x60\x07\x02\x01\x03\x04\x00\x80\x00"; // an LDAP bind request
unsigned long msgid=0, op=0;
size_t len=0;
assert(scan_ldapmessage(buf,buf+14,&msgid,&op,&len)==7 && msgid==1 && op==BindRequest && len == 7);
// trigger scan_asn1SEQUENCE error (too short)
assert(scan_ldapmessage(buf,buf+13,&msgid,&op,&len)==0);
buf[6]=8; assert(scan_ldapmessage(buf,buf+14,&msgid,&op,&len)==0); // fail scan_asn1length
buf[5]=0; assert(scan_ldapmessage(buf,buf+14,&msgid,&op,&len)==0); // fail tc==APPLICATION
buf[5]=0x80; assert(scan_ldapmessage(buf,buf+14,&msgid,&op,&len)==0); // fail scan_asn1tag
buf[2]=0; assert(scan_ldapmessage(buf,buf+14,&msgid,&op,&len)==0); // fail scan_asn1INTEGER
buf[0]=0; assert(scan_ldapmessage(buf,buf+14,&msgid,&op,&len)==0); // fail scan_asn1SEQUENCE
// we only care for 100% coverage of this file, the others have their own unit tests */
return 0;
}
#endif