GNU CommonC++

url1.cpp

#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;
}