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 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
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
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
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((char *)"",0);
00093 checkStringOverflow((char *)"aaa",3);
00094 if (!errorOccurred)
00095 printf("All seem ok\n");
00096 return 0;
00097 }
00098
00099