diff options
-rw-r--r-- | node/Dictionary.hpp | 24 | ||||
-rw-r--r-- | selftest.cpp | 41 |
2 files changed, 49 insertions, 16 deletions
diff --git a/node/Dictionary.hpp b/node/Dictionary.hpp index e4c7ff20..dca8ac67 100644 --- a/node/Dictionary.hpp +++ b/node/Dictionary.hpp @@ -27,7 +27,7 @@ #include <stdint.h> // Can be increased if it's ever needed, but not too much. -#define ZT_DICTIONARY_MAX_SIZE 16384 +#define ZT_DICTIONARY_MAX_SIZE 8194 namespace ZeroTier { @@ -279,6 +279,15 @@ public: for(unsigned int i=0;i<ZT_DICTIONARY_MAX_SIZE;++i) { if (!_d[i]) { unsigned int j = i; + + if (j > 0) { + _d[j++] = '\n'; + if (j == ZT_DICTIONARY_MAX_SIZE) { + _d[i] = (char)0; + return false; + } + } + const char *p = key; while (*p) { _d[j++] = *(p++); @@ -287,9 +296,16 @@ public: return false; } } + + _d[j++] = '='; + if (j == ZT_DICTIONARY_MAX_SIZE) { + _d[i] = (char)0; + return false; + } + p = value; int k = 0; - while ((*p)&&((vlen < 0)||(k < vlen))) { + while ( ((*p)&&(vlen < 0)) || (k < vlen) ) { switch(*p) { case 0: case '\r': @@ -326,7 +342,9 @@ public: ++p; ++k; } - _d[j++] = (char)0; + + _d[j] = (char)0; + return true; } } diff --git a/selftest.cpp b/selftest.cpp index 9e6e077a..eeffb9bd 100644 --- a/selftest.cpp +++ b/selftest.cpp @@ -764,21 +764,22 @@ static int testOther() } std::cout << "PASS" << std::endl; - std::cout << "[other] Testing Dictionary... "; std::cout.flush(); + std::cout << "[other] Testing/fuzzing Dictionary... "; std::cout.flush(); for(int k=0;k<1000;++k) { - Dictionary td; - char key[128][16]; - char value[128][128]; - for(unsigned int q=0;q<128;++q) { + Dictionary test; + char key[32][16]; + char value[32][128]; + for(unsigned int q=0;q<32;++q) { Utils::snprintf(key[q],16,"%.8lx",(unsigned long)rand()); int r = rand() % 128; for(int x=0;x<r;++x) value[q][x] = ("0123456789\0\t\r\n= ")[rand() % 16]; value[q][r] = (char)0; - test.set(key[q],value[q]); + test.add(key[q],value[q],r); } for(unsigned int q=0;q<1024;++q) { - int r = rand() % 128; + //int r = rand() % 128; + int r = 31; char tmp[128]; if (test.get(key[r],tmp,sizeof(tmp)) >= 0) { if (strcmp(value[r],tmp)) { @@ -786,21 +787,33 @@ static int testOther() return -1; } } else { - std::cout << "FAILED (can't find key)!" << std::endl; + std::cout << "FAILED (can't find key '" << key[r] << "')!" << std::endl; + return -1; + } + } + for(unsigned int q=0;q<31;++q) { + char tmp[128]; + test.erase(key[q]); + if (test.get(key[q],tmp,sizeof(tmp)) >= 0) { + std::cout << "FAILED (key should have been erased)!" << std::endl; + return -1; + } + if (test.get(key[q+1],tmp,sizeof(tmp)) < 0) { + std::cout << "FAILED (key should NOT have been erased)!" << std::endl; return -1; } } } int foo = 0; volatile int *volatile bar = &foo; // force compiler not to optimize out test.get() below - for(int k=0;k<100000;++k) { - int r = rand() % 16384; - unsigned char tmp[16384]; + for(int k=0;k<100;++k) { + int r = rand() % ZT_DICTIONARY_MAX_SIZE; + unsigned char tmp[ZT_DICTIONARY_MAX_SIZE]; for(int q=0;q<r;++q) tmp[q] = (unsigned char)((rand() % 254) + 1); tmp[r] = 0; - Dictionary test(tmp); - for(unsigned int q=0;q<1024;++q) { + Dictionary test((const char *)tmp); + for(unsigned int q=0;q<100;++q) { char tmp[16]; Utils::snprintf(tmp,16,"%.8lx",(unsigned long)rand()); char value[128]; @@ -1013,6 +1026,7 @@ static int testResolver() return 0; } +/* static int testHttp() { std::map<std::string,std::string> requestHeaders,responseHeaders; @@ -1055,6 +1069,7 @@ static int testHttp() return 0; } +*/ #ifdef __WINDOWS__ int _tmain(int argc, _TCHAR* argv[]) |