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                 {
00036                         printBug("buffer overflow founded");
00037                         return;
00038                 }
00039         for(i=prev+size;i<BUFLEN;++i)
00040                 if (buf[i] != fillChar)
00041                 {
00042                         printBug("buffer overflow founded");
00043                         return;
00044                 }
00045 }
00046 
00047 // check with binary functions
00048 void check1(unsigned char* s,size_t len,size_t buflen1,size_t buflen2,bool checkEqual=false)
00049 {
00050         initBuf(buf1);
00051         b64Encode(s,len,buf1+16,buflen1);
00052         checkBuf(buf1,16,buflen1);
00053         initBuf(buf2);
00054         b64Decode(buf1+16,(unsigned char*)buf2+16,buflen2);
00055         checkBuf(buf2,16,buflen2);
00056         if (checkEqual && memcmp(s,buf2+16,len) != 0)
00057                 printBug ("buffer different");
00058 }
00059 
00060 // check with old string
00061 void check2(const char* s,size_t buflen,bool checkEqual=false)
00062 {
00063         if (!buflen) return;
00064         initBuf(buf1);
00065         b64Encode(s,buf1+16,buflen);
00066         checkBuf(buf1,16,buflen);
00067         initBuf(buf2);
00068         size_t buflen2 = strlen(buf1+16)+1;
00069         b64Decode(buf1+16,buf2+16);
00070         checkBuf(buf2,16,buflen2);
00071         if (checkEqual && strcmp(s,buf2+16) != 0)
00072         {
00073                 printBug ("buffer different");
00074                 printf("'%s' != '%s'\n'%s'\n",s,buf2+16,buf1+16);
00075         }
00076 }
00077 
00078 // check buffer overflow on string
00079 void checkStringOverflow(char* s,unsigned int len)
00080 {
00081         bool execCheck2 = (strlen(s) == len);
00082         for(unsigned int l1=0;l1<32;++l1)
00083         {
00084                 sprintf(status,"%s %d",s,l1);
00085                 if (execCheck2)
00086                         check2(s,l1,l1 >= (len+2)/3*4+1);
00087                 for(unsigned int l2=0;l2<32;++l2)
00088                         check1((unsigned char*)s,len,l1,l2,
00089                                         (l1 >= (len+2)/3*4+1) 
00090                                         && (l2 >= len) );
00091         }
00092 }
00093 
00094 int main()
00095 {
00096         checkStringOverflow("",0);
00097         checkStringOverflow("aaa",3);
00098         if (!errorOccurred)
00099                 printf("All seem ok\n");
00100         return 0;
00101 }
00102 
00103 

Generated on Thu Nov 9 19:35:25 2006 for GNU CommonC++ by  doxygen 1.5.1