62 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include <stddef.h>
 | |
| #include <stdint.h>
 | |
| 
 | |
| #include <filesystem>
 | |
| #include <fstream>
 | |
| #include <memory>
 | |
| #include <string>
 | |
| #include <system_error>
 | |
| #include <unistd.h>
 | |
| 
 | |
| #include "rar.hpp"
 | |
| 
 | |
| namespace fs = std::__fs::filesystem;
 | |
| 
 | |
| extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
 | |
|   // unrar likes to create files in the current directory.
 | |
|   // So, the following few lines created and 'cd' to a directory named 'o'
 | |
|   // in the current working directory.
 | |
|   std::error_code code, ok;
 | |
|   fs::path original_path = fs::current_path(code);
 | |
|   if (code != ok) return 0;
 | |
| 
 | |
|   fs::path out_path = original_path / "o";
 | |
|   bool created = fs::create_directory(out_path, code);
 | |
|   if (code != ok) return 0;
 | |
| 
 | |
|   fs::current_path(out_path, code);
 | |
|   if (code != ok) return 0;
 | |
| 
 | |
|   static const std::string filename = "temp.rar";
 | |
|   std::ofstream file(filename,
 | |
|                      std::ios::binary | std::ios::out | std::ios::trunc);
 | |
|   if (!file.is_open()) {
 | |
|     return 0;
 | |
|   }
 | |
|   file.write(reinterpret_cast<const char *>(data), size);
 | |
|   file.close();
 | |
| 
 | |
|   std::unique_ptr<CommandData> cmd_data(new CommandData);
 | |
|   cmd_data->ParseArg(const_cast<wchar_t *>(L"-p"));
 | |
|   cmd_data->ParseArg(const_cast<wchar_t *>(L"x"));
 | |
|   cmd_data->ParseDone();
 | |
|   std::wstring wide_filename(filename.begin(), filename.end());
 | |
|   cmd_data->AddArcName(wide_filename.c_str());
 | |
| 
 | |
|   try {
 | |
|     CmdExtract extractor(cmd_data.get());
 | |
|     extractor.DoExtract();
 | |
|   } catch (...) {
 | |
|   }
 | |
| 
 | |
|   unlink(filename.c_str());
 | |
| 
 | |
|   // 'cd' back to the original directory and delete 'o' along with
 | |
|   // all its contents.
 | |
|   fs::current_path(original_path, code);
 | |
|   if (code != ok) return 0;
 | |
|   fs::remove_all(out_path, code);
 | |
|   if (code != ok) return 0;
 | |
|   return 0;
 | |
| }
 |