diff --git a/projects/unrar/unrar_fuzzer.cc b/projects/unrar/unrar_fuzzer.cc index f19b53a5a..084aa6a8f 100644 --- a/projects/unrar/unrar_fuzzer.cc +++ b/projects/unrar/unrar_fuzzer.cc @@ -1,20 +1,27 @@ +#include #include -#include -#include +#include #include #include "rar.hpp" extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { - char filename[] = "mytemp.XXXXXX"; - int fd = mkstemp(filename); - write(fd, data, size); + std::stringstream ss; + ss << "temp-" << getpid() << ".rar"; + static const std::string filename = ss.str(); + std::ofstream file(filename, + std::ios::binary | std::ios::out | std::ios::trunc); + if (!file.is_open()) { + return 0; + } + file.write(reinterpret_cast(data), size); + file.close(); std::unique_ptr cmd_data(new CommandData); cmd_data->ParseArg(const_cast(L"-p")); cmd_data->ParseArg(const_cast(L"x")); cmd_data->ParseDone(); - std::wstring wide_filename(filename, filename + strlen(filename)); + std::wstring wide_filename(filename.begin(), filename.end()); cmd_data->AddArcName(wide_filename.c_str()); try { @@ -23,8 +30,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { } catch (...) { } - close(fd); - unlink(filename); + unlink(filename.c_str()); return 0; }