From 482cbfc4e1299434a6f632fe7f4b4e3704e65e87 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Wed, 28 Aug 2013 14:43:16 +0300 Subject: add file access fuzzer. --- src/utils/fuzzer.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++++ src/utils/fuzzer.h | 34 +++++++++++++++++++++++++++ src/utils/physfsrwops.cpp | 8 ++++++- src/utils/xml.cpp | 6 +++++ 4 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/utils/fuzzer.cpp create mode 100644 src/utils/fuzzer.h (limited to 'src/utils') diff --git a/src/utils/fuzzer.cpp b/src/utils/fuzzer.cpp new file mode 100644 index 000000000..4342899c3 --- /dev/null +++ b/src/utils/fuzzer.cpp @@ -0,0 +1,58 @@ +/* + * The ManaPlus Client + * Copyright (C) 2013 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "utils/fuzzer.h" + +#ifdef USE_FUZZER + +#include "client.h" +#include "logger.h" + +#include "utils/stringutils.h" + +#include "debug.h" + +namespace +{ + Logger *fuzz = nullptr; + int fuzzRand = 50; +} // namespace + +void Fuzzer::init() +{ + fuzz = new Logger; + fuzz->setLogFile(client->getLocalDataDirectory() + "/fuzzer.log"); + unsigned int sr = time(nullptr); + fuzz->log("Srand: %u", sr); + srand(sr); +} + +bool Fuzzer::conditionTerminate(const char *const name) +{ + if ((rand() % 100) <= fuzzRand) + { + fuzz->log("deleted: %s", name); + return true; + } + fuzz->log("passed: %s", name); + return false; +} + +#endif diff --git a/src/utils/fuzzer.h b/src/utils/fuzzer.h new file mode 100644 index 000000000..91193901d --- /dev/null +++ b/src/utils/fuzzer.h @@ -0,0 +1,34 @@ +/* + * The ManaPlus Client + * Copyright (C) 2013 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef UTILS_FUZZER_H +#define UTILS_FUZZER_H + +#include "localconsts.h" + +#ifdef USE_FUZZER +namespace Fuzzer +{ + void init(); + bool conditionTerminate(const char *const name); +} // namespace Fuzzer + +#endif // USE_FUZZER +#endif // UTILS_FUZZER_H diff --git a/src/utils/physfsrwops.cpp b/src/utils/physfsrwops.cpp index 8216e3794..31b86058c 100644 --- a/src/utils/physfsrwops.cpp +++ b/src/utils/physfsrwops.cpp @@ -24,7 +24,9 @@ #include "utils/physfsrwops.h" -#include /* used for SEEK_SET, SEEK_CUR, SEEK_END ... */ +#include "utils/fuzzer.h" + +#include #include "debug.h" @@ -214,6 +216,10 @@ SDL_RWops *PHYSFSRWOPS_openRead(const char *const fname) #ifdef __APPLE__ if (!checkFilePath(fname)) return nullptr; +#endif +#ifdef USE_FUZZER + if (Fuzzer::conditionTerminate(fname)) + return nullptr; #endif return create_rwops(PhysFs::openRead(fname)); } /* PHYSFSRWOPS_openRead */ diff --git a/src/utils/xml.cpp b/src/utils/xml.cpp index 8e0b03e1e..d19c466d1 100644 --- a/src/utils/xml.cpp +++ b/src/utils/xml.cpp @@ -26,6 +26,8 @@ #include "resources/resourcemanager.h" +#include "utils/fuzzer.h" + #include "utils/translation/podict.h" #include @@ -44,6 +46,10 @@ namespace XML Document::Document(const std::string &filename, const bool useResman) : mDoc(nullptr) { +#ifdef USE_FUZZER + if (Fuzzer::conditionTerminate(filename.c_str())) + return; +#endif int size = 0; char *data = nullptr; if (useResman) -- cgit v1.2.3-70-g09d2