url1.cpp

00001 #include <cc++/common.h>
00002 
00003 // This was a test base64 stuff
00004 
00005 #ifdef  CCXX_NAMESPACES
00006 using namespace std;
00007 using namespace ost;
00008 #endif
00009 
00010 #define BUFLEN 512
00011 char buf1[BUFLEN];
00012 char buf2[BUFLEN];
00013 
00014 bool errorOccurred = false;
00015 char status[256] = "";
00016 
00017 void printBug(const char*msg)
00018 {
00019         errorOccurred = true;
00020         printf("status = %s\n%s!\n",status,msg);
00021 }
00022 
00023 const char fillChar='&';
00024 
00025 void initBuf(char* buf)
00026 {
00027         memset(buf,fillChar,BUFLEN);
00028 }
00029 
00030 void checkBuf(char* buf,int prev,int size)
00031 {
00032         int i;
00033         for(i=0;i<prev;++i)
00034                 if (buf[i] != fillChar) {
00035                         printBug("buffer overflow founded");
00036                         return;
00037                 }
00038         for(i=prev+size;i<BUFLEN;++i)
00039                 if (buf[i] != fillChar) {
00040                         printBug("buffer overflow founded");
00041                         return;
00042                 }
00043 }
00044 
00045 // check with binary functions
00046 void check1(unsigned char* s,size_t len,size_t buflen1,size_t buflen2,bool checkEqual=false)
00047 {
00048         initBuf(buf1);
00049         b64Encode(s,len,buf1+16,buflen1);
00050         checkBuf(buf1,16,buflen1);
00051         initBuf(buf2);
00052         b64Decode(buf1+16,(unsigned char*)buf2+16,buflen2);
00053         checkBuf(buf2,16,buflen2);
00054         if (checkEqual && memcmp(s,buf2+16,len) != 0)
00055                 printBug ("buffer different");
00056 }
00057 
00058 // check with old string
00059 void check2(const char* s,size_t buflen,bool checkEqual=false)
00060 {
00061         if (!buflen) return;
00062         initBuf(buf1);
00063         b64Encode(s,buf1+16,buflen);
00064         checkBuf(buf1,16,buflen);
00065         initBuf(buf2);
00066         size_t buflen2 = strlen(buf1+16)+1;
00067         b64Decode(buf1+16,buf2+16);
00068         checkBuf(buf2,16,buflen2);
00069         if (checkEqual && strcmp(s,buf2+16) != 0) {
00070                 printBug ("buffer different");
00071                 printf("'%s' != '%s'\n'%s'\n",s,buf2+16,buf1+16);
00072         }
00073 }
00074 
00075 // check buffer overflow on string
00076 void checkStringOverflow(char* s,unsigned int len)
00077 {
00078         bool execCheck2 = (strlen(s) == len);
00079         for(unsigned int l1=0;l1<32;++l1) {
00080                 sprintf(status,"%s %d",s,l1);
00081                 if (execCheck2)
00082                         check2(s,l1,l1 >= (len+2)/3*4+1);
00083                 for(unsigned int l2=0;l2<32;++l2)
00084                         check1((unsigned char*)s,len,l1,l2,
00085                                         (l1 >= (len+2)/3*4+1)
00086                                         && (l2 >= len) );
00087         }
00088 }
00089 
00090 int main()
00091 {
00092         checkStringOverflow("",0);
00093         checkStringOverflow("aaa",3);
00094         if (!errorOccurred)
00095                 printf("All seem ok\n");
00096         return 0;
00097 }
00098 
00099 

Generated on Fri Apr 27 09:44:59 2007 for GNU CommonC++ by  doxygen 1.4.7