00001 #include <cc++/common.h>
00002
00003
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
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
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
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