/src/PcapPlusPlus/Tests/Fuzzers/FuzzWriter.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | #include <functional> |
2 | | #include <Packet.h> |
3 | | #include <PcapFileDevice.h> |
4 | | |
5 | | #include "Logger.h" |
6 | | #include "DumpToFile.h" |
7 | | |
8 | | static std::string tmpName; |
9 | | static std::string tmpFile; |
10 | | static std::string outPcapFile; |
11 | | static int writes = 0; |
12 | | |
13 | | extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) |
14 | 5.43k | { |
15 | 5.43k | if (tmpName.empty()) |
16 | 2 | tmpName = tmpnam(nullptr); |
17 | | |
18 | 5.43k | if (tmpFile.empty()) |
19 | 2 | tmpFile = tmpName + FILE_EXT; |
20 | | |
21 | 5.43k | if (dumpDataToPcapFile(data, size, tmpFile.c_str()) != 0) |
22 | 0 | { |
23 | 0 | std::cerr << "Can't Dump buffer to the '" << tmpFile << "' file!!!!\n"; |
24 | 0 | return -1; |
25 | 0 | } |
26 | | |
27 | 5.43k | pcpp::Logger::getInstance().suppressLogs(); |
28 | | |
29 | 5.43k | std::unique_ptr<pcpp::IFileReaderDevice> reader(pcpp::IFileReaderDevice::getReader(tmpFile)); |
30 | 5.43k | if (!reader->open()) |
31 | 705 | { |
32 | 705 | std::cerr << "Error opening the '" << tmpFile << "' file\n"; |
33 | 705 | return -1; |
34 | 705 | } |
35 | | |
36 | 4.73k | if (outPcapFile.empty()) |
37 | 2 | #ifdef NG_WRITER |
38 | 2 | outPcapFile = tmpName + ".pcapng"; |
39 | | #else |
40 | | outPcapFile = tmpName + ".pcap"; |
41 | | #endif |
42 | | |
43 | 4.73k | #ifdef NG_WRITER |
44 | 4.73k | pcpp::PcapNgFileWriterDevice pcapWriter(outPcapFile); |
45 | | #else |
46 | | pcpp::PcapFileWriterDevice pcapWriter(outPcapFile, pcpp::LINKTYPE_ETHERNET); |
47 | | #endif |
48 | 4.73k | if (writes++ == 10) |
49 | 472 | { |
50 | 472 | writes = 1; |
51 | 472 | remove(outPcapFile.c_str()); |
52 | 472 | } |
53 | 4.73k | if (!pcapWriter.open(writes != 1)) |
54 | 0 | { |
55 | 0 | std::cerr << "Cannot open '" << outPcapFile << "' for writing" << std::endl; |
56 | 0 | return -1; |
57 | 0 | } |
58 | | |
59 | 4.73k | pcpp::RawPacketVector packets; |
60 | 4.73k | if (reader->getNextPackets(packets, 1) != 1) |
61 | 1.91k | { |
62 | 1.91k | std::cerr << "Couldn't read the first packet in the file\n"; |
63 | 1.91k | return 0; |
64 | 1.91k | } |
65 | | |
66 | 2.82k | pcpp::RawPacket& rawPacket = *packets.front(); |
67 | 2.82k | do |
68 | 29.3k | { |
69 | 29.3k | pcapWriter.writePacket(rawPacket); |
70 | 29.3k | } while (reader->getNextPacket(rawPacket)); |
71 | | |
72 | 2.82k | pcpp::IPcapDevice::PcapStats stats; |
73 | 2.82k | pcapWriter.getStatistics(stats); |
74 | 2.82k | std::cout << "Written " << stats.packetsRecv << " packets successfully to pcap writer and " << stats.packetsDrop |
75 | 2.82k | << " packets could not be written" << std::endl; |
76 | | |
77 | 2.82k | pcapWriter.close(); |
78 | 2.82k | return 0; |
79 | 4.73k | } |