diff --git a/src/config.cpp b/src/config.cpp index 36485c7be..0519e44ff 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -800,6 +800,8 @@ void loadServerConfigFromString(char *config) { serverLog(LL_WARNING, "Warning version is overriden to: %s\n", KEYDB_SET_VERSION); } else if (!strcasecmp(argv[0],"testmode") && argc == 2){ g_fTestMode = yesnotoi(argv[1]); + } else if (!strcasecmp(argv[0],"rdbfuzz-mode")) { + // NOP, handled in main } else { err = "Bad directive or wrong number of arguments"; goto loaderr; } diff --git a/src/server.cpp b/src/server.cpp index fda6d5db7..4e0239a8d 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -4852,6 +4852,12 @@ void redisOutOfMemoryHandler(size_t allocation_size) { serverPanic("Redis aborting for OUT OF MEMORY"); } +void fuzzOutOfMemoryHandler(size_t allocation_size) { + serverLog(LL_WARNING,"Out Of Memory allocating %zu bytes!", + allocation_size); + exit(EXIT_FAILURE); // don't crash because it causes false positives +} + void redisSetProcTitle(const char *title) { #ifdef USE_SETPROCTITLE const char *server_mode = ""; @@ -5208,9 +5214,12 @@ int main(int argc, char **argv) { ACLLoadUsersAtStartup(); // special case of FUZZING load from stdin then quit - if (strstr(argv[0],"keydb-fuzz-rdb") != NULL) + if (argc > 1 && strstr(argv[1],"rdbfuzz-mode") != NULL) { - serverAssert(GlobalLocksAcquired()); + zmalloc_set_oom_handler(fuzzOutOfMemoryHandler); +#ifdef __AFL_HAVE_MANUAL_CONTROL + __AFL_INIT(); +#endif rio rdb; rdbSaveInfo rsi = RDB_SAVE_INFO_INIT; startLoading(stdin);