GNU CommonC++
|
#include <cc++/common.h> // This was a test base64 stuff #ifdef CCXX_NAMESPACES using namespace std; using namespace ost; #endif #define BUFLEN 512 char buf1[BUFLEN]; char buf2[BUFLEN]; bool errorOccurred = false; char status[256] = ""; void printBug(const char*msg) { errorOccurred = true; printf("status = %s\n%s!\n",status,msg); } const char fillChar='&'; void initBuf(char* buf) { memset(buf,fillChar,BUFLEN); } void checkBuf(char* buf,int prev,int size) { int i; for(i=0;i<prev;++i) if (buf[i] != fillChar) { printBug("buffer overflow founded"); return; } for(i=prev+size;i<BUFLEN;++i) if (buf[i] != fillChar) { printBug("buffer overflow founded"); return; } } // check with binary functions void check1(unsigned char* s,size_t len,size_t buflen1,size_t buflen2,bool checkEqual=false) { initBuf(buf1); b64Encode(s,len,buf1+16,buflen1); checkBuf(buf1,16,buflen1); initBuf(buf2); b64Decode(buf1+16,(unsigned char*)buf2+16,buflen2); checkBuf(buf2,16,buflen2); if (checkEqual && memcmp(s,buf2+16,len) != 0) printBug ("buffer different"); } // check with old string void check2(const char* s,size_t buflen,bool checkEqual=false) { if (!buflen) return; initBuf(buf1); b64Encode(s,buf1+16,buflen); checkBuf(buf1,16,buflen); initBuf(buf2); size_t buflen2 = strlen(buf1+16)+1; b64Decode(buf1+16,buf2+16); checkBuf(buf2,16,buflen2); if (checkEqual && strcmp(s,buf2+16) != 0) { printBug ("buffer different"); printf("'%s' != '%s'\n'%s'\n",s,buf2+16,buf1+16); } } // check buffer overflow on string void checkStringOverflow(char* s,unsigned int len) { bool execCheck2 = (strlen(s) == len); for(unsigned int l1=0;l1<32;++l1) { sprintf(status,"%s %d",s,l1); if (execCheck2) check2(s,l1,l1 >= (len+2)/3*4+1); for(unsigned int l2=0;l2<32;++l2) check1((unsigned char*)s,len,l1,l2, (l1 >= (len+2)/3*4+1) && (l2 >= len) ); } } int main() { checkStringOverflow((char *)"",0); checkStringOverflow((char *)"aaa",3); if (!errorOccurred) printf("All seem ok\n"); return 0; }