Index: lib/Fuzzer/FuzzerUtil.h =================================================================== --- lib/Fuzzer/FuzzerUtil.h +++ lib/Fuzzer/FuzzerUtil.h @@ -59,6 +59,10 @@ const void *SearchMemory(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen); +const char *StrStr(const char* Ref, const char* Patt); + +const char *StrCaseStr(const char* Ref, const char* Patt); + std::string CloneArgsWithoutX(const std::vector &Args, const char *X1, const char *X2); Index: lib/Fuzzer/FuzzerUtilPosix.cpp =================================================================== --- lib/Fuzzer/FuzzerUtilPosix.cpp +++ lib/Fuzzer/FuzzerUtilPosix.cpp @@ -112,6 +112,14 @@ return memmem(Data, DataLen, Patt, PattLen); } +const char *StrStr(const char* Ref, const char* Patt) { + return strstr(Ref, Patt); +} + +const char *StrCaseStr(const char* Ref, const char* Patt) { + return strcasestr(Ref, Patt); +} + } // namespace fuzzer #endif // LIBFUZZER_POSIX Index: lib/Fuzzer/FuzzerUtilWindows.cpp =================================================================== --- lib/Fuzzer/FuzzerUtilWindows.cpp +++ lib/Fuzzer/FuzzerUtilWindows.cpp @@ -177,6 +177,24 @@ return NULL; } +const char *StrStr(const char* Ref, const char* Patt) { + return (const char*) fuzzer::SearchMemory(Ref, ::strlen(Ref), Patt, + ::strlen(Patt)); +} + +static bool IgnoreCaseCmp(char a, char b) { + return ::tolower(a) == ::tolower(b); +} + +const char *StrCaseStr(const char* Ref, const char* Patt) { + const char* RefEnd = Ref + ::strlen(Ref); + const char* PattEnd = Patt + ::strlen(Patt); + const char* It = std::search(Ref, RefEnd, Patt, PattEnd, IgnoreCaseCmp); + if (It == RefEnd) + return NULL; + return It; +} + } // namespace fuzzer #endif // LIBFUZZER_WINDOWS Index: lib/Fuzzer/test/OutOfMemoryTest.cpp =================================================================== --- lib/Fuzzer/test/OutOfMemoryTest.cpp +++ lib/Fuzzer/test/OutOfMemoryTest.cpp @@ -2,6 +2,7 @@ // License. See LICENSE.TXT for details. // Tests OOM handling. +#include "../FuzzerUtil.h" #include #include #include @@ -21,7 +22,7 @@ char *p = new char[kSize]; memset(p, 0, kSize); SinkPtr = p; - sleep(1); + fuzzer::SleepSeconds(1); } } } Index: lib/Fuzzer/test/StrstrTest.cpp =================================================================== --- lib/Fuzzer/test/StrstrTest.cpp +++ lib/Fuzzer/test/StrstrTest.cpp @@ -2,6 +2,7 @@ // License. See LICENSE.TXT for details. // Test strstr and strcasestr hooks. +#include "../FuzzerUtil.h" #include #include #include @@ -11,9 +12,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { if (Size < 4) return 0; std::string s(reinterpret_cast(Data), Size); - if (strstr(s.c_str(), "FUZZ") && - strcasestr(s.c_str(), "aBcD") && - memmem(s.data(), s.size(), "kuku", 4) + if (fuzzer::StrStr(s.c_str(), "FUZZ") && + fuzzer::StrCaseStr(s.c_str(), "aBcD") && + fuzzer::SearchMemory(s.data(), s.size(), "kuku", 4) ) { fprintf(stderr, "BINGO\n"); exit(1);