diff --git a/.clang-format b/.clang-format index d8067eaade..1c31188ba3 100644 --- a/.clang-format +++ b/.clang-format @@ -21,4 +21,5 @@ BreakBeforeBraces: Custom BraceWrapping: SplitEmptyFunction: false AfterCaseLabel: true +InsertBraces: true ... diff --git a/Common++/src/IpUtils.cpp b/Common++/src/IpUtils.cpp index 08abf43401..f0cd61dcdf 100644 --- a/Common++/src/IpUtils.cpp +++ b/Common++/src/IpUtils.cpp @@ -189,7 +189,9 @@ static const char* inet_ntop6(const uint8_t* src, char* dst, size_t size) */ memset(words, '\0', sizeof words); for (i = 0; i < NS_IN6ADDRSZ; i++) + { words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); + } best.base = -1; best.len = 0; cur.base = -1; @@ -199,16 +201,22 @@ static const char* inet_ntop6(const uint8_t* src, char* dst, size_t size) if (words[i] == 0) { if (cur.base == -1) + { cur.base = i, cur.len = 1; + } else + { cur.len++; + } } else { if (cur.base != -1) { if (best.base == -1 || cur.len > best.len) + { best = cur; + } cur.base = -1; } } @@ -216,10 +224,14 @@ static const char* inet_ntop6(const uint8_t* src, char* dst, size_t size) if (cur.base != -1) { if (best.base == -1 || cur.len > best.len) + { best = cur; + } } if (best.base != -1 && best.len < 2) + { best.base = -1; + } /* * Format the result. @@ -231,17 +243,23 @@ static const char* inet_ntop6(const uint8_t* src, char* dst, size_t size) if (best.base != -1 && i >= best.base && i < (best.base + best.len)) { if (i == best.base) + { *tp++ = ':'; + } continue; } /* Are we following an initial run of 0x00s or any real hex? */ if (i != 0) + { *tp++ = ':'; + } /* Is this address an encapsulated IPv4? */ if (i == 6 && best.base == 0 && (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { if (!inet_ntop4(src + 12, tp, sizeof tmp - (tp - tmp))) + { return (nullptr); + } tp += strlen(tp); break; } @@ -249,7 +267,9 @@ static const char* inet_ntop6(const uint8_t* src, char* dst, size_t size) } /* Was it a trailing run of 0x00's? */ if (best.base != -1 && (best.base + best.len) == (NS_IN6ADDRSZ / NS_INT16SZ)) + { *tp++ = ':'; + } *tp++ = '\0'; /* @@ -291,27 +311,37 @@ static int inet_pton4(const char* src, uint8_t* dst) size_t newSize = *tp * 10 + (pch - digits); if (newSize > 255) + { return (0); + } *tp = (u_char)newSize; if (!saw_digit) { if (++octets > 4) + { return (0); + } saw_digit = 1; } } else if (ch == '.' && saw_digit) { if (octets == 4) + { return (0); + } *++tp = 0; saw_digit = 0; } else + { return (0); + } } if (octets < 4) + { return (0); + } memcpy(dst, tmp, NS_INADDRSZ); return (1); } @@ -342,8 +372,12 @@ static int inet_pton6(const char* src, uint8_t* dst) colonp = nullptr; /* Leading :: requires some special handling. */ if (*src == ':') + { if (*++src != ':') + { return (0); + } + } curtok = src; saw_xdigit = 0; val = 0; @@ -352,13 +386,17 @@ static int inet_pton6(const char* src, uint8_t* dst) const char *pch, *xdigits; if ((pch = strchr((xdigits = xdigits_l), ch)) == nullptr) + { pch = strchr((xdigits = xdigits_u), ch); + } if (pch != nullptr) { val <<= 4; val |= (pch - xdigits); if (val > 0xffff) + { return (0); + } saw_xdigit = 1; continue; } @@ -368,7 +406,9 @@ static int inet_pton6(const char* src, uint8_t* dst) if (!saw_xdigit) { if (colonp) + { return (0); + } colonp = tp; continue; } @@ -377,7 +417,9 @@ static int inet_pton6(const char* src, uint8_t* dst) return (0); } if (tp + NS_INT16SZ > endp) + { return (0); + } *tp++ = (u_char)(val >> 8) & 0xff; *tp++ = (u_char)val & 0xff; saw_xdigit = 0; @@ -395,7 +437,9 @@ static int inet_pton6(const char* src, uint8_t* dst) if (saw_xdigit) { if (tp + NS_INT16SZ > endp) + { return (0); + } *tp++ = (u_char)(val >> 8) & 0xff; *tp++ = (u_char)val & 0xff; } @@ -409,7 +453,9 @@ static int inet_pton6(const char* src, uint8_t* dst) int i; if (tp == endp) + { return (0); + } for (i = 1; i <= n; i++) { endp[-i] = colonp[n - i]; @@ -418,7 +464,9 @@ static int inet_pton6(const char* src, uint8_t* dst) tp = endp; } if (tp != endp) + { return (0); + } memcpy(dst, tmp, NS_IN6ADDRSZ); return (1); } diff --git a/Common++/src/SystemUtils.cpp b/Common++/src/SystemUtils.cpp index 0ec5060ead..f1af44176f 100644 --- a/Common++/src/SystemUtils.cpp +++ b/Common++/src/SystemUtils.cpp @@ -271,8 +271,10 @@ namespace pcpp case CTRL_BREAK_EVENT: { if (ApplicationEventHandler::getInstance().m_ApplicationInterruptedHandler != nullptr) + { ApplicationEventHandler::getInstance().m_ApplicationInterruptedHandler( ApplicationEventHandler::getInstance().m_ApplicationInterruptedCookie); + } return TRUE; } diff --git a/Examples/Arping/main.cpp b/Examples/Arping/main.cpp index e6e03177f6..ab6b7f19ea 100644 --- a/Examples/Arping/main.cpp +++ b/Examples/Arping/main.cpp @@ -187,11 +187,15 @@ int main(int argc, char* argv[]) // verify that interface name or IP were provided if (!ifaceNameOrIpProvided) + { EXIT_WITH_ERROR("You must provide at least interface name or interface IP (-i switch)"); + } // verify target IP was provided if (!targetIpProvided) + { EXIT_WITH_ERROR("You must provide target IP (-T switch)"); + } pcpp::PcapLiveDevice* dev = nullptr; @@ -200,28 +204,42 @@ int main(int argc, char* argv[]) { dev = pcpp::PcapLiveDeviceList::getInstance().getDeviceByIpOrName(ifaceNameOrIP); if (dev == nullptr) + { EXIT_WITH_ERROR("Couldn't find interface by provided IP address or name"); + } } else + { EXIT_WITH_ERROR("Interface name or IP empty"); + } // open device in promiscuous mode if (!dev->open()) + { EXIT_WITH_ERROR("Couldn't open interface device '" << dev->getName() << "'"); + } // if source MAC not provided - use the interface MAC address if (sourceMac == pcpp::MacAddress::Zero) + { sourceMac = dev->getMacAddress(); + } // if source MAC is still invalid, it means it couldn't be extracted from interface if (sourceMac == pcpp::MacAddress::Zero) + { EXIT_WITH_ERROR("MAC address couldn't be extracted from interface"); + } if (sourceIP == pcpp::IPv4Address::Zero) + { sourceIP = dev->getIPv4Address(); + } if (sourceIP == pcpp::IPv4Address::Zero) + { EXIT_WITH_ERROR("Source IPv4 address wasn't supplied and couldn't be retrieved from interface"); + } // let's go double arpResponseTimeMS = 0; diff --git a/Examples/DNSResolver/main.cpp b/Examples/DNSResolver/main.cpp index 3a0a121fce..6dea18d8c6 100644 --- a/Examples/DNSResolver/main.cpp +++ b/Examples/DNSResolver/main.cpp @@ -174,7 +174,9 @@ int main(int argc, char* argv[]) // make sure that hostname is provided if (!hostnameProvided) + { EXIT_WITH_ERROR("Hostname not provided"); + } // find the interface to send the DNS request from pcpp::PcapLiveDevice* dev = nullptr; @@ -184,7 +186,9 @@ int main(int argc, char* argv[]) { dev = pcpp::PcapLiveDeviceList::getInstance().getDeviceByIpOrName(interfaceNameOrIP); if (dev == nullptr) + { EXIT_WITH_ERROR("Couldn't find interface by provided IP address or name"); + } } // if interface name or IP was not provided - find a device that has a default gateway else @@ -201,7 +205,9 @@ int main(int argc, char* argv[]) } if (dev == nullptr) + { EXIT_WITH_ERROR("Couldn't find an interface with a default gateway"); + } } std::cout << "Using interface '" << dev->getIPv4Address() << "'" << std::endl; diff --git a/Examples/DnsSpoofing/main.cpp b/Examples/DnsSpoofing/main.cpp index 92b24f7b1d..fee50e4d61 100644 --- a/Examples/DnsSpoofing/main.cpp +++ b/Examples/DnsSpoofing/main.cpp @@ -152,7 +152,9 @@ void handleDnsRequest(pcpp::RawPacket* packet, pcpp::PcapLiveDevice* dev, void* if (!dnsRequest.isPacketOfType(pcpp::DNS) || !dnsRequest.isPacketOfType(pcpp::IP) || !dnsRequest.isPacketOfType(pcpp::UDP) || !dnsRequest.isPacketOfType(pcpp::Ethernet)) + { return; + } // extract all packet layers pcpp::EthLayer* ethLayer = dnsRequest.getLayerOfType(); @@ -162,13 +164,17 @@ void handleDnsRequest(pcpp::RawPacket* packet, pcpp::PcapLiveDevice* dev, void* // skip DNS requests with more than 1 request or with 0 requests if (dnsLayer->getDnsHeader()->numberOfQuestions != pcpp::hostToNet16(1) || dnsLayer->getFirstQuery() == nullptr) + { return; + } // skip DNS requests which are not of class IN and type A (IPv4) or AAAA (IPv6) pcpp::DnsType dnsType = (args->dnsServer.isIPv4() ? pcpp::DNS_TYPE_A : pcpp::DNS_TYPE_AAAA); pcpp::DnsQuery* dnsQuery = dnsLayer->getFirstQuery(); if (dnsQuery->getDnsType() != dnsType || dnsQuery->getDnsClass() != pcpp::DNS_CLASS_IN) + { return; + } // empty dnsHostsToSpoof means spoofing all hosts if (!args->dnsHostsToSpoof.empty()) @@ -186,7 +192,9 @@ void handleDnsRequest(pcpp::RawPacket* packet, pcpp::PcapLiveDevice* dev, void* } if (!hostMatch) + { return; + } } // create a response out of the request packet @@ -227,20 +235,26 @@ void handleDnsRequest(pcpp::RawPacket* packet, pcpp::PcapLiveDevice* dev, void* { pcpp::IPv4DnsResourceData dnsServer(args->dnsServer.getIPv4()); if (!dnsLayer->addAnswer(dnsQuery->getName(), pcpp::DNS_TYPE_A, pcpp::DNS_CLASS_IN, 1, &dnsServer)) + { return; + } } else { pcpp::IPv6DnsResourceData dnsServer(args->dnsServer.getIPv6()); if (!dnsLayer->addAnswer(dnsQuery->getName(), pcpp::DNS_TYPE_AAAA, pcpp::DNS_CLASS_IN, 1, &dnsServer)) + { return; + } } dnsRequest.computeCalculateFields(); // send DNS response back to the network if (!dev->sendPacket(dnsRequest)) + { return; + } args->stats.numOfSpoofedDnsRequests++; args->stats.spoofedHosts[dnsQuery->getName()]++; @@ -313,7 +327,9 @@ void doDnsSpoofing(pcpp::PcapLiveDevice* dev, const pcpp::IPAddress& dnsServer, { // open device if (!dev->open()) + { EXIT_WITH_ERROR("Cannot open capture device"); + } // set a filter to capture only DNS requests and client IP if provided pcpp::PortFilter dnsPortFilter(53, pcpp::DST); @@ -330,7 +346,9 @@ void doDnsSpoofing(pcpp::PcapLiveDevice* dev, const pcpp::IPAddress& dnsServer, pcpp::AndFilter andFilter(filterForAnd); if (!dev->setFilter(andFilter)) + { EXIT_WITH_ERROR("Cannot set DNS and client IP filter for device"); + } // make args for callback DnsSpoofingArgs args; @@ -339,7 +357,9 @@ void doDnsSpoofing(pcpp::PcapLiveDevice* dev, const pcpp::IPAddress& dnsServer, // start capturing DNS requests if (!dev->startCapture(handleDnsRequest, &args)) + { EXIT_WITH_ERROR("Cannot start packet capture"); + } // register the on app close event to print summary stats on app termination pcpp::ApplicationEventHandler::getInstance().onApplicationInterrupted(onApplicationInterrupted, &args); @@ -431,7 +451,9 @@ int main(int argc, char* argv[]) std::string token; while (std::getline(stream, token, ',')) + { hostList.push_back(token); + } break; } default: @@ -452,15 +474,21 @@ int main(int argc, char* argv[]) dev = pcpp::PcapLiveDeviceList::getInstance().getDeviceByIpOrName(interfaceNameOrIP); if (dev == nullptr) + { EXIT_WITH_ERROR("Couldn't find interface by provided IP address or name"); + } // verify DNS server IP is a valid IPv4 address if (dnsServer.isZero()) + { EXIT_WITH_ERROR("Spoof DNS server IP provided is empty or not a valid IPv4 address"); + } // verify client IP is valid if set if (clientIpSet && clientIP.isZero()) + { EXIT_WITH_ERROR("Client IP to spoof is invalid"); + } doDnsSpoofing(dev, dnsServer, clientIP, hostList); } diff --git a/Examples/DpdkBridge/AppWorkerThread.h b/Examples/DpdkBridge/AppWorkerThread.h index fd25f25326..43e767f670 100644 --- a/Examples/DpdkBridge/AppWorkerThread.h +++ b/Examples/DpdkBridge/AppWorkerThread.h @@ -67,7 +67,9 @@ class AppWorkerThread : public pcpp::DpdkWorkerThread for (int i = 0; i < MAX_RECEIVE_BURST; i++) { if (packetArr[i] != nullptr) + { delete packetArr[i]; + } } return true; diff --git a/Examples/DpdkExample-FilterTraffic/AppWorkerThread.h b/Examples/DpdkExample-FilterTraffic/AppWorkerThread.h index ca2221f332..d6ba57074c 100644 --- a/Examples/DpdkExample-FilterTraffic/AppWorkerThread.h +++ b/Examples/DpdkExample-FilterTraffic/AppWorkerThread.h @@ -149,7 +149,9 @@ class AppWorkerThread : public pcpp::DpdkWorkerThread for (int i = 0; i < MAX_RECEIVE_BURST; i++) { if (packetArr[i] != nullptr) + { delete packetArr[i]; + } } // close and delete pcap file writer diff --git a/Examples/DpdkExample-FilterTraffic/Common.h b/Examples/DpdkExample-FilterTraffic/Common.h index 8abc00caff..3ece6c4d59 100644 --- a/Examples/DpdkExample-FilterTraffic/Common.h +++ b/Examples/DpdkExample-FilterTraffic/Common.h @@ -84,23 +84,41 @@ struct PacketStats { packetCount++; if (packet.isPacketOfType(pcpp::Ethernet)) + { ethCount++; + } if (packet.isPacketOfType(pcpp::ARP)) + { arpCount++; + } if (packet.isPacketOfType(pcpp::IPv4)) + { ipv4Count++; + } if (packet.isPacketOfType(pcpp::IPv6)) + { ipv6Count++; + } if (packet.isPacketOfType(pcpp::TCP)) + { tcpCount++; + } if (packet.isPacketOfType(pcpp::UDP)) + { udpCount++; + } if (packet.isPacketOfType(pcpp::HTTP)) + { httpCount++; + } if (packet.isPacketOfType(pcpp::DNS)) + { dnsCount++; + } if (packet.isPacketOfType(pcpp::SSL)) + { tlsCount++; + } } void collectStats(const PacketStats& stats) diff --git a/Examples/DpdkExample-FilterTraffic/PacketMatchingEngine.h b/Examples/DpdkExample-FilterTraffic/PacketMatchingEngine.h index e5354898ed..3064dd7eb4 100644 --- a/Examples/DpdkExample-FilterTraffic/PacketMatchingEngine.h +++ b/Examples/DpdkExample-FilterTraffic/PacketMatchingEngine.h @@ -29,15 +29,25 @@ class PacketMatchingEngine m_MatchDstIp(false), m_MatchSrcPort(false), m_MatchDstPort(false), m_MatchProtocol(false) { if (m_SrcIpToMatch != pcpp::IPv4Address::Zero) + { m_MatchSrcIp = true; + } if (m_DstIpToMatch != pcpp::IPv4Address::Zero) + { m_MatchDstIp = true; + } if (m_SrcPortToMatch != 0) + { m_MatchSrcPort = true; + } if (m_DstPortToMatch != 0) + { m_MatchDstPort = true; + } if (m_ProtocolToMatch == pcpp::TCP || m_ProtocolToMatch == pcpp::UDP) + { m_MatchProtocol = true; + } } bool isMatched(pcpp::Packet& packet) diff --git a/Examples/DpdkExample-FilterTraffic/main.cpp b/Examples/DpdkExample-FilterTraffic/main.cpp index 8993cb9fc8..75b237d141 100644 --- a/Examples/DpdkExample-FilterTraffic/main.cpp +++ b/Examples/DpdkExample-FilterTraffic/main.cpp @@ -199,7 +199,9 @@ void prepareCoreConfiguration(std::vector& dpdkDevicesToUse, for (int rxQIndex = 0; rxQIndex < numOfRxQueuesPerCore; rxQIndex++) { if (pairVecIter == deviceAndRxQVec.end()) + { break; + } workerConfigArr[i].inDataCfg[pairVecIter->first].push_back(pairVecIter->second); ++pairVecIter; } @@ -452,9 +454,13 @@ int main(int argc, char* argv[]) { std::string protocol = std::string(optarg); if (protocol == "TCP") + { protocolToMatch = pcpp::TCP; + } else if (protocol == "UDP") + { protocolToMatch = pcpp::UDP; + } else { EXIT_WITH_ERROR_AND_PRINT_USAGE("Protocol to match isn't TCP or UDP"); diff --git a/Examples/HttpAnalyzer/HttpStatsCollector.h b/Examples/HttpAnalyzer/HttpStatsCollector.h index 9554509641..ae5c53570e 100644 --- a/Examples/HttpAnalyzer/HttpStatsCollector.h +++ b/Examples/HttpAnalyzer/HttpStatsCollector.h @@ -169,12 +169,16 @@ class HttpStatsCollector { // verify packet is TCP if (!httpPacket->isPacketOfType(pcpp::TCP)) + { return; + } // verify packet is port 80 pcpp::TcpLayer* tcpLayer = httpPacket->getLayerOfType(); if (!(tcpLayer->getDstPort() == m_DstPort || tcpLayer->getSrcPort() == m_DstPort)) + { return; + } // collect general HTTP traffic stats on this packet uint32_t hashVal = collectHttpTrafficStats(httpPacket); @@ -362,7 +366,9 @@ class HttpStatsCollector { // if num of current opened transaction is negative it means something went completely wrong if (m_FlowTable[flowKey].numOfOpenTransactions < 0) + { return; + } if (message->getProtocol() == pcpp::HTTPRequest) { @@ -370,7 +376,9 @@ class HttpStatsCollector // a re-transmitted packet and should be ignored if (m_FlowTable[flowKey].curSeqNumberRequests >= pcpp::netToHost32(tcpLayer->getTcpHeader()->sequenceNumber)) + { return; + } // a new request - increase num of open transactions m_FlowTable[flowKey].numOfOpenTransactions++; @@ -395,7 +403,9 @@ class HttpStatsCollector // a re-transmitted packet and should be ignored if (m_FlowTable[flowKey].curSeqNumberResponses >= pcpp::netToHost32(tcpLayer->getTcpHeader()->sequenceNumber)) + { return; + } // a response - decrease num of open transactions m_FlowTable[flowKey].numOfOpenTransactions--; @@ -418,9 +428,11 @@ class HttpStatsCollector // calc average transactions per flow if (m_FlowTable.size() != 0) + { m_GeneralStats.averageNumOfHttpTransactionsPerFlow = static_cast(m_GeneralStats.numOfHttpTransactions) / static_cast(m_FlowTable.size()); + } } // set last seen sequence number @@ -436,13 +448,17 @@ class HttpStatsCollector m_RequestStats.numOfMessages++; m_RequestStats.totalMessageHeaderSize += req->getHeaderLen(); if (m_RequestStats.numOfMessages != 0) + { m_RequestStats.averageMessageHeaderSize = static_cast(m_RequestStats.totalMessageHeaderSize) / static_cast(m_RequestStats.numOfMessages); + } // extract hostname and add to hostname count map pcpp::HeaderField* hostField = req->getFieldByName(PCPP_HTTP_HOST_FIELD); if (hostField != nullptr) + { m_RequestStats.hostnameCount[hostField->getFieldValue()]++; + } m_RequestStats.methodCount[req->getFirstLine()->getMethod()]++; } @@ -455,8 +471,10 @@ class HttpStatsCollector m_ResponseStats.numOfMessages++; m_ResponseStats.totalMessageHeaderSize += res->getHeaderLen(); if (m_ResponseStats.numOfMessages != 0) + { m_ResponseStats.averageMessageHeaderSize = static_cast(m_ResponseStats.totalMessageHeaderSize) / static_cast(m_ResponseStats.numOfMessages); + } // extract content-length (if exists) pcpp::HeaderField* contentLengthField = res->getFieldByName(PCPP_HTTP_CONTENT_LENGTH_FIELD); @@ -465,9 +483,11 @@ class HttpStatsCollector m_ResponseStats.numOfMessagesWithContentLength++; m_ResponseStats.totalContentLengthSize += atoi(contentLengthField->getFieldValue().c_str()); if (m_ResponseStats.numOfMessagesWithContentLength != 0) + { m_ResponseStats.averageContentLengthSize = static_cast(m_ResponseStats.totalContentLengthSize) / static_cast(m_ResponseStats.numOfMessagesWithContentLength); + } } // extract content-type and add to content-type map @@ -481,7 +501,9 @@ class HttpStatsCollector // remove charset as it's not relevant for these stats size_t charsetPos = contentType.find(";"); if (charsetPos != std::string::npos) + { contentType.resize(charsetPos); + } m_ResponseStats.contentTypeCount[contentType]++; } diff --git a/Examples/HttpAnalyzer/main.cpp b/Examples/HttpAnalyzer/main.cpp index 3667a3612a..af7b484b0a 100644 --- a/Examples/HttpAnalyzer/main.cpp +++ b/Examples/HttpAnalyzer/main.cpp @@ -406,12 +406,16 @@ void analyzeHttpFromPcapFile(const std::string& pcapFileName, uint16_t dstPort) std::unique_ptr reader(pcpp::IFileReaderDevice::getReader(pcapFileName)); if (!reader->open()) + { EXIT_WITH_ERROR("Could not open input pcap file"); + } // set a port filter on the reader device to process only HTTP packets pcpp::PortFilter httpPortFilter(dstPort, pcpp::SRC_OR_DST); if (!reader->setFilter(httpPortFilter)) + { EXIT_WITH_ERROR("Could not set up filter on file"); + } // read the input file packet by packet and give it to the HttpStatsCollector for collecting stats HttpStatsCollector collector(dstPort); @@ -438,11 +442,15 @@ void analyzeHttpFromLiveTraffic(pcpp::PcapLiveDevice* dev, bool printRatesPeriod { // open the device if (!dev->open()) + { EXIT_WITH_ERROR("Could not open the device"); + } pcpp::PortFilter httpPortFilter(dstPort, pcpp::SRC_OR_DST); if (!dev->setFilter(httpPortFilter)) + { EXIT_WITH_ERROR("Could not set up filter on device"); + } // if needed to save the captured packets to file - open a writer device std::unique_ptr pcapWriter; @@ -555,12 +563,16 @@ int main(int argc, char* argv[]) // if no interface nor input pcap file were provided - exit with error if (readPacketsFromPcapFileName == "" && interfaceNameOrIP == "") + { EXIT_WITH_ERROR("Neither interface nor input pcap file were provided"); + } // get the port int nPort = atoi(port.c_str()); if (nPort <= 0 || nPort > 65535) + { EXIT_WITH_ERROR("Please input a number between 0 to 65535"); + } // analyze in pcap file mode if (readPacketsFromPcapFileName != "") @@ -571,7 +583,9 @@ int main(int argc, char* argv[]) { pcpp::PcapLiveDevice* dev = pcpp::PcapLiveDeviceList::getInstance().getDeviceByIpOrName(interfaceNameOrIP); if (dev == nullptr) + { EXIT_WITH_ERROR("Couldn't find interface by provided IP address or name"); + } // start capturing and analyzing traffic analyzeHttpFromLiveTraffic(dev, printRatesPeriodically, printRatePeriod, savePacketsToFileName, nPort); diff --git a/Examples/IPDefragUtil/main.cpp b/Examples/IPDefragUtil/main.cpp index 929ec5af39..e7d1a33c22 100644 --- a/Examples/IPDefragUtil/main.cpp +++ b/Examples/IPDefragUtil/main.cpp @@ -213,9 +213,13 @@ void processPackets(pcpp::IFileReaderDevice* reader, pcpp::IFileWriterDevice* wr if (status == pcpp::IPReassembly::REASSEMBLED) { if (isIPv4Packet) + { stats.ipv4PacketsDefragmented++; + } else if (isIPv6Packet) + { stats.ipv6PacketsDefragmented++; + } // free packet delete result; @@ -227,9 +231,13 @@ void processPackets(pcpp::IFileReaderDevice* reader, pcpp::IFileWriterDevice* wr status == pcpp::IPReassembly::MALFORMED_FRAGMENT || status == pcpp::IPReassembly::REASSEMBLED) { if (isIPv4Packet) + { stats.ipv4FragmentsMatched++; + } else if (isIPv6Packet) + { stats.ipv6FragmentsMatched++; + } } } // if packet isn't marked for de-fragmentation but the user asked to write all packets to output file @@ -258,7 +266,9 @@ void printStats(const DefragStats& stats, bool filterByIpID, bool filterByBpf) stream << "IPv6 packets match fragment ID list: " << stats.ipv6PacketsMatchFragIDs << std::endl; } if (filterByBpf) + { stream << "IP packets match BPF filter: " << stats.ipPacketsMatchBpfFilter << std::endl; + } stream << "Total fragments matched: " << (stats.ipv4FragmentsMatched + stats.ipv6FragmentsMatched) << std::endl; stream << "IPv4 fragments matched: " << stats.ipv4FragmentsMatched << std::endl; @@ -332,7 +342,9 @@ int main(int argc, char* argv[]) bpfFilter = optarg; pcpp::BPFStringFilter filter(bpfFilter); if (!filter.verifyFilter()) + { EXIT_WITH_ERROR("Illegal BPF filter"); + } break; } case 'a': @@ -362,7 +374,9 @@ int main(int argc, char* argv[]) { paramIndex++; if (paramIndex > expectedParams) + { EXIT_WITH_ERROR("Unexpected parameter: " << argv[i]); + } switch (paramIndex) { diff --git a/Examples/IPFragUtil/main.cpp b/Examples/IPFragUtil/main.cpp index 882c922310..02b6b830e3 100644 --- a/Examples/IPFragUtil/main.cpp +++ b/Examples/IPFragUtil/main.cpp @@ -112,7 +112,9 @@ void setIPv4FragmentParams(pcpp::IPv4Layer* fragIpLayer, size_t fragOffset, bool // if this is not the last fragment, set a "more fragments" flag if (!lastFrag) + { fragOffsetValue |= (uint16_t)0x20; + } // write fragment flags + fragment offset to packet fragIpLayer->getIPv4Header()->fragmentOffset = fragOffsetValue; @@ -159,17 +161,27 @@ void splitIPPacketToFragmentsBySize(pcpp::RawPacket* rawPacket, size_t fragmentS // check if IPv4/6 pcpp::ProtocolType ipProto = pcpp::UnknownProtocol; if (packet.isPacketOfType(pcpp::IPv4)) + { ipProto = pcpp::IPv4; + } else if (packet.isPacketOfType(pcpp::IPv6)) + { ipProto = pcpp::IPv6; + } else + { return; + } pcpp::Layer* ipLayer = nullptr; if (ipProto == pcpp::IPv4) + { ipLayer = packet.getLayerOfType(); + } else // ipProto == IPv6 + { ipLayer = packet.getLayerOfType(); + } // if packet payload size is less than the requested fragment size, don't fragment and return if (ipLayer->getLayerPayloadSize() <= fragmentSize) @@ -205,9 +217,13 @@ void splitIPPacketToFragmentsBySize(pcpp::RawPacket* rawPacket, size_t fragmentS // find the IPv4/6 layer of the new fragment pcpp::Layer* fragIpLayer = nullptr; if (ipProto == pcpp::IPv4) + { fragIpLayer = newFrag.getLayerOfType(); + } else // ipProto == IPv6 + { fragIpLayer = newFrag.getLayerOfType(); + } // delete all layers above IP layer newFrag.removeAllLayersAfter(fragIpLayer); @@ -218,9 +234,13 @@ void splitIPPacketToFragmentsBySize(pcpp::RawPacket* rawPacket, size_t fragmentS // set fragment parameters in IPv4/6 layer if (ipProto == pcpp::IPv4) + { setIPv4FragmentParams((pcpp::IPv4Layer*)fragIpLayer, curOffset, lastFrag); + } else // ipProto == IPv6 + { setIPv6FragmentParams((pcpp::IPv6Layer*)fragIpLayer, curOffset, lastFrag, randomNum); + } // compute all calculated fields of the new fragment newFrag.computeCalculateFields(); @@ -321,9 +341,13 @@ void processPackets(pcpp::IFileReaderDevice* reader, pcpp::IFileWriterDevice* wr else if (resultFrags.size() > 1) // packet was fragmented { if (ipProto == pcpp::IPv4) + { stats.ipv4PacketsFragmented++; + } else // ipProto == IPv6 + { stats.ipv6PacketsFragmented++; + } } // write the result fragments if either: (1) packet was indeed fragmented, @@ -355,9 +379,13 @@ void printStats(const FragStats& stats, bool filterByIpID, bool filterByBpf) stream << "IPv4 packets read: " << stats.ipv4Packets << std::endl; stream << "IPv6 packets read: " << stats.ipv6Packets << std::endl; if (filterByIpID) + { stream << "IPv4 packets match IP ID list: " << stats.ipv4PacketsMatchIpIDs << std::endl; + } if (filterByBpf) + { stream << "IP packets match BPF filter: " << stats.ipPacketsMatchBpfFilter << std::endl; + } stream << "IP packets smaller than fragment size: " << stats.ipPacketsUnderSize << std::endl; stream << "IPv4 packets fragmented: " << stats.ipv4PacketsFragmented << std::endl; stream << "IPv6 packets fragmented: " << stats.ipv6PacketsFragmented << std::endl; @@ -401,9 +429,13 @@ int main(int argc, char* argv[]) { fragSize = atoi(optarg); if (fragSize < 1) + { EXIT_WITH_ERROR("Fragment size must be a positive integer"); + } if (fragSize % 8 != 0) + { EXIT_WITH_ERROR("Fragment size must divide by 8"); + } break; } case 'd': @@ -436,7 +468,9 @@ int main(int argc, char* argv[]) bpfFilter = optarg; pcpp::BPFStringFilter filter(bpfFilter); if (!filter.verifyFilter()) + { EXIT_WITH_ERROR("Illegal BPF filter"); + } break; } case 'a': @@ -467,7 +501,9 @@ int main(int argc, char* argv[]) { paramIndex++; if (paramIndex > expectedParams) + { EXIT_WITH_ERROR("Unexpected parameter: " << argv[i]); + } switch (paramIndex) { diff --git a/Examples/IcmpFileTransfer/Common.cpp b/Examples/IcmpFileTransfer/Common.cpp index 4b1e8df751..5ecb702801 100644 --- a/Examples/IcmpFileTransfer/Common.cpp +++ b/Examples/IcmpFileTransfer/Common.cpp @@ -139,7 +139,9 @@ void readCommandLineArguments(int argc, char* argv[], const std::string& thisSid break; case 'p': if (thisSide == "catcher") + { EXIT_WITH_ERROR_PRINT_USAGE("Unknown option -p"); + } packetsPerSec = atoi(optarg); packetsPerSecSet = true; break; @@ -165,7 +167,9 @@ void readCommandLineArguments(int argc, char* argv[], const std::string& thisSid // extract my IP address by interface name or IP address string if (interfaceNameOrIP.empty()) + { EXIT_WITH_ERROR_PRINT_USAGE("Please provide " << thisSide << " interface name or IP"); + } pcpp::IPv4Address interfaceIP; try @@ -177,14 +181,18 @@ void readCommandLineArguments(int argc, char* argv[], const std::string& thisSid { pcpp::PcapLiveDevice* dev = pcpp::PcapLiveDeviceList::getInstance().getDeviceByName(interfaceNameOrIP); if (dev == nullptr) + { EXIT_WITH_ERROR_PRINT_USAGE("Cannot find interface by provided name"); + } myIP = dev->getIPv4Address(); } // validate pitcher/catcher IP address if (otherSideIPAsString.empty()) + { EXIT_WITH_ERROR_PRINT_USAGE("Please provide " << otherSide << " IP address"); + } pcpp::IPv4Address tempIP; try @@ -199,23 +207,33 @@ void readCommandLineArguments(int argc, char* argv[], const std::string& thisSid // verify only one of sender and receiver switches are set if (sender && receiver) + { EXIT_WITH_ERROR_PRINT_USAGE("Cannot set both send file mode (-s) and receive file mode (-r) switches"); + } if (!sender && !receiver) + { EXIT_WITH_ERROR_PRINT_USAGE("Must set either send file mode (-s) or receive file mode (-r) switches"); + } // cannot set block size if in receiving file mode if (!sender && blockSizeSet) + { EXIT_WITH_ERROR_PRINT_USAGE("Setting block size (-b switch) is relevant for sending files only"); + } // validate block size if (blockSize < 1 || blockSize > 1464) + { EXIT_WITH_ERROR_PRINT_USAGE("Block size must be a positive integer lower or equal to 1464 bytes (which is the " "maximum size for a standard packet)"); + } // validate packets per sec if (packetsPerSecSet && packetsPerSec < 1) + { EXIT_WITH_ERROR_PRINT_USAGE("message_per_sec must be a positive value greater or equal to 1"); + } } bool sendIcmpMessage(pcpp::PcapLiveDevice* dev, pcpp::MacAddress srcMacAddr, pcpp::MacAddress dstMacAddr, @@ -227,7 +245,9 @@ bool sendIcmpMessage(pcpp::PcapLiveDevice* dev, pcpp::MacAddress srcMacAddr, pcp // keep IP ID in the range of 0x1234-0xfff0 if (ipID == 0xfff0) + { ipID = 0x1234; + } // create the different layers @@ -243,9 +263,13 @@ bool sendIcmpMessage(pcpp::PcapLiveDevice* dev, pcpp::MacAddress srcMacAddr, pcp // then ICMP pcpp::IcmpLayer icmpLayer; if (sendRequest && icmpLayer.setEchoRequestData(icmpMsgId, 0, msgType, data, dataLen) == nullptr) + { EXIT_WITH_ERROR("Cannot set ICMP echo request data"); + } else if (!sendRequest && icmpLayer.setEchoReplyData(icmpMsgId, 0, msgType, data, dataLen) == nullptr) + { EXIT_WITH_ERROR("Cannot set ICMP echo response data"); + } // create an new packet and add all layers to it pcpp::Packet packet; diff --git a/Examples/IcmpFileTransfer/IcmpFileTransfer-catcher.cpp b/Examples/IcmpFileTransfer/IcmpFileTransfer-catcher.cpp index 5d5f8f576b..5b689f37a2 100644 --- a/Examples/IcmpFileTransfer/IcmpFileTransfer-catcher.cpp +++ b/Examples/IcmpFileTransfer/IcmpFileTransfer-catcher.cpp @@ -67,30 +67,40 @@ static bool waitForFileTransferStart(pcpp::RawPacket* rawPacket, pcpp::PcapLiveD // verify it's ICMP and IPv4 (IPv6 and ICMPv6 are not supported) if (!parsedPacket.isPacketOfType(pcpp::ICMP) || !parsedPacket.isPacketOfType(pcpp::IPv4)) + { return false; + } if (icmpVoidData == nullptr) + { return false; + } IcmpFileTransferStart* icmpFTStart = (IcmpFileTransferStart*)icmpVoidData; // extract the ICMP layer, verify it's an ICMP request pcpp::IcmpLayer* icmpLayer = parsedPacket.getLayerOfType(); if (icmpLayer->getEchoRequestData() == nullptr) + { return false; + } // verify the source IP is the pitcher's IP and the dest IP is the catcher's IP pcpp::IPv4Layer* ip4Layer = parsedPacket.getLayerOfType(); if (ip4Layer->getSrcIPv4Address() != icmpFTStart->pitcherIPAddr || ip4Layer->getDstIPv4Address() != icmpFTStart->catcherIPAddr) + { return false; + } // check the ICMP timestamp field which contains the type of message delivered between pitcher and catcher // in this case the catcher is waiting for a file-transfer start message from the pitcher containing the file name // which is of type ICMP_FT_START uint64_t resMsg = icmpLayer->getEchoRequestData()->header->timestamp; if (resMsg != ICMP_FT_START) + { return false; + } // extract the file name from the ICMP request data icmpFTStart->fileName = std::string((char*)icmpLayer->getEchoRequestData()->data); @@ -103,7 +113,9 @@ static bool waitForFileTransferStart(pcpp::RawPacket* rawPacket, pcpp::PcapLiveD // received the file name and it's ready to start getting the file data if (!sendIcmpResponse(dev, dev->getMacAddress(), ethLayer->getSourceMac(), icmpFTStart->catcherIPAddr, icmpFTStart->pitcherIPAddr, icmpId, ICMP_FT_ACK, nullptr, 0)) + { EXIT_WITH_ERROR("Cannot send ACK message to pitcher"); + } // set the current ICMP ID. It's important for the catcher to keep track of the ICMP ID to make sure it doesn't miss // any message @@ -124,23 +136,31 @@ static bool getFileContent(pcpp::RawPacket* rawPacket, pcpp::PcapLiveDevice* dev // verify it's ICMP and IPv4 (IPv6 and ICMPv6 are not supported) if (!parsedPacket.isPacketOfType(pcpp::ICMP) || !parsedPacket.isPacketOfType(pcpp::IPv4)) + { return false; + } if (icmpVoidData == nullptr) + { return false; + } IcmpFileContentDataRecv* icmpData = (IcmpFileContentDataRecv*)icmpVoidData; // extract the ICMP layer, verify it's an ICMP request pcpp::IcmpLayer* icmpLayer = parsedPacket.getLayerOfType(); if (icmpLayer->getEchoRequestData() == nullptr) + { return false; + } // verify the source IP is the pitcher's IP and the dest IP is the catcher's IP pcpp::IPv4Layer* ip4Layer = parsedPacket.getLayerOfType(); if (ip4Layer->getSrcIPv4Address() != icmpData->pitcherIPAddr || ip4Layer->getDstIPv4Address() != icmpData->catcherIPAddr) + { return false; + } // extract message type from the ICMP request. Message type is written in ICMP request timestamp field uint64_t resMsg = icmpLayer->getEchoRequestData()->header->timestamp; @@ -156,12 +176,16 @@ static bool getFileContent(pcpp::RawPacket* rawPacket, pcpp::PcapLiveDevice* dev // if message type is not ICMP_FT_END not ICMP_FT_DATA - do nothing, it's probably an ICMP request not relevant for // this file transfer else if (resMsg != ICMP_FT_DATA) + { return false; + } // compare the ICMP ID of the request to the ICMP ID we expect to see. If it's smaller than expected it means // catcher already saw this message so it can be ignored if (pcpp::netToHost16(icmpLayer->getEchoRequestData()->header->id) < icmpData->expectedIcmpId) + { return false; + } // if ICMP ID is bigger than expected it probably means catcher missed one or more packets. Since a reliability // mechanism isn't currently implemented in this program, the only thing left to do is to exit the program with an @@ -205,16 +229,22 @@ void receiveFile(pcpp::IPv4Address pitcherIP, pcpp::IPv4Address catcherIP) // identify the interface to listen and send packets to pcpp::PcapLiveDevice* dev = pcpp::PcapLiveDeviceList::getInstance().getDeviceByIp(catcherIP); if (dev == nullptr) + { EXIT_WITH_ERROR("Cannot find network interface with IP '" << catcherIP << "'"); + } // try to open the interface (device) if (!dev->open()) + { EXIT_WITH_ERROR("Cannot open network interface"); + } // set an ICMP protocol filter so it'll capture only ICMP packets pcpp::ProtoFilter protocolFilter(pcpp::ICMP); if (!dev->setFilter(protocolFilter)) + { EXIT_WITH_ERROR("Can't set ICMP filter on device"); + } std::cout << "Waiting for pitcher to send a file..." << std::endl; @@ -223,7 +253,9 @@ void receiveFile(pcpp::IPv4Address pitcherIP, pcpp::IPv4Address catcherIP) // wait until the pitcher sends an ICMP request with the file name in its data int res = dev->startCaptureBlockingMode(waitForFileTransferStart, &icmpFTStart, -1); if (!res) + { EXIT_WITH_ERROR("Cannot start capturing packets"); + } // create a new file with the name provided by the pitcher std::ofstream file(icmpFTStart.fileName.c_str(), std::ios::out | std::ios::binary); @@ -251,7 +283,9 @@ void receiveFile(pcpp::IPv4Address pitcherIP, pcpp::IPv4Address catcherIP) << "[received " << icmpFileContentData.fileSize << " bytes]" << std::endl; } else + { EXIT_WITH_ERROR("Cannot create file"); + } // remove the filter and close the device (interface) dev->clearFilter(); @@ -270,30 +304,40 @@ static bool startFileTransfer(pcpp::RawPacket* rawPacket, pcpp::PcapLiveDevice* // verify it's ICMP and IPv4 (IPv6 and ICMPv6 are not supported) if (!parsedPacket.isPacketOfType(pcpp::ICMP) || !parsedPacket.isPacketOfType(pcpp::IPv4)) + { return false; + } if (icmpVoidData == nullptr) + { return false; + } IcmpFileTransferStart* icmpFTStart = (IcmpFileTransferStart*)icmpVoidData; // extract the ICMP layer, verify it's an ICMP request pcpp::IcmpLayer* icmpLayer = parsedPacket.getLayerOfType(); if (icmpLayer->getEchoRequestData() == nullptr) + { return false; + } // verify the source IP is the pitcher's IP and the dest IP is the catcher's IP pcpp::IPv4Layer* ip4Layer = parsedPacket.getLayerOfType(); if (ip4Layer->getSrcIPv4Address() != icmpFTStart->pitcherIPAddr || ip4Layer->getDstIPv4Address() != icmpFTStart->catcherIPAddr) + { return false; + } // check the ICMP timestamp field which contains the type of message delivered between pitcher and catcher // in this case the catcher is waiting for a keep-alive message from the pitcher which is of type // ICMP_FT_WAITING_FT_START uint64_t resMsg = icmpLayer->getEchoRequestData()->header->timestamp; if (resMsg != ICMP_FT_WAITING_FT_START) + { return false; + } // extract ethernet layer and ICMP ID to be able to respond to the pitcher pcpp::EthLayer* ethLayer = parsedPacket.getLayerOfType(); @@ -303,7 +347,9 @@ static bool startFileTransfer(pcpp::RawPacket* rawPacket, pcpp::PcapLiveDevice* if (!sendIcmpResponse(dev, dev->getMacAddress(), ethLayer->getSourceMac(), icmpFTStart->catcherIPAddr, icmpFTStart->pitcherIPAddr, icmpId, ICMP_FT_START, (uint8_t*)icmpFTStart->fileName.c_str(), icmpFTStart->fileName.length() + 1)) + { EXIT_WITH_ERROR("Cannot send file transfer start message to pitcher"); + } return true; } @@ -319,34 +365,46 @@ static bool sendContent(pcpp::RawPacket* rawPacket, pcpp::PcapLiveDevice* dev, v // verify it's ICMP and IPv4 (IPv6 and ICMPv6 are not supported) if (!parsedPacket.isPacketOfType(pcpp::ICMP) || !parsedPacket.isPacketOfType(pcpp::IPv4)) + { return false; + } if (icmpVoidData == nullptr) + { return false; + } IcmpFileContentDataSend* icmpFileContentData = (IcmpFileContentDataSend*)icmpVoidData; // extract the ICMP layer, verify it's an ICMP request pcpp::IcmpLayer* icmpLayer = parsedPacket.getLayerOfType(); if (icmpLayer->getEchoRequestData() == nullptr) + { return false; + } // verify the source IP is the pitcher's IP and the dest IP is the catcher's IP pcpp::IPv4Layer* ip4Layer = parsedPacket.getLayerOfType(); if (ip4Layer->getSrcIPv4Address() != icmpFileContentData->pitcherIPAddr || ip4Layer->getDstIPv4Address() != icmpFileContentData->catcherIPAddr) + { return false; + } // check the ICMP timestamp field which contains the type of message delivered between pitcher and catcher uint64_t resMsg = icmpLayer->getEchoRequestData()->header->timestamp; // if the pitcher sent an abort message, exit the program if (resMsg == ICMP_FT_ABORT) + { EXIT_WITH_ERROR("Got an abort message from pitcher. Exiting..."); + } // if it's not an abort message, catcher is only waiting for data messages which are of type ICMP_FT_WAITING_DATA if (resMsg != ICMP_FT_WAITING_DATA) + { return false; + } // extract ethernet layer and ICMP ID to be able to respond to the pitcher pcpp::EthLayer* ethLayer = parsedPacket.getLayerOfType(); @@ -359,7 +417,9 @@ static bool sendContent(pcpp::RawPacket* rawPacket, pcpp::PcapLiveDevice* dev, v // to it if (!sendIcmpResponse(dev, dev->getMacAddress(), ethLayer->getSourceMac(), icmpFileContentData->catcherIPAddr, icmpFileContentData->pitcherIPAddr, icmpId, ICMP_FT_END, nullptr, 0)) + { EXIT_WITH_ERROR("Cannot send file transfer end message to pitcher"); + } // then return true so the sendFile() will stop blocking return true; @@ -373,7 +433,9 @@ static bool sendContent(pcpp::RawPacket* rawPacket, pcpp::PcapLiveDevice* dev, v if (!sendIcmpResponse(dev, dev->getMacAddress(), ethLayer->getSourceMac(), icmpFileContentData->catcherIPAddr, icmpFileContentData->pitcherIPAddr, icmpId, ICMP_FT_DATA, (uint8_t*)icmpFileContentData->memblock, icmpFileContentData->blockSize)) + { EXIT_WITH_ERROR("Cannot send file transfer data message to pitcher"); + } // print a dot ('.') on every 1MB sent icmpFileContentData->MBSent += icmpFileContentData->blockSize; @@ -391,7 +453,9 @@ static bool sendContent(pcpp::RawPacket* rawPacket, pcpp::PcapLiveDevice* dev, v if (!sendIcmpResponse(dev, dev->getMacAddress(), ethLayer->getSourceMac(), icmpFileContentData->catcherIPAddr, icmpFileContentData->pitcherIPAddr, icmpId, ICMP_FT_DATA, (uint8_t*)icmpFileContentData->memblock, icmpFileContentData->file->gcount())) + { EXIT_WITH_ERROR("Cannot send file transfer last data message to pitcher"); + } // set an indication that all file was delivered to the pitcher icmpFileContentData->readingFromFile = false; @@ -418,16 +482,22 @@ void sendFile(const std::string& filePath, pcpp::IPv4Address pitcherIP, pcpp::IP // identify the interface to listen and send packets to pcpp::PcapLiveDevice* dev = pcpp::PcapLiveDeviceList::getInstance().getDeviceByIp(catcherIP); if (dev == nullptr) + { EXIT_WITH_ERROR("Cannot find network interface with IP '" << catcherIP << "'"); + } // try to open the interface (device) if (!dev->open()) + { EXIT_WITH_ERROR("Cannot open network interface"); + } // set an ICMP protocol filter so it'll capture only ICMP packets pcpp::ProtoFilter protocolFilter(pcpp::ICMP); if (!dev->setFilter(protocolFilter)) + { EXIT_WITH_ERROR("Can't set ICMP filter on device"); + } // try the open the file for reading std::ifstream file(filePath.c_str(), std::ios::in | std::ios::binary); @@ -454,7 +524,9 @@ void sendFile(const std::string& filePath, pcpp::IPv4Address pitcherIP, pcpp::IP int res = dev->startCaptureBlockingMode(startFileTransfer, &icmpFTStart, -1); // if an error occurred if (!res) + { EXIT_WITH_ERROR("Cannot start capturing packets"); + } std::cout << "Sending file '" << fileName << "' "; @@ -473,7 +545,9 @@ void sendFile(const std::string& filePath, pcpp::IPv4Address pitcherIP, pcpp::IP // if capture failed, exit the program if (!res) + { EXIT_WITH_ERROR("Cannot start capturing packets"); + } std::cout << std::endl << std::endl @@ -481,7 +555,9 @@ void sendFile(const std::string& filePath, pcpp::IPv4Address pitcherIP, pcpp::IP << "[sent " << fileSize << " bytes]" << std::endl; } else // if file couldn't be opened + { EXIT_WITH_ERROR("Cannot open file '" << filePath << "'"); + } // close the device dev->close(); @@ -511,8 +587,12 @@ int main(int argc, char* argv[]) // send a file to the pitcher if (sender) + { sendFile(fileNameToSend, pitcherIP, catcherIP, blockSize); + } // receive a file from the pitcher else if (receiver) + { receiveFile(pitcherIP, catcherIP); + } } diff --git a/Examples/IcmpFileTransfer/IcmpFileTransfer-pitcher.cpp b/Examples/IcmpFileTransfer/IcmpFileTransfer-pitcher.cpp index 1aec9c6856..d06d4c13ec 100644 --- a/Examples/IcmpFileTransfer/IcmpFileTransfer-pitcher.cpp +++ b/Examples/IcmpFileTransfer/IcmpFileTransfer-pitcher.cpp @@ -97,32 +97,44 @@ static void waitForFileTransferStart(pcpp::RawPacket* rawPacket, pcpp::PcapLiveD // verify it's ICMP and IPv4 (IPv6 and ICMPv6 are not supported) if (!parsedPacket.isPacketOfType(pcpp::ICMP) || !parsedPacket.isPacketOfType(pcpp::IPv4)) + { return; + } if (icmpVoidData == nullptr) + { return; + } IcmpFileTransferStartRecv* icmpFTStart = (IcmpFileTransferStartRecv*)icmpVoidData; // extract the ICMP layer, verify it's an ICMP reply pcpp::IcmpLayer* icmpLayer = parsedPacket.getLayerOfType(); if (icmpLayer->getEchoReplyData() == nullptr) + { return; + } // verify the source IP is the catcher's IP and the dest IP is the pitcher's IP pcpp::IPv4Layer* ip4Layer = parsedPacket.getLayerOfType(); if (ip4Layer->getSrcIPv4Address() != icmpFTStart->catcherIPAddr || ip4Layer->getDstIPv4Address() != icmpFTStart->pitcherIPAddr) + { return; + } // extract the message type in the ICMP reply timestamp field and check if it's ICMP_FT_START uint64_t resMsg = icmpLayer->getEchoReplyData()->header->timestamp; if (resMsg != ICMP_FT_START) + { return; + } // verify there is data in the ICMP reply if (icmpLayer->getEchoReplyData()->data == nullptr) + { return; + } // extract the file name from the ICMP reply data icmpFTStart->fileName = std::string((char*)icmpLayer->getEchoReplyData()->data); @@ -142,23 +154,31 @@ static void getFileContent(pcpp::RawPacket* rawPacket, pcpp::PcapLiveDevice* dev // verify it's ICMP and IPv4 (IPv6 and ICMPv6 are not supported) if (!parsedPacket.isPacketOfType(pcpp::ICMP) || !parsedPacket.isPacketOfType(pcpp::IPv4)) + { return; + } if (icmpVoidData == nullptr) + { return; + } IcmpFileContentData* icmpFileContentData = (IcmpFileContentData*)icmpVoidData; // extract the ICMP layer, verify it's an ICMP reply pcpp::IcmpLayer* icmpLayer = parsedPacket.getLayerOfType(); if (icmpLayer->getEchoReplyData() == nullptr) + { return; + } // verify the source IP is the catcher's IP and the dest IP is the pitcher's IP pcpp::IPv4Layer* ip4Layer = parsedPacket.getLayerOfType(); if (ip4Layer->getSrcIPv4Address() != icmpFileContentData->catcherIPAddr || ip4Layer->getDstIPv4Address() != icmpFileContentData->pitcherIPAddr) + { return; + } // extract the message type from the ICMP reply timestamp field uint64_t resMsg = icmpLayer->getEchoReplyData()->header->timestamp; @@ -175,7 +195,9 @@ static void getFileContent(pcpp::RawPacket* rawPacket, pcpp::PcapLiveDevice* dev // if message type isn't ICMP_FT_END and ICMP_FT_DATA, ignore it if (resMsg != ICMP_FT_DATA) + { return; + } // if got to here it means it's an ICMP_FT_DATA message @@ -194,7 +216,9 @@ static void getFileContent(pcpp::RawPacket* rawPacket, pcpp::PcapLiveDevice* dev // verify the ICMP reply has data if (icmpLayer->getEchoReplyData()->data == nullptr) + { return; + } // increment the expected ICMP ID icmpFileContentData->expectedIcmpId++; @@ -223,23 +247,31 @@ void receiveFile(pcpp::IPv4Address pitcherIP, pcpp::IPv4Address catcherIP, int p // identify the interface to listen and send packets to pcpp::PcapLiveDevice* dev = pcpp::PcapLiveDeviceList::getInstance().getDeviceByIp(pitcherIP); if (dev == nullptr) + { EXIT_WITH_ERROR("Cannot find network interface with IP '" << pitcherIP << "'"); + } // try to open the interface (device) if (!dev->open()) + { EXIT_WITH_ERROR("Cannot open network interface "); + } // get the MAC address of the interface pcpp::MacAddress pitcherMacAddr = dev->getMacAddress(); if (pitcherMacAddr == pcpp::MacAddress::Zero) + { EXIT_WITH_ERROR("Cannot find pitcher MAC address"); + } // discover the MAC address of the catcher by sending an ARP ping to it double arpResTO = 0; pcpp::MacAddress catcherMacAddr = pcpp::NetworkUtils::getInstance().getMacAddress(catcherIP, dev, arpResTO, pitcherMacAddr, pitcherIP, 10); if (catcherMacAddr == pcpp::MacAddress::Zero) + { EXIT_WITH_ERROR("Cannot find catcher MAC address"); + } uint16_t icmpId = 1; @@ -250,7 +282,9 @@ void receiveFile(pcpp::IPv4Address pitcherIP, pcpp::IPv4Address catcherIP, int p // set an ICMP protocol filter so it'll capture only ICMP packets pcpp::ProtoFilter protocolFilter(pcpp::ICMP); if (!dev->setFilter(protocolFilter)) + { EXIT_WITH_ERROR("Can't set ICMP filter on device"); + } // since it's the pitcher's job to send ICMP requests and the catcher's job to get them and send ICMP replies, // sending a file from the catcher to the pitcher is a bit more complicated @@ -260,7 +294,9 @@ void receiveFile(pcpp::IPv4Address pitcherIP, pcpp::IPv4Address catcherIP, int p // start capturing ICMP packets. The waitForFileTransferStart callback should look for the catcher reply and set // icmpFTStart.gotFileTransferStartMsg to true if (!dev->startCapture(waitForFileTransferStart, &icmpFTStart)) + { EXIT_WITH_ERROR("Cannot start capturing packets"); + } // while didn't receive response from the catcher, keep sending the ICMP_FT_WAITING_FT_START message while (!icmpFTStart.gotFileTransferStartMsg) @@ -295,7 +331,9 @@ void receiveFile(pcpp::IPv4Address pitcherIP, pcpp::IPv4Address catcherIP, int p // we use sleep instead uint32_t sleepBetweenPackets = 0; if (packetPerSec > 1) + { sleepBetweenPackets = (uint32_t)(1000000UL / packetPerSec); + } // start capturing ICMP packets. The getFileContent callback should look for the catcher replies containing data // chunks of the file and write them to the opened file. When catcher signals the end of the file transfer, the @@ -316,9 +354,13 @@ void receiveFile(pcpp::IPv4Address pitcherIP, pcpp::IPv4Address catcherIP, int p // if rate limit was set by the user, sleep between sending packets if (packetPerSec > 1) + { std::this_thread::sleep_for(std::chrono::microseconds(sleepBetweenPackets)); + } else if (packetPerSec == 1) + { std::this_thread::sleep_for(std::chrono::seconds(1)); + } icmpId++; } @@ -349,7 +391,9 @@ void receiveFile(pcpp::IPv4Address pitcherIP, pcpp::IPv4Address catcherIP, int p << "[received " << icmpFileContentData.fileSize << " bytes]" << std::endl; } else + { EXIT_WITH_ERROR("Cannot create file"); + } // close the device dev->close(); @@ -366,32 +410,44 @@ static bool waitForFileTransferStartAck(pcpp::RawPacket* rawPacket, pcpp::PcapLi // verify it's ICMP and IPv4 (IPv6 and ICMPv6 are not supported) if (!parsedPacket.isPacketOfType(pcpp::ICMP) || !parsedPacket.isPacketOfType(pcpp::IPv4)) + { return false; + } if (icmpVoidData == nullptr) + { return false; + } IcmpFileTransferStartSend* icmpData = (IcmpFileTransferStartSend*)icmpVoidData; // extract the ICMP layer, verify it's an ICMP reply pcpp::IcmpLayer* icmpLayer = parsedPacket.getLayerOfType(); if (icmpLayer->getEchoReplyData() == nullptr) + { return false; + } // verify the ICMP ID of the reply matched the ICMP ID the pitcher sent in the request if (icmpLayer->getEchoReplyData()->header->id != pcpp::hostToNet16(icmpData->icmpMsgId)) + { return false; + } // verify the source IP is the catcher's IP and the dest IP is the pitcher's IP pcpp::IPv4Layer* ip4Layer = parsedPacket.getLayerOfType(); if (ip4Layer->getSrcIPv4Address() != icmpData->catcherIPAddr || ip4Layer->getDstIPv4Address() != icmpData->pitcherIPAddr) + { return false; + } // verify the message type is ICMP_FT_ACK uint64_t resMsg = icmpLayer->getEchoReplyData()->header->timestamp; if (resMsg != ICMP_FT_ACK) + { return false; + } // if arrived to here it means we got a response from the catcher and it's ready for file transfer to start return true; @@ -406,23 +462,31 @@ void sendFile(const std::string& filePath, pcpp::IPv4Address pitcherIP, pcpp::IP // identify the interface to listen and send packets to pcpp::PcapLiveDevice* dev = pcpp::PcapLiveDeviceList::getInstance().getDeviceByIp(pitcherIP); if (dev == nullptr) + { EXIT_WITH_ERROR("Cannot find network interface with IP '" << pitcherIP << "'"); + } // try to open the interface (device) if (!dev->open()) + { EXIT_WITH_ERROR("Cannot open network interface "); + } // get the MAC address of the interface pcpp::MacAddress pitcherMacAddr = dev->getMacAddress(); if (pitcherMacAddr == pcpp::MacAddress::Zero) + { EXIT_WITH_ERROR("Cannot find pitcher MAC address"); + } // discover the MAC address of the catcher by sending an ARP ping to it double arpResTO = 0; pcpp::MacAddress catcherMacAddr = pcpp::NetworkUtils::getInstance().getMacAddress(catcherIP, dev, arpResTO, pitcherMacAddr, pitcherIP, 10); if (catcherMacAddr == pcpp::MacAddress::Zero) + { EXIT_WITH_ERROR("Cannot find catcher MAC address"); + } // create a buffer that will be used to send data chunks of the file uint8_t* memblock = new uint8_t[blockSize]; @@ -457,18 +521,24 @@ void sendFile(const std::string& filePath, pcpp::IPv4Address pitcherIP, pcpp::IP // with an ICMP_FT_ACK message in the timestamp field if (!sendIcmpRequest(dev, pitcherMacAddr, catcherMacAddr, pitcherIP, catcherIP, icmpId, ICMP_FT_START, memblock, fileName.length() + 1)) + { EXIT_WITH_ERROR("Cannot send file transfer start message"); + } // now wait for the catcher to answer. The timeout is SEND_TIMEOUT_BEFORE_FT_START. After that another ICMP // request will be sent int res = dev->startCaptureBlockingMode(waitForFileTransferStartAck, &ftStartData, SEND_TIMEOUT_BEFORE_FT_START); if (!res) + { EXIT_WITH_ERROR("Cannot start capturing packets"); + } // res == 1 means we got the catcher response so we can break the endless loop if (res == 1) + { break; + } // increase ICMP ID so we won't send the same ICMP ID again icmpId++; @@ -488,7 +558,9 @@ void sendFile(const std::string& filePath, pcpp::IPv4Address pitcherIP, pcpp::IP // sleeping for 1 second and in this case we can't use usleep (as it's not working for 1 sec or more) and we use // sleep instead if (packetPerSec > 1) + { sleepBetweenPackets = (uint32_t)(1000000UL / packetPerSec); + } // read one chunk of the file and send it to catcher. This loop breaks when it is reaching the end of the file // and can't read a block of size blockSize from the file @@ -498,13 +570,19 @@ void sendFile(const std::string& filePath, pcpp::IPv4Address pitcherIP, pcpp::IP // field) is ICMP_FT_DATA so the catcher knows it's a data chunk if (!sendIcmpRequest(dev, pitcherMacAddr, catcherMacAddr, pitcherIP, catcherIP, icmpId, ICMP_FT_DATA, memblock, blockSize)) + { EXIT_WITH_ERROR("Cannot send file data message"); + } // use usleep or sleep (see comment a few lines below) if (packetPerSec > 1) + { std::this_thread::sleep_for(std::chrono::microseconds(sleepBetweenPackets)); + } else if (packetPerSec == 1) + { std::this_thread::sleep_for(std::chrono::seconds(1)); + } bytesSentSoFar += blockSize; @@ -525,7 +603,9 @@ void sendFile(const std::string& filePath, pcpp::IPv4Address pitcherIP, pcpp::IP { if (!sendIcmpRequest(dev, pitcherMacAddr, catcherMacAddr, pitcherIP, catcherIP, icmpId, ICMP_FT_DATA, memblock, file.gcount())) + { EXIT_WITH_ERROR("Cannot send file data message"); + } bytesSentSoFar += file.gcount(); std::cout << "."; @@ -535,7 +615,9 @@ void sendFile(const std::string& filePath, pcpp::IPv4Address pitcherIP, pcpp::IP // field) to the catcher to indicate all file was sent if (!sendIcmpRequest(dev, pitcherMacAddr, catcherMacAddr, pitcherIP, catcherIP, icmpId, ICMP_FT_END, nullptr, 0)) + { EXIT_WITH_ERROR("Cannot send file transfer end message"); + } std::cout << std::endl << std::endl @@ -543,7 +625,9 @@ void sendFile(const std::string& filePath, pcpp::IPv4Address pitcherIP, pcpp::IP << "[sent " << bytesSentSoFar << " bytes]" << std::endl; } else + { EXIT_WITH_ERROR("Cannot open file '" << filePath << "'"); + } // close the file and the device. Free the memory for memblock file.close(); @@ -575,8 +659,12 @@ int main(int argc, char* argv[]) // send a file to the catcher if (sender) + { sendFile(fileNameToSend, pitcherIP, catcherIP, blockSize, packetsPerSec); + } // receive a file from the catcher else if (receiver) + { receiveFile(pitcherIP, catcherIP, packetsPerSec); + } } diff --git a/Examples/KniPong/main.cpp b/Examples/KniPong/main.cpp index beb5f89e97..dc5ab31685 100644 --- a/Examples/KniPong/main.cpp +++ b/Examples/KniPong/main.cpp @@ -164,7 +164,9 @@ namespace } // Default name for KNI device: if (args.kniName.empty()) + { args.kniName = DEFAULT_KNI_NAME; + } if (args.kniIp.empty()) { printUsage(); @@ -279,7 +281,9 @@ namespace pcpp::CoreMask cm = 0x3; bool dpdkInitSuccess = pcpp::DpdkDeviceList::initDpdk(cm, 1023); if (!dpdkInitSuccess) + { EXIT_WITH_ERROR("Failed to init DPDK"); + } } pcpp::IPv4Address kniIp = args.kniIp; // Setup device config @@ -298,23 +302,37 @@ namespace devConfig.bindKthread = false; pcpp::KniDeviceList& kniDeviceList = pcpp::KniDeviceList::getInstance(); if (!kniDeviceList.isInitialized()) + { EXIT_WITH_ERROR("Can't initialize KNI device list"); + } device = kniDeviceList.createDevice(devConfig, 1024); if (device == nullptr) + { EXIT_WITH_ERROR("Can't create KNI device"); + } // Check KNI device and start request thread if (!device->isInitialized()) + { EXIT_WITH_ERROR("KNI device was not initialized correctly"); + } if (!device->open()) + { EXIT_WITH_ERROR("Could not open KNI device"); + } if (!device->startRequestHandlerThread(0, 500000000)) + { EXIT_WITH_ERROR("Could not start KNI device request handler thread"); + } // Assign IP if (!setKniIp(kniIp, args.kniName)) + { EXIT_WITH_ERROR("Can't set KNI device IP"); + } // Turn device on for Linux Kernel if (!device->setLinkState(pcpp::KniDevice::LINK_UP)) + { EXIT_WITH_ERROR("Can't set KNI device link state to UP"); + } return device; } @@ -404,12 +422,16 @@ namespace ipLayer = packet.getLayerOfType(); if (ipLayer == nullptr) // Some invalid packet + { return false; + } pcpp::iphdr ipHdr; pcpp::iphdr* origIpHdr = ipLayer->getIPv4Header(); std::memcpy(&ipHdr, origIpHdr, sizeof(ipHdr)); if (pcpp::netToHost16(ipHdr.fragmentOffset) & 0x1FFF) // Fragmented packet + { return false; + } // Swap src and dst IPs std::memcpy(&ipHdr.ipSrc, &origIpHdr->ipDst, sizeof(ipHdr.ipSrc)); std::memcpy(&ipHdr.ipDst, &origIpHdr->ipSrc, sizeof(ipHdr.ipDst)); @@ -453,7 +475,9 @@ namespace processArp(packet, arpLayer); // Packet is ready to be sent -> have no fields to recalculate if (!kni->sendPacket(packet)) + { ++packetStats->arpPacketsOutFail; + } arpLayer = nullptr; continue; } @@ -463,7 +487,9 @@ namespace ++packetStats->udpPacketsIn; //! Warning (echo-Mike): DO NOT normalize next logic statement it relays on short circuiting if (!processUdp(packet, udpLayer) || !kni->sendPacket(packet)) + { ++packetStats->udpPacketsOutFail; + } udpLayer = nullptr; continue; } @@ -502,9 +528,13 @@ namespace n = read(fd, buff + buffPos, num); if (n == -1 && (errno == EAGAIN || errno == EINTR)) + { n = WANT_POLLIN; + } if (n <= 0) + { return n; + } buffPos += n; return n; } @@ -519,13 +549,19 @@ namespace n = write(fd, buff, buffPos); if (n == -1 && (errno == EAGAIN || errno == EINTR)) + { n = WANT_POLLOUT; + } if (n <= 0) + { return n; + } /* adjust buffer */ adjust = buffPos - n; if (adjust > 0) + { std::memmove(buff, buff + n, adjust); + } buffPos -= n; return n; } @@ -576,7 +612,9 @@ namespace } /* both outputs are gone, we can't continue */ if (pfd[POLL_NETOUT].fd == -1 && pfd[POLL_STDOUT].fd == -1) + { return; + } /* poll */ int num_fds = poll(pfd, 4, DEFAULT_POLL_TIMEOUT); @@ -625,15 +663,21 @@ namespace } /* if HUP, stop watching stdout */ if (pfd[POLL_STDOUT].revents & POLLHUP) + { pfd[POLL_STDOUT].fd = -1; + } /* if no net out, stop watching stdin */ if (pfd[POLL_NETOUT].fd == -1) + { pfd[POLL_STDIN].fd = -1; + } /* if no stdout, stop watching net in */ if (pfd[POLL_STDOUT].fd == -1) { if (pfd[POLL_NETIN].fd != -1) + { shutdown(pfd[POLL_NETIN].fd, SHUT_RD); + } pfd[POLL_NETIN].fd = -1; } @@ -642,39 +686,59 @@ namespace { ret = fillbuf(pfd[POLL_STDIN].fd, ttybuff, ttybuffPos); if (ret == WANT_POLLIN) + { pfd[POLL_STDIN].events = POLLIN; + } else if (ret == 0 || ret == -1) + { pfd[POLL_STDIN].fd = -1; + } /* read something - poll net out */ if (ttybuffPos > 0) + { pfd[POLL_NETOUT].events = POLLOUT; + } /* filled buffer - remove self from polling */ if (ttybuffPos == IO_BUFF_SIZE) + { pfd[POLL_STDIN].events = 0; + } } /* try to write to network */ if (pfd[POLL_NETOUT].revents & POLLOUT && ttybuffPos > 0) { ret = drainbuf(pfd[POLL_NETOUT].fd, ttybuff, ttybuffPos); if (ret == WANT_POLLOUT) + { pfd[POLL_NETOUT].events = POLLOUT; + } else if (ret == -1) + { pfd[POLL_NETOUT].fd = -1; + } /* buffer empty - remove self from polling */ if (ttybuffPos == 0) + { pfd[POLL_NETOUT].events = 0; + } /* buffer no longer full - poll stdin again */ if (ttybuffPos < IO_BUFF_SIZE) + { pfd[POLL_STDIN].events = POLLIN; + } } /* try to read from network */ if (pfd[POLL_NETIN].revents & POLLIN && netbuffPos < IO_BUFF_SIZE) { ret = fillbuf(pfd[POLL_NETIN].fd, netbuff, netbuffPos); if (ret == WANT_POLLIN) + { pfd[POLL_NETIN].events = POLLIN; + } else if (ret == -1) + { pfd[POLL_NETIN].fd = -1; + } /* eof on net in - remove from pfd */ if (ret == 0) { @@ -683,25 +747,37 @@ namespace } /* read something - poll stdout */ if (netbuffPos > 0) + { pfd[POLL_STDOUT].events = POLLOUT; + } /* filled buffer - remove self from polling */ if (netbuffPos == IO_BUFF_SIZE) + { pfd[POLL_NETIN].events = 0; + } } /* try to write to stdout */ if (pfd[POLL_STDOUT].revents & POLLOUT && netbuffPos > 0) { ret = drainbuf(pfd[POLL_STDOUT].fd, netbuff, netbuffPos); if (ret == WANT_POLLOUT) + { pfd[POLL_STDOUT].events = POLLOUT; + } else if (ret == -1) + { pfd[POLL_STDOUT].fd = -1; + } /* buffer empty - remove self from polling */ if (netbuffPos == 0) + { pfd[POLL_STDOUT].events = 0; + } /* buffer no longer full - poll net in again */ if (netbuffPos < IO_BUFF_SIZE) + { pfd[POLL_NETIN].events = POLLIN; + } } /* stdin gone and queue empty? */ diff --git a/Examples/PcapPlusPlus-benchmark/benchmark.cpp b/Examples/PcapPlusPlus-benchmark/benchmark.cpp index 96c77ca63f..f6fd3a0da5 100644 --- a/Examples/PcapPlusPlus-benchmark/benchmark.cpp +++ b/Examples/PcapPlusPlus-benchmark/benchmark.cpp @@ -30,7 +30,9 @@ size_t count = 0; bool handle_dns(Packet& packet) { if (!packet.isPacketOfType(DNS)) + { return true; + } DnsLayer* dnsLayer = packet.getLayerOfType(); diff --git a/Examples/PcapPrinter/main.cpp b/Examples/PcapPrinter/main.cpp index e1d9d7a8f5..288dfa8e17 100644 --- a/Examples/PcapPrinter/main.cpp +++ b/Examples/PcapPrinter/main.cpp @@ -76,15 +76,25 @@ std::string linkLayerToString(pcpp::LinkLayerType linkLayer) { if (linkLayer == pcpp::LINKTYPE_ETHERNET) + { return "Ethernet"; + } if (linkLayer == pcpp::LINKTYPE_IEEE802_5) + { return "IEEE 802.5 Token Ring"; + } else if (linkLayer == pcpp::LINKTYPE_LINUX_SLL) + { return "Linux cooked capture"; + } else if (linkLayer == pcpp::LINKTYPE_LINUX_SLL2) + { return "Linux cooked capture v2"; + } else if (linkLayer == pcpp::LINKTYPE_NULL) + { return "Null/Loopback"; + } else if (linkLayer == pcpp::LINKTYPE_RAW || linkLayer == pcpp::LINKTYPE_DLT_RAW1 || linkLayer == pcpp::LINKTYPE_DLT_RAW2) { @@ -125,16 +135,24 @@ std::string printFileSummary(pcpp::IFileReaderDevice* reader) { pcpp::PcapNgFileReaderDevice* pcapNgReader = dynamic_cast(reader); if (pcapNgReader->getOS() != "") + { stream << " OS: " << pcapNgReader->getOS() << std::endl; + } if (pcapNgReader->getCaptureApplication() != "") + { stream << " Capture application: " << pcapNgReader->getCaptureApplication() << std::endl; + } if (pcapNgReader->getCaptureFileComment() != "") + { stream << " File comment: " << pcapNgReader->getCaptureFileComment() << std::endl; + } if (pcapNgReader->getHardware() != "") + { stream << " Capture hardware: " << pcapNgReader->getHardware() << std::endl; + } } stream << std::endl; @@ -178,7 +196,9 @@ int printPcapNgPackets(pcpp::PcapNgFileReaderDevice* reader, std::ostream* out, { // print packet comment if exists if (packetComment != "") + { (*out) << "Packet Comment: " << packetComment << std::endl; + } // parse the raw packet into a parsed packet pcpp::Packet parsedPacket(&rawPacket); diff --git a/Examples/PcapSearch/main.cpp b/Examples/PcapSearch/main.cpp index f1af7e64d5..e6a85d0f43 100644 --- a/Examples/PcapSearch/main.cpp +++ b/Examples/PcapSearch/main.cpp @@ -176,7 +176,9 @@ int searchPcap(const std::string& pcapFilePath, std::string searchCriteria, std: std::vector packetLayers; parsedPacket.toStringList(packetLayers); for (const auto& layer : packetLayers) + { (*detailedReportFile) << "\n " << layer; + } (*detailedReportFile) << std::endl; } @@ -191,7 +193,9 @@ int searchPcap(const std::string& pcapFilePath, std::string searchCriteria, std: if (detailedReportFile != nullptr) { if (packetCount > 0) + { (*detailedReportFile) << "\n"; + } (*detailedReportFile) << " ----> Found " << packetCount << " packets" << std::endl << std::endl; } @@ -217,7 +221,9 @@ void searchDirectories(const std::string& directory, bool includeSubDirectories, // dir is null usually when user has no access permissions if (dir == nullptr) + { return; + } struct dirent* entry = readdir(dir); @@ -233,7 +239,9 @@ void searchDirectories(const std::string& directory, bool includeSubDirectories, std::string dirSep = DIR_SEPARATOR; if (0 != directory.compare(directory.length() - dirSep.length(), dirSep.length(), dirSep)) // directory doesn't contain separator in the end + { dirPath += DIR_SEPARATOR; + } dirPath += name; struct stat info; @@ -251,7 +259,9 @@ void searchDirectories(const std::string& directory, bool includeSubDirectories, // check if the file extension matches the requested extensions to search. If it does, put the file name in // a list of files that should be searched (don't do the search just yet) if (extensionsToSearch.find(getExtension(name)) != extensionsToSearch.end()) + { pcapList.push_back(dirPath); + } entry = readdir(dir); continue; } @@ -266,8 +276,10 @@ void searchDirectories(const std::string& directory, bool includeSubDirectories, // if we got to here it means the file is actually a directory. If required to search sub-directories, call this // method recursively to search inside this sub-directory if (includeSubDirectories) + { searchDirectories(dirPath, true, searchCriteria, detailedReportFile, extensionsToSearch, totalDirSearched, totalFilesSearched, totalPacketsFound); + } // move to the next file entry = readdir(dir); @@ -349,7 +361,9 @@ int main(int argc, char* argv[]) { // add the extension into the map if it doesn't already exist if (extensionsToSearch.find(extension) == extensionsToSearch.end()) + { extensionsToSearch[extension] = true; + } } // verify list is not empty @@ -425,7 +439,9 @@ int main(int argc, char* argv[]) if (detailedReportFile != nullptr) { if (detailedReportFile->is_open()) + { detailedReportFile->close(); + } delete detailedReportFile; std::cout << "Detailed report written to '" << detailedReportFileName << "'" << std::endl; diff --git a/Examples/PcapSplitter/IPPortSplitters.h b/Examples/PcapSplitter/IPPortSplitters.h index 1493d7571b..68f4a0205e 100644 --- a/Examples/PcapSplitter/IPPortSplitters.h +++ b/Examples/PcapSplitter/IPPortSplitters.h @@ -194,11 +194,17 @@ class IPPortSplitter : public ValueBasedSplitter uint32_t getSrcIPValue(pcpp::Packet& packet) { if (packet.isPacketOfType(pcpp::IPv4)) + { return packet.getLayerOfType()->getSrcIPv4Address().toInt(); + } else if (packet.isPacketOfType(pcpp::IPv6)) + { return pcpp::fnvHash((uint8_t*)packet.getLayerOfType()->getSrcIPv6Address().toBytes(), 16); + } else + { return 0; + } } /** @@ -207,11 +213,17 @@ class IPPortSplitter : public ValueBasedSplitter uint32_t getDstIPValue(pcpp::Packet& packet) { if (packet.isPacketOfType(pcpp::IPv4)) + { return packet.getLayerOfType()->getDstIPv4Address().toInt(); + } else if (packet.isPacketOfType(pcpp::IPv6)) + { return pcpp::fnvHash((uint8_t*)packet.getLayerOfType()->getDstIPv6Address().toBytes(), 16); + } else + { return 0; + } } /** @@ -220,7 +232,9 @@ class IPPortSplitter : public ValueBasedSplitter bool isSrcIPMulticast(pcpp::Packet& packet) { if (packet.isPacketOfType(pcpp::IP)) + { return packet.getLayerOfType()->getSrcIPAddress().isMulticast(); + } return false; } @@ -230,7 +244,9 @@ class IPPortSplitter : public ValueBasedSplitter bool isDstIPMulticast(pcpp::Packet& packet) { if (packet.isPacketOfType(pcpp::IP)) + { return packet.getLayerOfType()->getDstIPAddress().isMulticast(); + } return false; } }; @@ -269,17 +285,27 @@ class ClientIPSplitter : public IPPortSplitter return getDstIPValue(packet); case UDP: if (isSrcIPMulticast(packet)) + { return getSrcIPValue(packet); + } else if (isDstIPMulticast(packet)) + { return getDstIPValue(packet); + } else + { return srcPort >= dstPort ? getSrcIPValue(packet) : getDstIPValue(packet); + } // other TCP packet default: if (srcPort >= dstPort) + { return getSrcIPValue(packet); + } else + { return getDstIPValue(packet); + } } } @@ -295,18 +321,28 @@ class ClientIPSplitter : public IPPortSplitter return prefix + hyphenIP(getDstIPString(packet)); case UDP: if (isSrcIPMulticast(packet)) + { return prefix + hyphenIP(getSrcIPString(packet)); + } else if (isDstIPMulticast(packet)) + { return prefix + hyphenIP(getDstIPString(packet)); + } else + { return srcPort >= dstPort ? prefix + hyphenIP(getSrcIPString(packet)) : prefix + hyphenIP(getDstIPString(packet)); + } // other TCP packet default: if (srcPort >= dstPort) + { return prefix + hyphenIP(getSrcIPString(packet)); + } else + { return prefix + hyphenIP(getDstIPString(packet)); + } } } }; @@ -345,17 +381,27 @@ class ServerIPSplitter : public IPPortSplitter return getSrcIPValue(packet); case UDP: if (isSrcIPMulticast(packet)) + { return getDstIPValue(packet); + } else if (isDstIPMulticast(packet)) + { return getSrcIPValue(packet); + } else + { return srcPort >= dstPort ? getDstIPValue(packet) : getSrcIPValue(packet); + } // other TCP packet default: if (srcPort >= dstPort) + { return getDstIPValue(packet); + } else + { return getSrcIPValue(packet); + } } } @@ -371,18 +417,28 @@ class ServerIPSplitter : public IPPortSplitter return prefix + hyphenIP(getSrcIPString(packet)); case UDP: if (isSrcIPMulticast(packet)) + { return prefix + hyphenIP(getDstIPString(packet)); + } else if (isDstIPMulticast(packet)) + { return prefix + hyphenIP(getSrcIPString(packet)); + } else + { return srcPort >= dstPort ? prefix + hyphenIP(getDstIPString(packet)) : prefix + hyphenIP(getSrcIPString(packet)); + } // other TCP packet default: if (srcPort >= dstPort) + { return prefix + hyphenIP(getDstIPString(packet)); + } else + { return prefix + hyphenIP(getSrcIPString(packet)); + } } } }; @@ -422,11 +478,17 @@ class ServerPortSplitter : public IPPortSplitter return srcPort; case UDP: if (isSrcIPMulticast(packet)) + { return dstPort; + } else if (isDstIPMulticast(packet)) + { return srcPort; + } else + { return std::min(srcPort, dstPort); + } // other TCP packet default: return std::min(srcPort, dstPort); @@ -448,11 +510,17 @@ class ServerPortSplitter : public IPPortSplitter break; case UDP: if (isSrcIPMulticast(packet)) + { res = dstPort; + } else if (isDstIPMulticast(packet)) + { res = srcPort; + } else + { res = std::min(srcPort, dstPort); + } break; // other TCP packet default: @@ -501,11 +569,17 @@ class ClientPortSplitter : public IPPortSplitter return dstPort; case UDP: if (isSrcIPMulticast(packet)) + { return srcPort; + } else if (isDstIPMulticast(packet)) + { return dstPort; + } else + { return std::max(srcPort, dstPort); + } // other TCP packet default: return std::max(srcPort, dstPort); @@ -527,11 +601,17 @@ class ClientPortSplitter : public IPPortSplitter break; case UDP: if (isSrcIPMulticast(packet)) + { res = srcPort; + } else if (isDstIPMulticast(packet)) + { res = dstPort; + } else + { res = std::max(srcPort, dstPort); + } break; // other TCP packet default: diff --git a/Examples/PcapSplitter/SimpleSplitters.h b/Examples/PcapSplitter/SimpleSplitters.h index 4f2c11e170..9a7e2c3cff 100644 --- a/Examples/PcapSplitter/SimpleSplitters.h +++ b/Examples/PcapSplitter/SimpleSplitters.h @@ -37,7 +37,9 @@ class PacketCountSplitter : public Splitter int nextFile = m_PacketCount / m_MaxPacketsPerFile; // if reached packet count limit, close the previous file and return the next file number if (curFile != nextFile) + { filesToClose.push_back(curFile); + } return curFile; } @@ -93,7 +95,9 @@ class FileSizeSplitter : public Splitter int nextFile = m_TotalSize / m_MaxBytesPerFile; // if reached the maximum size per file, close the previous file if (prevFile != nextFile) + { filesToClose.push_back(prevFile); + } return nextFile; } @@ -132,7 +136,9 @@ class BpfCriteriaSplitter : public Splitter int getFileNumber(pcpp::Packet& packet, std::vector& filesToClose) { if (packet.getRawPacket() != nullptr && filter.matches(*packet.getRawPacket())) + { return 0; + } return 1; } @@ -143,9 +149,13 @@ class BpfCriteriaSplitter : public Splitter std::string getFileName(pcpp::Packet& packet, const std::string& outputPcapBasePath, int fileNumber) { if (fileNumber == 0) + { return outputPcapBasePath + "match-bpf"; + } else + { return outputPcapBasePath + "not-match-bpf"; + } } /** @@ -162,7 +172,9 @@ class BpfCriteriaSplitter : public Splitter pcpp::BPFStringFilter localFilter(m_BpfFilter); bool filterValid = localFilter.verifyFilter(); if (!filterValid) + { errorString = "BPF filter is not valid"; + } return filterValid; } diff --git a/Examples/PcapSplitter/Splitters.h b/Examples/PcapSplitter/Splitters.h index c6c43c30a0..f07802f867 100644 --- a/Examples/PcapSplitter/Splitters.h +++ b/Examples/PcapSplitter/Splitters.h @@ -85,7 +85,9 @@ class SplitterWithMaxFiles : public Splitter { int fileToClose; if (m_LRUFileList.put(fileNum, &fileToClose) == 1) + { filesToClose.push_back(fileToClose); + } } /** @@ -101,7 +103,9 @@ class SplitterWithMaxFiles : public Splitter // zero or negative m_MaxFiles means no limit if (m_MaxFiles <= 0) + { nextFile = m_NextFile++; + } else // m_MaxFiles is positive, meaning there is a output file limit { nextFile = (m_NextFile) % m_MaxFiles; @@ -140,7 +144,9 @@ class SplitterWithMaxFiles : public Splitter { // unlimited number of output files if (m_MaxFiles == UNLIMITED_FILES_MAGIC_NUMBER) + { return true; + } if (m_MaxFiles <= 0) { @@ -199,7 +205,9 @@ class ValueBasedSplitter : public SplitterWithMaxFiles std::string getSrcIPString(pcpp::Packet& packet) { if (packet.isPacketOfType(pcpp::IP)) + { return packet.getLayerOfType()->getSrcIPAddress().toString(); + } return "miscellaneous"; } @@ -209,7 +217,9 @@ std::string getSrcIPString(pcpp::Packet& packet) std::string getDstIPString(pcpp::Packet& packet) { if (packet.isPacketOfType(pcpp::IP)) + { return packet.getLayerOfType()->getDstIPAddress().toString(); + } return "miscellaneous"; } diff --git a/Examples/PcapSplitter/main.cpp b/Examples/PcapSplitter/main.cpp index edc20404d2..089b737026 100644 --- a/Examples/PcapSplitter/main.cpp +++ b/Examples/PcapSplitter/main.cpp @@ -188,7 +188,9 @@ std::string getFileNameWithoutExtension(const std::string& path) { // if path is empty, return an empty string if (path == "") + { return ""; + } // find the last "\\" or "/" (depends on the os) - where path ends and filename starts size_t i = path.rfind(SEPARATOR, path.length()); @@ -200,7 +202,9 @@ std::string getFileNameWithoutExtension(const std::string& path) // from the file name - remove the extension (the part after the ".") i = fileNameWithExtension.rfind('.', fileNameWithExtension.length()); if (i != std::string::npos) + { return fileNameWithExtension.substr(0, i); + } return fileNameWithExtension; } @@ -210,7 +214,9 @@ std::string getFileNameWithoutExtension(const std::string& path) // from the file name - remove the extension (the part after the ".") i = path.rfind('.', path.length()); if (i != std::string::npos) + { return path.substr(0, i); + } // filename doesn't have an extension return path; @@ -376,7 +382,9 @@ int main(int argc, char* argv[]) if (filter != "") { if (!reader->setFilter(filter)) + { EXIT_WITH_ERROR("Couldn't set filter '" << filter << "'"); + } } std::cout << "Started..." << std::endl; @@ -423,7 +431,9 @@ int main(int argc, char* argv[]) // open the writer if (!outputFiles[fileNum]->open()) + { break; + } numOfFiles++; } @@ -450,7 +460,9 @@ int main(int argc, char* argv[]) // open the writer in __append__ mode if (!outputFiles[fileNum]->open(true)) + { break; + } } // write the packet to the writer diff --git a/Examples/PfRingExample-FilterTraffic/Common.h b/Examples/PfRingExample-FilterTraffic/Common.h index 0d00e14820..e08d8ec084 100644 --- a/Examples/PfRingExample-FilterTraffic/Common.h +++ b/Examples/PfRingExample-FilterTraffic/Common.h @@ -53,19 +53,33 @@ struct PacketStats { PacketCount++; if (packet.isPacketOfType(pcpp::Ethernet)) + { EthCount++; + } if (packet.isPacketOfType(pcpp::ARP)) + { ArpCount++; + } if (packet.isPacketOfType(pcpp::IPv4)) + { Ip4Count++; + } if (packet.isPacketOfType(pcpp::IPv6)) + { Ip6Count++; + } if (packet.isPacketOfType(pcpp::TCP)) + { TcpCount++; + } if (packet.isPacketOfType(pcpp::UDP)) + { UdpCount++; + } if (packet.isPacketOfType(pcpp::HTTP)) + { HttpCount++; + } } void collectStats(const PacketStats& stats) @@ -104,9 +118,13 @@ struct PacketStats { std::stringstream values; if (ThreadId == MAX_NUM_OF_CORES + 1) + { values << "Total" << delimiter; + } else + { values << (int)ThreadId << delimiter; + } values << PacketCount << delimiter; values << EthCount << delimiter; values << ArpCount << delimiter; diff --git a/Examples/PfRingExample-FilterTraffic/PacketMatchingEngine.h b/Examples/PfRingExample-FilterTraffic/PacketMatchingEngine.h index 64d4b4661c..2d76087eed 100644 --- a/Examples/PfRingExample-FilterTraffic/PacketMatchingEngine.h +++ b/Examples/PfRingExample-FilterTraffic/PacketMatchingEngine.h @@ -28,15 +28,25 @@ class PacketMatchingEngine m_MatchDstIp(false), m_MatchSrcPort(false), m_MatchDstPort(false), m_MatchProtocol(false) { if (m_SrcIpToMatch != pcpp::IPv4Address::Zero) + { m_MatchSrcIp = true; + } if (m_DstIpToMatch != pcpp::IPv4Address::Zero) + { m_MatchDstIp = true; + } if (m_SrcPortToMatch != 0) + { m_MatchSrcPort = true; + } if (m_DstPortToMatch != 0) + { m_MatchDstPort = true; + } if (m_ProtocolToMatch == pcpp::TCP || m_ProtocolToMatch == pcpp::UDP) + { m_MatchProtocol = true; + } } bool isMatched(pcpp::Packet& packet) diff --git a/Examples/PfRingExample-FilterTraffic/main.cpp b/Examples/PfRingExample-FilterTraffic/main.cpp index 7f7583ac9c..4577c9dcf4 100644 --- a/Examples/PfRingExample-FilterTraffic/main.cpp +++ b/Examples/PfRingExample-FilterTraffic/main.cpp @@ -281,7 +281,9 @@ int main(int argc, char* argv[]) std::string ifaceName = std::string(optarg); dev = pcpp::PfRingDeviceList::getInstance().getPfRingDeviceByName(ifaceName); if (dev == nullptr) + { EXIT_WITH_ERROR("Could not find PF_RING device '" << ifaceName << "'"); + } break; } case 's': @@ -289,7 +291,9 @@ int main(int argc, char* argv[]) std::string sendPacketsToIfaceName = std::string(optarg); sendPacketsToIface = pcpp::PfRingDeviceList::getInstance().getPfRingDeviceByName(sendPacketsToIfaceName); if (sendPacketsToIface == nullptr) + { EXIT_WITH_ERROR("Could not find PF_RING device '" << sendPacketsToIfaceName << "'"); + } break; } @@ -297,7 +301,9 @@ int main(int argc, char* argv[]) { numOfCaptureThreads = atoi(optarg); if (numOfCaptureThreads < 1 || numOfCaptureThreads > totalNumOfCores - 1) + { EXIT_WITH_ERROR("Number of capture threads must be in the range of 1 to " << totalNumOfCores - 1); + } break; } case 'f': @@ -305,7 +311,9 @@ int main(int argc, char* argv[]) packetFilePath = std::string(optarg); // make sure the path ends with '/' if (packetFilePath.length() > 1 && (0 != packetFilePath.compare(packetFilePath.length() - 1, 1, "/"))) + { packetFilePath += "/"; + } writePacketsToDisk = true; break; @@ -358,9 +366,13 @@ int main(int argc, char* argv[]) { std::string protocol = std::string(optarg); if (protocol == "TCP") + { protocolToMatch = pcpp::TCP; + } else if (protocol == "UDP") + { protocolToMatch = pcpp::UDP; + } else { EXIT_WITH_ERROR_AND_PRINT_USAGE("Protocol to match isn't TCP or UDP"); @@ -391,17 +403,23 @@ int main(int argc, char* argv[]) } if (dev == nullptr) + { EXIT_WITH_ERROR_AND_PRINT_USAGE("Interface name was not provided"); + } // open the PF_RING device in multi-thread mode. Distribution of packets between threads will be done per-flow (as // opposed to round-robin) if (!dev->openMultiRxChannels(numOfCaptureThreads, pcpp::PfRingDevice::PerFlow)) + { EXIT_WITH_ERROR("Couldn't open " << numOfCaptureThreads << " RX channels on interface '" << dev->getDeviceName() << "'"); + } if (sendPacketsToIface != nullptr && !sendPacketsToIface->open()) + { EXIT_WITH_ERROR("Couldn't open PF_RING device '" << sendPacketsToIface->getDeviceName() << "' for sending matched packets"); + } pcpp::CoreMask coreMask = 0; int threadId = 0; @@ -412,7 +430,9 @@ int main(int argc, char* argv[]) // init each packet stats instance with an illegal core ID for (int coreId = 0; coreId < totalNumOfCores; coreId++) + { packetStatsArr[coreId].ThreadId = MAX_NUM_OF_CORES + 1; + } // mark only relevant cores by adding them to core mask // mark only relevant packet stats instances by setting their core ID @@ -499,7 +519,9 @@ int main(int argc, char* argv[]) for (int coreId = 0; coreId < totalNumOfCores; coreId++) { if ((coreMask & pcpp::SystemCores::IdToSystemCore[coreId].Mask) == 0) + { continue; + } pcapWriters[coreId]->close(); delete pcapWriters[coreId]; @@ -520,7 +542,9 @@ int main(int argc, char* argv[]) for (int i = 0; i < totalNumOfCores; i++) { if (packetStatsArr[i].ThreadId == MAX_NUM_OF_CORES + 1) + { continue; + } aggregatedStats.collectStats(packetStatsArr[i]); printer.printRow(packetStatsArr[i].getStatValuesAsString("|"), '|'); diff --git a/Examples/SSLAnalyzer/SSLStatsCollector.h b/Examples/SSLAnalyzer/SSLStatsCollector.h index c7015baa20..6a07631c73 100644 --- a/Examples/SSLAnalyzer/SSLStatsCollector.h +++ b/Examples/SSLAnalyzer/SSLStatsCollector.h @@ -142,7 +142,9 @@ class SSLStatsCollector { // verify packet is TCP and SSL/TLS if (!sslPacket->isPacketOfType(pcpp::TCP) || !sslPacket->isPacketOfType(pcpp::SSL)) + { return; + } // collect general SSL traffic stats on this packet uint32_t hashVal = collectSSLTrafficStats(sslPacket); @@ -291,9 +293,13 @@ class SSLStatsCollector uint16_t srcPort = tcpLayer->getSrcPort(); uint16_t dstPort = tcpLayer->getDstPort(); if (pcpp::SSLLayer::isSSLPort(srcPort)) + { m_GeneralStats.sslPortCount[srcPort]++; + } else + { m_GeneralStats.sslPortCount[dstPort]++; + } m_FlowTable[hashVal].clear(); } @@ -347,7 +353,9 @@ class SSLStatsCollector { pcpp::SSLHandshakeLayer* handshakeLayer = dynamic_cast(sslLayer); if (handshakeLayer == nullptr) + { continue; + } // try to find client-hello message pcpp::SSLClientHelloMessage* clientHelloMessage = @@ -385,7 +393,9 @@ class SSLStatsCollector pcpp::SSLServerNameIndicationExtension* sniExt = clientHelloMessage->getExtensionOfType(); if (sniExt != nullptr) + { m_ClientHelloStats.serverNameCount[sniExt->getHostName()]++; + } } /** @@ -397,7 +407,9 @@ class SSLStatsCollector pcpp::SSLCipherSuite* cipherSuite = serverHelloMessage->getCipherSuite(); if (cipherSuite != nullptr) + { m_ServerHelloStats.cipherSuiteCount[cipherSuite->asString()]++; + } } double getCurTime(void) diff --git a/Examples/SSLAnalyzer/main.cpp b/Examples/SSLAnalyzer/main.cpp index e22f52d258..6c93a6296c 100644 --- a/Examples/SSLAnalyzer/main.cpp +++ b/Examples/SSLAnalyzer/main.cpp @@ -363,7 +363,9 @@ void analyzeSSLFromPcapFile(const std::string& pcapFileName) std::unique_ptr reader(pcpp::IFileReaderDevice::getReader(pcapFileName)); if (!reader->open()) + { EXIT_WITH_ERROR("Could not open input pcap file"); + } // read the input file packet by packet and give it to the SSLStatsCollector for collecting stats SSLStatsCollector collector; @@ -390,7 +392,9 @@ void analyzeSSLFromLiveTraffic(pcpp::PcapLiveDevice* dev, bool printRatesPeriodi { // open the device if (!dev->open()) + { EXIT_WITH_ERROR("Could not open the device"); + } // set SSL/TLS ports filter on the live device to capture only SSL/TLS packets std::vector portFilterVec; @@ -399,8 +403,12 @@ void analyzeSSLFromLiveTraffic(pcpp::PcapLiveDevice* dev, bool printRatesPeriodi // The check is made for well known ports because currently SSLLayer does not support customizing of ports // considered as SSL/TLS. for (uint16_t port = 0; port < 1024; ++port) + { if (pcpp::SSLLayer::isSSLPort(port)) + { portFilterVec.push_back(new pcpp::PortFilter(port, pcpp::SRC_OR_DST)); + } + } // make an OR filter out of all port filters pcpp::OrFilter orFilter(portFilterVec); @@ -521,7 +529,9 @@ int main(int argc, char* argv[]) // if no interface nor input pcap file were provided - exit with error if (readPacketsFromPcapFileName == "" && interfaceNameOrIP == "") + { EXIT_WITH_ERROR("Neither interface nor input pcap file were provided"); + } // analyze in pcap file mode if (readPacketsFromPcapFileName != "") @@ -533,7 +543,9 @@ int main(int argc, char* argv[]) // extract pcap live device by interface name or IP address pcpp::PcapLiveDevice* dev = pcpp::PcapLiveDeviceList::getInstance().getDeviceByIpOrName(interfaceNameOrIP); if (dev == nullptr) + { EXIT_WITH_ERROR("Couldn't find interface by provided IP address or name"); + } // start capturing and analyzing traffic analyzeSSLFromLiveTraffic(dev, printRatesPeriodically, printRatePeriod, savePacketsToFileName); diff --git a/Examples/TLSFingerprinting/main.cpp b/Examples/TLSFingerprinting/main.cpp index 0d5869853c..ca09c59e46 100644 --- a/Examples/TLSFingerprinting/main.cpp +++ b/Examples/TLSFingerprinting/main.cpp @@ -263,7 +263,9 @@ void printCommonTLSFingerprints(const std::unordered_map& for (auto iter = map2vec.begin(); iter != map2vec.end(); ++iter) { if (iter - map2vec.begin() >= printCountItems) + { break; + } std::stringstream values; values << iter->first << "|" << iter->second; @@ -300,7 +302,9 @@ void printStats(const TLSFingerprintingStats& stats, bool chFP, bool shFP) if (chFP && !stats.chFingerprints.empty()) { if (stats.chFingerprints.size() > 10) + { std::cout << "Top 10 "; + } std::cout << "ClientHello TLS fingerprints:" << std::endl; // write no more than 10 most common TLS fingerprints @@ -312,7 +316,9 @@ void printStats(const TLSFingerprintingStats& stats, bool chFP, bool shFP) if (shFP && !stats.shFingerprints.empty()) { if (stats.shFingerprints.size() > 10) + { std::cout << "Top 10 "; + } std::cout << "ServerHello TLS fingerprints:" << std::endl; // write no more than 10 most common TLS fingerprints @@ -391,7 +397,9 @@ void doTlsFingerprintingOnPcapFile(const std::string& inputPcapFileName, std::st // try to open the file device if (!reader->open()) + { EXIT_WITH_ERROR("Cannot open pcap/pcapng file"); + } // set output file name to input file name if not provided by the user if (outputFileName.empty()) @@ -417,7 +425,9 @@ void doTlsFingerprintingOnPcapFile(const std::string& inputPcapFileName, std::st if (!bpfFilter.empty()) { if (!reader->setFilter(bpfFilter)) + { EXIT_WITH_ERROR("Error in setting BPF filter to the pcap file"); + } } std::cout << "Start reading '" << inputPcapFileName << "'..." << std::endl; @@ -465,10 +475,14 @@ void doTlsFingerprintingOnLiveTraffic(const std::string& interfaceNameOrIP, std: // extract pcap live device by interface name or IP address pcpp::PcapLiveDevice* dev = pcpp::PcapLiveDeviceList::getInstance().getDeviceByIpOrName(interfaceNameOrIP); if (dev == nullptr) + { EXIT_WITH_ERROR("Couldn't find interface by given IP address or name"); + } if (!dev->open()) + { EXIT_WITH_ERROR("Couldn't open interface"); + } // set output file name to interface name if not provided by the user if (outputFileName.empty()) @@ -495,7 +509,9 @@ void doTlsFingerprintingOnLiveTraffic(const std::string& interfaceNameOrIP, std: if (!bpfFilter.empty()) { if (!dev->setFilter(bpfFilter)) + { EXIT_WITH_ERROR("Error in setting BPF filter to interface"); + } } std::cout << "Start capturing packets from '" << interfaceNameOrIP << "'..." << std::endl; @@ -517,7 +533,9 @@ void doTlsFingerprintingOnLiveTraffic(const std::string& interfaceNameOrIP, std: // run in an endless loop until the user press ctrl+c while (!shouldStop) + { std::this_thread::sleep_for(std::chrono::seconds(1)); + } // stop capturing and close the live device dev->stopCapture(); diff --git a/Examples/TcpReassembly/main.cpp b/Examples/TcpReassembly/main.cpp index 15ff571b88..8b98736a80 100644 --- a/Examples/TcpReassembly/main.cpp +++ b/Examples/TcpReassembly/main.cpp @@ -115,7 +115,9 @@ class GlobalConfig // if user chooses to write to a directory other than the current directory - add the dir path to the return // value if (!outputDir.empty()) + { stream << outputDir << SEPARATOR; + } std::string sourceIP = connData.srcIP.toString(); std::string destIP = connData.dstIP.toString(); @@ -126,9 +128,13 @@ class GlobalConfig // side == 0 means data is sent from client->server if (side <= 0 || !useSeparateSides) + { stream << sourceIP << '.' << connData.srcPort << '-' << destIP << '.' << connData.dstPort; + } else // side == 1 means data is sent from server->client + { stream << destIP << '.' << connData.dstPort << '-' << sourceIP << '.' << connData.srcPort; + } // return the file path return stream.str(); @@ -142,13 +148,19 @@ class GlobalConfig { // if the user chooses to write only to console, don't open anything and return std::cout if (writeToConsole) + { return &std::cout; + } // open the file on the disk (with append or overwrite mode) if (reopen) + { return new std::ofstream(fileName.c_str(), std::ios_base::binary | std::ios_base::app); + } else + { return new std::ofstream(fileName.c_str(), std::ios_base::binary); + } } /** @@ -177,7 +189,9 @@ class GlobalConfig // the side of the LRU list is determined by the max number of allowed open files at any point in time. Default // is DEFAULT_MAX_NUMBER_OF_CONCURRENT_OPEN_FILES but the user can choose another number if (m_RecentConnsWithActivity == nullptr) + { m_RecentConnsWithActivity = new pcpp::LRUList(maxOpenFiles); + } // return the pointer return m_RecentConnsWithActivity; @@ -240,10 +254,14 @@ struct TcpReassemblyData { // close files on both sides if open if (fileStreams[0] != nullptr) + { GlobalConfig::getInstance().closeFileSteam(fileStreams[0]); + } if (fileStreams[1] != nullptr) + { GlobalConfig::getInstance().closeFileSteam(fileStreams[1]); + } } /** @@ -362,9 +380,13 @@ static void tcpReassemblyMsgReadyCallback(const int8_t sideIndex, const pcpp::Tc // if the user wants to write each side in a different file - set side as the sideIndex, otherwise write everything // to the same file ("side 0") if (GlobalConfig::getInstance().separateSides) + { side = sideIndex; + } else + { side = 0; + } // if the file stream on the relevant side isn't open yet (meaning it's the first data on this connection) if (flow->second.fileStreams[side] == nullptr) @@ -466,7 +488,9 @@ static void tcpReassemblyConnectionEndCallback(const pcpp::ConnectionData& conne // connection wasn't found - shouldn't get here if (connection == connMgr->end()) + { return; + } // write a metadata file if required by the user if (GlobalConfig::getInstance().writeMetadata) @@ -524,13 +548,17 @@ void doTcpReassemblyOnPcapFile(const std::string& fileName, pcpp::TcpReassembly& // try to open the file device if (!reader->open()) + { EXIT_WITH_ERROR("Cannot open pcap/pcapng file"); + } // set BPF filter if set by the user if (!bpfFilter.empty()) { if (!reader->setFilter(bpfFilter)) + { EXIT_WITH_ERROR("Cannot set BPF filter to pcap file"); + } } std::cout << "Starting reading '" << fileName << "'..." << std::endl; @@ -563,13 +591,17 @@ void doTcpReassemblyOnLiveTraffic(pcpp::PcapLiveDevice* dev, pcpp::TcpReassembly { // try to open device if (!dev->open()) + { EXIT_WITH_ERROR("Cannot open interface"); + } // set BPF filter if set by the user if (!bpfFilter.empty()) { if (!dev->setFilter(bpfFilter)) + { EXIT_WITH_ERROR("Cannot set BPF filter to interface"); + } } std::cout << "Starting packet capture on '" << dev->getIPv4Address() << "'..." << std::endl; @@ -583,7 +615,9 @@ void doTcpReassemblyOnLiveTraffic(pcpp::PcapLiveDevice* dev, pcpp::TcpReassembly // run in an endless loop until the user presses ctrl+c while (!shouldStop) + { std::this_thread::sleep_for(std::chrono::seconds(1)); + } // stop capturing and close the live device dev->stopCapture(); @@ -661,11 +695,15 @@ int main(int argc, char* argv[]) // if no interface nor input pcap file were provided - exit with error if (inputPcapFileName.empty() && interfaceNameOrIP.empty()) + { EXIT_WITH_ERROR("Neither interface nor input pcap file were provided"); + } // verify output dir exists if (!outputDir.empty() && !pcpp::directoryExists(outputDir)) + { EXIT_WITH_ERROR("Output directory doesn't exist"); + } // set global config singleton with input configuration GlobalConfig::getInstance().outputDir = outputDir; @@ -691,7 +729,9 @@ int main(int argc, char* argv[]) // extract pcap live device by interface name or IP address pcpp::PcapLiveDevice* dev = pcpp::PcapLiveDeviceList::getInstance().getDeviceByIpOrName(interfaceNameOrIP); if (dev == nullptr) + { EXIT_WITH_ERROR("Couldn't find interface by provided IP address or name"); + } // start capturing packets and do TCP reassembly doTcpReassemblyOnLiveTraffic(dev, tcpReassembly, bpfFilter); diff --git a/Examples/Tutorials/Tutorial-LiveTraffic/main.cpp b/Examples/Tutorials/Tutorial-LiveTraffic/main.cpp index 5d330e8875..09436bde13 100644 --- a/Examples/Tutorials/Tutorial-LiveTraffic/main.cpp +++ b/Examples/Tutorials/Tutorial-LiveTraffic/main.cpp @@ -35,21 +35,37 @@ struct PacketStats void consumePacket(pcpp::Packet& packet) { if (packet.isPacketOfType(pcpp::Ethernet)) + { ethPacketCount++; + } if (packet.isPacketOfType(pcpp::IPv4)) + { ipv4PacketCount++; + } if (packet.isPacketOfType(pcpp::IPv6)) + { ipv6PacketCount++; + } if (packet.isPacketOfType(pcpp::TCP)) + { tcpPacketCount++; + } if (packet.isPacketOfType(pcpp::UDP)) + { udpPacketCount++; + } if (packet.isPacketOfType(pcpp::DNS)) + { dnsPacketCount++; + } if (packet.isPacketOfType(pcpp::HTTP)) + { httpPacketCount++; + } if (packet.isPacketOfType(pcpp::SSL)) + { sslPacketCount++; + } } /** diff --git a/Examples/Tutorials/Tutorial-PacketParsing/main.cpp b/Examples/Tutorials/Tutorial-PacketParsing/main.cpp index edfbfe1f81..666b6d0b29 100644 --- a/Examples/Tutorials/Tutorial-PacketParsing/main.cpp +++ b/Examples/Tutorials/Tutorial-PacketParsing/main.cpp @@ -31,21 +31,37 @@ std::string printTcpFlags(pcpp::TcpLayer* tcpLayer) std::string result; auto* tcpHeader = tcpLayer->getTcpHeader(); if (tcpHeader->synFlag) + { result += "SYN "; + } if (tcpHeader->ackFlag) + { result += "ACK "; + } if (tcpHeader->pshFlag) + { result += "PSH "; + } if (tcpHeader->cwrFlag) + { result += "CWR "; + } if (tcpHeader->urgFlag) + { result += "URG "; + } if (tcpHeader->eceFlag) + { result += "ECE "; + } if (tcpHeader->rstFlag) + { result += "RST "; + } if (tcpHeader->finFlag) + { result += "FIN "; + } return result; } diff --git a/Examples/XdpExample-FilterTraffic/PacketMatchingEngine.h b/Examples/XdpExample-FilterTraffic/PacketMatchingEngine.h index e5354898ed..3064dd7eb4 100644 --- a/Examples/XdpExample-FilterTraffic/PacketMatchingEngine.h +++ b/Examples/XdpExample-FilterTraffic/PacketMatchingEngine.h @@ -29,15 +29,25 @@ class PacketMatchingEngine m_MatchDstIp(false), m_MatchSrcPort(false), m_MatchDstPort(false), m_MatchProtocol(false) { if (m_SrcIpToMatch != pcpp::IPv4Address::Zero) + { m_MatchSrcIp = true; + } if (m_DstIpToMatch != pcpp::IPv4Address::Zero) + { m_MatchDstIp = true; + } if (m_SrcPortToMatch != 0) + { m_MatchSrcPort = true; + } if (m_DstPortToMatch != 0) + { m_MatchDstPort = true; + } if (m_ProtocolToMatch == pcpp::TCP || m_ProtocolToMatch == pcpp::UDP) + { m_MatchProtocol = true; + } } bool isMatched(pcpp::Packet& packet) diff --git a/Examples/XdpExample-FilterTraffic/main.cpp b/Examples/XdpExample-FilterTraffic/main.cpp index f08b180c44..1b5e72fd2b 100644 --- a/Examples/XdpExample-FilterTraffic/main.cpp +++ b/Examples/XdpExample-FilterTraffic/main.cpp @@ -72,23 +72,41 @@ struct PacketStats { packetCount++; if (packet.isPacketOfType(pcpp::Ethernet)) + { ethCount++; + } if (packet.isPacketOfType(pcpp::ARP)) + { arpCount++; + } if (packet.isPacketOfType(pcpp::IPv4)) + { ip4Count++; + } if (packet.isPacketOfType(pcpp::IPv6)) + { ip6Count++; + } if (packet.isPacketOfType(pcpp::TCP)) + { tcpCount++; + } if (packet.isPacketOfType(pcpp::UDP)) + { udpCount++; + } if (packet.isPacketOfType(pcpp::HTTP)) + { httpCount++; + } if (packet.isPacketOfType(pcpp::DNS)) + { dnsCount++; + } if (packet.isPacketOfType(pcpp::SSL)) + { sslCount++; + } } }; diff --git a/Packet++/header/DhcpLayer.h b/Packet++/header/DhcpLayer.h index 34daea5b8c..c5250dde38 100644 --- a/Packet++/header/DhcpLayer.h +++ b/Packet++/header/DhcpLayer.h @@ -419,7 +419,9 @@ namespace pcpp std::string getValueAsString(int valueOffset = 0) const { if (m_Data == nullptr || m_Data->recordLen - valueOffset < 1) + { return ""; + } return std::string(reinterpret_cast(m_Data->recordValue) + valueOffset, static_cast(m_Data->recordLen) - valueOffset); @@ -438,7 +440,9 @@ namespace pcpp // use the length of input string if a buffer is large enough for whole string if (stringValue.length() < len) + { len = stringValue.length(); + } memcpy(m_Data->recordValue + valueOffset, stringValue.data(), len); } @@ -451,14 +455,20 @@ namespace pcpp { auto data = reinterpret_cast(recordRawData); if (data == nullptr) + { return false; + } if (tlvDataLen < sizeof(TLVRawData::recordType)) + { return false; + } if (data->recordType == static_cast(DHCPOPT_END) || data->recordType == static_cast(DHCPOPT_PAD)) + { return true; + } return TLVRecord::canAssign(recordRawData, tlvDataLen); } @@ -468,11 +478,15 @@ namespace pcpp size_t getTotalSize() const override { if (m_Data == nullptr) + { return 0; + } if (m_Data->recordType == static_cast(DHCPOPT_END) || m_Data->recordType == static_cast(DHCPOPT_PAD)) + { return sizeof(uint8_t); + } return sizeof(uint8_t) * 2 + static_cast(m_Data->recordLen); } @@ -480,11 +494,15 @@ namespace pcpp size_t getDataSize() const override { if (m_Data == nullptr) + { return 0; + } if (m_Data->recordType == static_cast(DHCPOPT_END) || m_Data->recordType == static_cast(DHCPOPT_PAD)) + { return 0; + } return m_Data->recordLen; } diff --git a/Packet++/header/DnsResourceData.h b/Packet++/header/DnsResourceData.h index fc68c26bb7..74a8b733c9 100644 --- a/Packet++/header/DnsResourceData.h +++ b/Packet++/header/DnsResourceData.h @@ -315,7 +315,9 @@ namespace pcpp ~GenericDnsResourceData() override { if (m_Data != nullptr) + { delete[] m_Data; + } } GenericDnsResourceData& operator=(const GenericDnsResourceData& other); diff --git a/Packet++/header/IPSecLayer.h b/Packet++/header/IPSecLayer.h index b38cd3a54f..851a7203c7 100644 --- a/Packet++/header/IPSecLayer.h +++ b/Packet++/header/IPSecLayer.h @@ -176,11 +176,15 @@ namespace pcpp bool AuthenticationHeaderLayer::isDataValid(const uint8_t* data, size_t dataLen) { if (dataLen < sizeof(ipsec_authentication_header)) + { return false; + } size_t payloadLen = 4 * (data[1] + 2); if (payloadLen < sizeof(ipsec_authentication_header) || payloadLen > dataLen) + { return false; + } return true; } diff --git a/Packet++/header/IPv4Layer.h b/Packet++/header/IPv4Layer.h index 20829b9f4e..4f705ce5f6 100644 --- a/Packet++/header/IPv4Layer.h +++ b/Packet++/header/IPv4Layer.h @@ -219,11 +219,15 @@ namespace pcpp std::vector res; if (m_Data == nullptr) + { return res; + } size_t dataSize = getDataSize(); if (dataSize < 2) + { return res; + } uint8_t valueOffset = static_cast(1); @@ -232,7 +236,9 @@ namespace pcpp uint32_t curValue; memcpy(&curValue, m_Data->recordValue + valueOffset, sizeof(uint32_t)); if (curValue == 0) + { break; + } res.push_back(IPv4Address(curValue)); @@ -255,14 +261,20 @@ namespace pcpp res.clear(); if (m_Data == nullptr) + { return res; + } if (getIPv4OptionType() != IPV4OPT_Timestamp) + { return res; + } size_t dataSize = getDataSize(); if (dataSize < 2) + { return res; + } res.type = static_cast(m_Data->recordValue[1]); @@ -274,15 +286,23 @@ namespace pcpp uint32_t curValue; memcpy(&curValue, m_Data->recordValue + valueOffset, sizeof(uint32_t)); if (curValue == 0) + { break; + } if (readIPAddr) + { res.ipAddresses.push_back(IPv4Address(curValue)); + } else + { res.timestamps.push_back(curValue); + } if (res.type == IPv4TimestampOptionValue::TimestampAndIP) + { readIPAddr = !readIPAddr; + } valueOffset += static_cast(4); } @@ -304,14 +324,20 @@ namespace pcpp { auto data = reinterpret_cast(recordRawData); if (data == nullptr) + { return false; + } if (tlvDataLen < sizeof(TLVRawData::recordType)) + { return false; + } if (getIPv4OptionType(data) == static_cast(IPV4OPT_EndOfOptionsList) || data->recordType == static_cast(IPV4OPT_NOP)) + { return true; + } return TLVRecord::canAssign(recordRawData, tlvDataLen); } @@ -321,11 +347,15 @@ namespace pcpp size_t getTotalSize() const override { if (m_Data == nullptr) + { return 0; + } if (getIPv4OptionType() == static_cast(IPV4OPT_EndOfOptionsList) || m_Data->recordType == static_cast(IPV4OPT_NOP)) + { return sizeof(uint8_t); + } return static_cast(m_Data->recordLen); } @@ -333,11 +363,15 @@ namespace pcpp size_t getDataSize() const override { if (m_Data == nullptr) + { return 0; + } if (getIPv4OptionType() == static_cast(IPV4OPT_EndOfOptionsList) || m_Data->recordType == static_cast(IPV4OPT_NOP)) + { return 0; + } return static_cast(m_Data->recordLen) - (2 * sizeof(uint8_t)); } @@ -347,7 +381,9 @@ namespace pcpp static IPv4OptionTypes getIPv4OptionType(const TLVRawData* data) { if (data == nullptr) + { return IPV4OPT_Unknown; + } return static_cast(data->recordType); } diff --git a/Packet++/header/IPv6Extensions.h b/Packet++/header/IPv6Extensions.h index e03d32837d..0bce8bcc9e 100644 --- a/Packet++/header/IPv6Extensions.h +++ b/Packet++/header/IPv6Extensions.h @@ -193,13 +193,19 @@ namespace pcpp { auto data = (TLVRawData*)recordRawData; if (data == nullptr) + { return false; + } if (tlvDataLen < sizeof(TLVRawData::recordType)) + { return false; + } if (data->recordType == Pad0OptionType) + { return true; + } return TLVRecord::canAssign(recordRawData, tlvDataLen); } @@ -209,10 +215,14 @@ namespace pcpp size_t getTotalSize() const { if (m_Data == nullptr) + { return 0; + } if (m_Data->recordType == Pad0OptionType) + { return sizeof(uint8_t); + } return (size_t)(m_Data->recordLen + sizeof(uint16_t)); } @@ -220,7 +230,9 @@ namespace pcpp size_t getDataSize() const { if (m_Data == nullptr || m_Data->recordType == Pad0OptionType) + { return 0; + } return (size_t)m_Data->recordLen; } diff --git a/Packet++/header/IPv6Layer.h b/Packet++/header/IPv6Layer.h index 87cffaafbe..1175dd7c75 100644 --- a/Packet++/header/IPv6Layer.h +++ b/Packet++/header/IPv6Layer.h @@ -204,7 +204,9 @@ namespace pcpp { IPv6Extension* curExt = m_FirstExtension; while (curExt != nullptr && dynamic_cast(curExt) == nullptr) + { curExt = curExt->getNextHeader(); + } return static_cast(curExt); } diff --git a/Packet++/header/IcmpLayer.h b/Packet++/header/IcmpLayer.h index 940aa8ce3d..6d3a312da1 100644 --- a/Packet++/header/IcmpLayer.h +++ b/Packet++/header/IcmpLayer.h @@ -619,41 +619,59 @@ namespace pcpp bool IcmpLayer::isDataValid(const uint8_t* data, size_t dataLen) { if (dataLen < sizeof(icmphdr)) + { return false; + } uint8_t type = data[0]; // ICMP_ECHO_REQUEST, ICMP_ECHO_REPLY, ICMP_ROUTER_SOL, ICMP_INFO_REQUEST, ICMP_INFO_REPLY if (type == 8 || type == 0 || type == 10 || type == 15 || type == 16) + { return true; + } // ICMP_TIMESTAMP_REQUEST, ICMP_TIMESTAMP_REPLY if (type == 13 || type == 14) + { return dataLen >= sizeof(icmp_timestamp_request); + } // ICMP_ADDRESS_MASK_REPLY, ICMP_ADDRESS_MASK_REQUEST if (type == 17 || type == 18) + { return dataLen >= sizeof(icmp_address_mask_request); + } // ICMP_DEST_UNREACHABLE if (type == 3) + { return dataLen >= sizeof(icmp_destination_unreachable); + } // ICMP_REDIRECT if (type == 5) + { return dataLen >= sizeof(icmp_redirect); + } // ICMP_TIME_EXCEEDED, ICMP_SOURCE_QUENCH if (type == 4 || type == 11) + { return dataLen >= sizeof(icmp_time_exceeded); + } // ICMP_PARAM_PROBLEM if (type == 12) + { return dataLen >= sizeof(icmp_param_problem); + } // ICMP_ROUTER_ADV if (type == 9) + { return dataLen >= sizeof(icmp_router_advertisement_hdr); + } return false; } diff --git a/Packet++/header/NdpLayer.h b/Packet++/header/NdpLayer.h index e769f5a60f..1b07c4aa0a 100644 --- a/Packet++/header/NdpLayer.h +++ b/Packet++/header/NdpLayer.h @@ -45,7 +45,9 @@ namespace pcpp NDPNeighborOptionTypes getNdpOptionType() const { if (m_Data == nullptr) + { return NDPNeighborOptionTypes::NDP_OPTION_UNKNOWN; + } return static_cast(m_Data->recordType); } @@ -55,7 +57,9 @@ namespace pcpp size_t getTotalSize() const override { if (m_Data == nullptr) + { return 0; + } return static_cast(m_Data->recordLen) * 8; } diff --git a/Packet++/header/PPPoELayer.h b/Packet++/header/PPPoELayer.h index aba14b0c8a..c245c6d145 100644 --- a/Packet++/header/PPPoELayer.h +++ b/Packet++/header/PPPoELayer.h @@ -228,7 +228,9 @@ namespace pcpp { size_t dataSize = getDataSize(); if (dataSize < 1) + { return ""; + } return std::string(reinterpret_cast(m_Data->recordValue), dataSize); } diff --git a/Packet++/header/Packet.h b/Packet++/header/Packet.h index 1da952b0ed..b12c36e3af 100644 --- a/Packet++/header/Packet.h +++ b/Packet++/header/Packet.h @@ -365,7 +365,9 @@ namespace pcpp TLayer* Packet::searchLayerStackForType(Layer* curLayer, NextLayerFn nextLayerFn, bool skipFirst) { if (curLayer == nullptr) + { return nullptr; + } if (skipFirst) { @@ -376,7 +378,9 @@ namespace pcpp { auto* curLayerCasted = dynamic_cast(curLayer); if (curLayerCasted != nullptr) + { return curLayerCasted; + } curLayer = nextLayerFn(curLayer); } diff --git a/Packet++/header/RadiusLayer.h b/Packet++/header/RadiusLayer.h index f65fb66b66..ebafc94592 100644 --- a/Packet++/header/RadiusLayer.h +++ b/Packet++/header/RadiusLayer.h @@ -45,7 +45,9 @@ namespace pcpp size_t getTotalSize() const override { if (m_Data == nullptr) + { return 0; + } return static_cast(m_Data->recordLen); } @@ -53,7 +55,9 @@ namespace pcpp size_t getDataSize() const override { if (m_Data == nullptr) + { return 0; + } return static_cast(m_Data->recordLen) - 2 * sizeof(uint8_t); } diff --git a/Packet++/header/S7CommLayer.h b/Packet++/header/S7CommLayer.h index 6a65e7913b..9498e29a2b 100644 --- a/Packet++/header/S7CommLayer.h +++ b/Packet++/header/S7CommLayer.h @@ -99,7 +99,9 @@ namespace pcpp ~S7CommLayer() override { if (m_Parameter) + { delete m_Parameter; + } } /// @return S7comm protocol id diff --git a/Packet++/header/SSLHandshake.h b/Packet++/header/SSLHandshake.h index 2d39dbb2fe..fdbc20c0b2 100644 --- a/Packet++/header/SSLHandshake.h +++ b/Packet++/header/SSLHandshake.h @@ -911,7 +911,9 @@ namespace pcpp { SSLExtension* curElem = const_cast(m_ExtensionList.at(i)); if (dynamic_cast(curElem) != nullptr) + { return static_cast(curElem); + } } return nullptr; @@ -924,7 +926,9 @@ namespace pcpp { SSLExtension* curElem = const_cast(m_ExtensionList.at(i)); if (dynamic_cast(curElem) != nullptr) + { return static_cast(curElem); + } } return nullptr; diff --git a/Packet++/header/SSLLayer.h b/Packet++/header/SSLLayer.h index 5c7a5fc010..99d1b7187d 100644 --- a/Packet++/header/SSLLayer.h +++ b/Packet++/header/SSLLayer.h @@ -447,7 +447,9 @@ namespace pcpp { SSLHandshakeMessage* curElem = const_cast(m_MessageList.at(i)); if (dynamic_cast(curElem) != nullptr) + { return (THandshakeMessage*)curElem; + } } // element not found @@ -465,18 +467,24 @@ namespace pcpp { SSLHandshakeMessage* curElem = const_cast(m_MessageList.at(afterIndex)); if (curElem == after) + { break; + } } // "after" not found if (afterIndex == vecSize) + { return nullptr; + } for (size_t i = afterIndex + 1; i < vecSize; i++) { SSLHandshakeMessage* curElem = const_cast(m_MessageList.at(i)); if (dynamic_cast(curElem) != nullptr) + { return (THandshakeMessage*)curElem; + } } // element not found @@ -488,7 +496,9 @@ namespace pcpp bool SSLLayer::isSSLPort(uint16_t port) { if (port == 443) // HTTPS, this is likely case + { return true; + } switch (port) { diff --git a/Packet++/header/TLVData.h b/Packet++/header/TLVData.h index b24dd6f708..308b099760 100644 --- a/Packet++/header/TLVData.h +++ b/Packet++/header/TLVData.h @@ -86,13 +86,19 @@ namespace pcpp bool operator==(const TLVRecord& rhs) const { if (m_Data == rhs.m_Data) + { return true; + } if (getTotalSize() != rhs.getTotalSize()) + { return false; + } if (isNull() || ((TLVRecord&)rhs).isNull()) + { return false; + } return (memcmp(m_Data, rhs.m_Data, getTotalSize()) == 0); } @@ -109,7 +115,9 @@ namespace pcpp TRecType getType() const { if (m_Data == nullptr) + { return 0; + } return m_Data->recordType; } @@ -118,7 +126,9 @@ namespace pcpp uint8_t* getValue() const { if (m_Data == nullptr) + { return nullptr; + } return m_Data->recordValue; } @@ -161,7 +171,9 @@ namespace pcpp template T getValueAs(size_t offset = 0) const { if (getDataSize() - offset < sizeof(T)) + { return 0; + } T result; memcpy(&result, m_Data->recordValue + getValueOffset() + offset, sizeof(T)); @@ -178,7 +190,9 @@ namespace pcpp template bool setValue(T newValue, int valueOffset = 0) { if (getDataSize() < sizeof(T)) + { return false; + } memcpy(m_Data->recordValue + getValueOffset() + valueOffset, &newValue, sizeof(T)); return true; @@ -239,16 +253,22 @@ namespace pcpp { TLVRecordType resRec(nullptr); // for NRVO optimization if (!TLVRecordType::canAssign(tlvDataBasePtr, tlvDataLen)) + { return resRec; + } resRec.assign(tlvDataBasePtr); // resRec pointer is out-bounds of the TLV records memory if (resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen) + { resRec.assign(nullptr); + } // check if there are records at all and the total size is not zero if (!resRec.isNull() && (tlvDataLen == 0 || resRec.getTotalSize() == 0)) + { resRec.assign(nullptr); + } return resRec; } @@ -265,25 +285,35 @@ namespace pcpp TLVRecordType resRec(nullptr); // for NRVO optimization if (record.isNull()) + { return resRec; + } if (!TLVRecordType::canAssign(record.getRecordBasePtr() + record.getTotalSize(), tlvDataBasePtr - record.getRecordBasePtr() + tlvDataLen - record.getTotalSize())) + { return resRec; + } resRec.assign(record.getRecordBasePtr() + record.getTotalSize()); if (resRec.getTotalSize() == 0) + { resRec.assign(nullptr); + } // resRec pointer is out-bounds of the TLV records memory if ((resRec.getRecordBasePtr() - tlvDataBasePtr) < 0) + { resRec.assign(nullptr); + } // resRec pointer is out-bounds of the TLV records memory if (!resRec.isNull() && resRec.getRecordBasePtr() + resRec.getTotalSize() > tlvDataBasePtr + tlvDataLen) + { resRec.assign(nullptr); + } return resRec; } @@ -321,7 +351,9 @@ namespace pcpp size_t getTLVRecordCount(uint8_t* tlvDataBasePtr, size_t tlvDataLen) const { if (m_RecordCount != static_cast(-1)) + { return m_RecordCount; + } m_RecordCount = 0; TLVRecordType curRec = getFirstTLVRecord(tlvDataBasePtr, tlvDataLen); @@ -342,7 +374,9 @@ namespace pcpp void changeTLVRecordCount(int changedBy) { if (m_RecordCount != static_cast(-1)) + { m_RecordCount += changedBy; + } } }; diff --git a/Packet++/header/TcpLayer.h b/Packet++/header/TcpLayer.h index 9f8e4b1d2a..bbc583bba5 100644 --- a/Packet++/header/TcpLayer.h +++ b/Packet++/header/TcpLayer.h @@ -282,14 +282,20 @@ namespace pcpp { const auto* data = reinterpret_cast(recordRawData); if (data == nullptr) + { return false; + } if (tlvDataLen < sizeof(TLVRawData::recordType)) + { return false; + } const auto recordType = getTcpOptionEnumType(data); if (recordType == TcpOptionEnumType::Nop || recordType == TcpOptionEnumType::Eol) + { return true; + } return TLVRecord::canAssign(recordRawData, tlvDataLen); } @@ -299,11 +305,15 @@ namespace pcpp size_t getTotalSize() const override { if (m_Data == nullptr) + { return 0; + } const auto recordType = getTcpOptionEnumType(m_Data); if (recordType == TcpOptionEnumType::Nop || recordType == TcpOptionEnumType::Eol) + { return sizeof(uint8_t); + } return static_cast(m_Data->recordLen); } @@ -311,11 +321,15 @@ namespace pcpp size_t getDataSize() const override { if (m_Data == nullptr) + { return 0; + } const auto recordType = getTcpOptionEnumType(m_Data); if (recordType == TcpOptionEnumType::Nop || recordType == TcpOptionEnumType::Eol) + { return 0; + } return static_cast(m_Data->recordLen) - (2 * sizeof(uint8_t)); } @@ -324,7 +338,9 @@ namespace pcpp static TcpOptionType getTcpOptionType(const TLVRawData* optionRawData) { if (optionRawData == nullptr) + { return TcpOptionType::TCPOPT_Unknown; + } return static_cast(optionRawData->recordType); } @@ -332,7 +348,9 @@ namespace pcpp static TcpOptionEnumType getTcpOptionEnumType(const TLVRawData* optionRawData) { if (optionRawData == nullptr) + { return TcpOptionEnumType::Unknown; + } return static_cast(optionRawData->recordType); } diff --git a/Packet++/header/TextBasedProtocol.h b/Packet++/header/TextBasedProtocol.h index 67e109ca7f..6ad439b6a9 100644 --- a/Packet++/header/TextBasedProtocol.h +++ b/Packet++/header/TextBasedProtocol.h @@ -131,9 +131,13 @@ namespace pcpp HeaderField* getNextField(HeaderField* prevField) const { if (prevField != nullptr) + { return prevField->getNextField(); + } else + { return nullptr; + } } /// @return The number of header fields currently in the layer (not including CRLF at the end of the header) diff --git a/Packet++/src/BgpLayer.cpp b/Packet++/src/BgpLayer.cpp index 003dfb44ac..1453fbf850 100644 --- a/Packet++/src/BgpLayer.cpp +++ b/Packet++/src/BgpLayer.cpp @@ -30,14 +30,18 @@ namespace pcpp BgpLayer* BgpLayer::parseBgpLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet) { if (data == nullptr || dataLen < sizeof(bgp_common_header)) + { return nullptr; + } auto* bgpHeader = reinterpret_cast(data); // illegal header data - length is too small uint16_t messageLen = be16toh(bgpHeader->length); if (dataLen < messageLen || messageLen < static_cast(sizeof(bgp_common_header))) + { return nullptr; + } switch (bgpHeader->messageType) { @@ -81,7 +85,9 @@ namespace pcpp { size_t headerLen = getHeaderLen(); if (m_DataLen <= headerLen || headerLen == 0) + { return; + } uint8_t* payload = m_Data + headerLen; size_t payloadLen = m_DataLen - headerLen; @@ -721,15 +727,21 @@ namespace pcpp bool BgpUpdateMessageLayer::isDataValid(const uint8_t* data, size_t dataSize) { if (dataSize < sizeof(bgp_common_header) + 2 * sizeof(uint16_t)) + { return false; + } uint16_t withdrLen = be16toh(*(uint16_t*)(data + sizeof(bgp_common_header))); if (dataSize < sizeof(bgp_common_header) + 2 * sizeof(uint16_t) + withdrLen) + { return false; + } uint16_t attrLen = be16toh(*(uint16_t*)(data + sizeof(bgp_common_header) + sizeof(uint16_t) + withdrLen)); if (dataSize < sizeof(bgp_common_header) + 2 * sizeof(uint16_t) + withdrLen + attrLen) + { return false; + } return true; } diff --git a/Packet++/src/CotpLayer.cpp b/Packet++/src/CotpLayer.cpp index 1183df5f13..bfc34ab3d6 100644 --- a/Packet++/src/CotpLayer.cpp +++ b/Packet++/src/CotpLayer.cpp @@ -58,7 +58,9 @@ namespace pcpp bool CotpLayer::isDataValid(const uint8_t* data, size_t dataSize) { if (!data || dataSize < sizeof(cotphdr)) + { return false; + } return data[1] == 0xf0 && data[0] == 2; } @@ -67,14 +69,20 @@ namespace pcpp { size_t headerLen = getHeaderLen(); if (m_DataLen <= headerLen) + { return; + } uint8_t* payload = m_Data + headerLen; size_t payloadLen = m_DataLen - headerLen; if (S7CommLayer::isDataValid(payload, payloadLen)) + { m_NextLayer = new S7CommLayer(payload, payloadLen, this, m_Packet); + } else + { m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet); + } } } // namespace pcpp diff --git a/Packet++/src/DhcpLayer.cpp b/Packet++/src/DhcpLayer.cpp index b5f15511fc..bae2b3b83e 100644 --- a/Packet++/src/DhcpLayer.cpp +++ b/Packet++/src/DhcpLayer.cpp @@ -33,9 +33,13 @@ namespace pcpp { recordBuffer[1] = static_cast(m_RecValueLen); if (m_RecValue != nullptr) + { memcpy(recordBuffer + 2, m_RecValue, m_RecValueLen); + } else + { memset(recordBuffer + 2, 0, m_RecValueLen); + } } return DhcpOption(recordBuffer); @@ -76,7 +80,9 @@ namespace pcpp { dhcp_header* hdr = getDhcpHeader(); if (hdr != nullptr && hdr->hardwareType == 1 && hdr->hardwareAddressLength == 6) + { return MacAddress(hdr->clientHardwareAddress); + } PCPP_LOG_DEBUG("Hardware type isn't Ethernet or hardware addr len != 6, returning MacAddress:Zero"); @@ -177,7 +183,9 @@ namespace pcpp { DhcpOption opt = getOptionData(DHCPOPT_DHCP_MESSAGE_TYPE); if (opt.isNull()) + { return DHCP_UNKNOWN_MSG_TYPE; + } return (DhcpMessageType)opt.getValueAs(); } @@ -185,14 +193,18 @@ namespace pcpp bool DhcpLayer::setMessageType(DhcpMessageType msgType) { if (msgType == DHCP_UNKNOWN_MSG_TYPE) + { return false; + } DhcpOption opt = getOptionData(DHCPOPT_DHCP_MESSAGE_TYPE); if (opt.isNull()) { opt = addOptionAfter(DhcpOptionBuilder(DHCPOPT_DHCP_MESSAGE_TYPE, (uint8_t)msgType), DHCPOPT_UNKNOWN); if (opt.isNull()) + { return false; + } } opt.setValue((uint8_t)msgType); @@ -254,9 +266,13 @@ namespace pcpp int offset = 0; DhcpOption endOpt = getOptionData(DHCPOPT_END); if (!endOpt.isNull()) + { offset = endOpt.getRecordBasePtr() - m_Data; + } else + { offset = getHeaderLen(); + } return addOptionAt(optionBuilder, offset); } @@ -303,7 +319,9 @@ namespace pcpp int offset = sizeof(dhcp_header); if (!shortenLayer(offset, getHeaderLen() - offset)) + { return false; + } m_OptionReader.changeTLVRecordCount(0 - getOptionsCount()); return true; diff --git a/Packet++/src/DhcpV6Layer.cpp b/Packet++/src/DhcpV6Layer.cpp index e6a2d2a0e5..c18f3b998d 100644 --- a/Packet++/src/DhcpV6Layer.cpp +++ b/Packet++/src/DhcpV6Layer.cpp @@ -11,7 +11,9 @@ namespace pcpp DhcpV6OptionType DhcpV6Option::getType() const { if (m_Data == nullptr) + { return DhcpV6OptionType::DHCPV6_OPT_UNKNOWN; + } uint16_t optionType = be16toh(m_Data->recordType); if (optionType <= 62 && optionType != 10 && optionType != 35 && optionType != 57 && optionType != 58) @@ -29,7 +31,9 @@ namespace pcpp std::string DhcpV6Option::getValueAsHexString() const { if (m_Data == nullptr) + { return ""; + } return byteArrayToHexString(m_Data->recordValue, getDataSize()); } @@ -37,7 +41,9 @@ namespace pcpp size_t DhcpV6Option::getTotalSize() const { if (m_Data == nullptr) + { return 0; + } return 2 * sizeof(uint16_t) + be16toh(m_Data->recordLen); } @@ -45,7 +51,9 @@ namespace pcpp size_t DhcpV6Option::getDataSize() const { if (m_Data == nullptr) + { return 0; + } return static_cast(be16toh(m_Data->recordLen)); } @@ -53,7 +61,9 @@ namespace pcpp DhcpV6Option DhcpV6OptionBuilder::build() const { if (m_RecType == 0) + { return DhcpV6Option(nullptr); + } size_t optionSize = 2 * sizeof(uint16_t) + m_RecValueLen; uint8_t* recordBuffer = new uint8_t[optionSize]; @@ -62,7 +72,9 @@ namespace pcpp memcpy(recordBuffer, &optionTypeVal, sizeof(uint16_t)); memcpy(recordBuffer + sizeof(uint16_t), &optionLength, sizeof(uint16_t)); if (optionSize > 0 && m_RecValue != nullptr) + { memcpy(recordBuffer + 2 * sizeof(uint16_t), m_RecValue, m_RecValueLen); + } return DhcpV6Option(recordBuffer); } @@ -260,7 +272,9 @@ namespace pcpp int offset = sizeof(dhcpv6_header); if (!shortenLayer(offset, getHeaderLen() - offset)) + { return false; + } m_OptionReader.changeTLVRecordCount(0 - getOptionCount()); return true; diff --git a/Packet++/src/DnsLayer.cpp b/Packet++/src/DnsLayer.cpp index 971ab84edb..e262bbcc8e 100644 --- a/Packet++/src/DnsLayer.cpp +++ b/Packet++/src/DnsLayer.cpp @@ -79,7 +79,9 @@ namespace pcpp m_FirstAdditional = nullptr; if (callParseResource) + { parseResources(); + } } void DnsLayer::initNewLayer(size_t offsetAdjustment) @@ -107,7 +109,9 @@ namespace pcpp bool DnsLayer::extendLayer(int offsetInLayer, size_t numOfBytesToExtend, IDnsResource* resource) { if (!Layer::extendLayer(offsetInLayer, numOfBytesToExtend)) + { return false; + } IDnsResource* curResource = resource->getNextResource(); while (curResource != nullptr) @@ -121,7 +125,9 @@ namespace pcpp bool DnsLayer::shortenLayer(int offsetInLayer, size_t numOfBytesToShorten, IDnsResource* resource) { if (!Layer::shortenLayer(offsetInLayer, numOfBytesToShorten)) + { return false; + } IDnsResource* curResource = resource->getNextResource(); while (curResource != nullptr) @@ -211,13 +217,21 @@ namespace pcpp } if (resType == DnsQueryType && m_FirstQuery == nullptr) + { m_FirstQuery = newQuery; + } else if (resType == DnsAnswerType && m_FirstAnswer == nullptr) + { m_FirstAnswer = newResource; + } else if (resType == DnsAuthorityType && m_FirstAuthority == nullptr) + { m_FirstAuthority = newResource; + } else if (resType == DnsAdditionalType && m_FirstAdditional == nullptr) + { m_FirstAdditional = newResource; + } } } @@ -228,13 +242,19 @@ namespace pcpp while (index < resourceCount) { if (startFrom == nullptr) + { return nullptr; + } std::string resourceName = startFrom->getName(); if (exactMatch && resourceName == name) + { return startFrom; + } else if (!exactMatch && resourceName.find(name) != std::string::npos) + { return startFrom; + } startFrom = startFrom->getNextResource(); @@ -249,7 +269,9 @@ namespace pcpp uint16_t numOfQueries = be16toh(getDnsHeader()->numberOfQuestions); IDnsResource* res = getResourceByName(m_FirstQuery, numOfQueries, name, exactMatch); if (res != nullptr) + { return dynamic_cast(res); + } return nullptr; } @@ -262,7 +284,9 @@ namespace pcpp { if (query == nullptr || query->getNextResource() == nullptr || query->getType() != DnsQueryType || query->getNextResource()->getType() != DnsQueryType) + { return nullptr; + } return (DnsQuery*)(query->getNextResource()); } @@ -277,7 +301,9 @@ namespace pcpp uint16_t numOfAnswers = be16toh(getDnsHeader()->numberOfAnswers); IDnsResource* res = getResourceByName(m_FirstAnswer, numOfAnswers, name, exactMatch); if (res != nullptr) + { return dynamic_cast(res); + } return nullptr; } @@ -290,7 +316,9 @@ namespace pcpp { if (answer == nullptr || answer->getNextResource() == nullptr || answer->getType() != DnsAnswerType || answer->getNextResource()->getType() != DnsAnswerType) + { return nullptr; + } return (DnsResource*)(answer->getNextResource()); } @@ -305,7 +333,9 @@ namespace pcpp uint16_t numOfAuthorities = be16toh(getDnsHeader()->numberOfAuthority); IDnsResource* res = getResourceByName(m_FirstAuthority, numOfAuthorities, name, exactMatch); if (res != nullptr) + { return dynamic_cast(res); + } return nullptr; } @@ -318,7 +348,9 @@ namespace pcpp { if (authority == nullptr || authority->getNextResource() == nullptr || authority->getType() != DnsAuthorityType || authority->getNextResource()->getType() != DnsAuthorityType) + { return nullptr; + } return (DnsResource*)(authority->getNextResource()); } @@ -333,7 +365,9 @@ namespace pcpp uint16_t numOfAdditionalRecords = be16toh(getDnsHeader()->numberOfAdditional); IDnsResource* res = getResourceByName(m_FirstAdditional, numOfAdditionalRecords, name, exactMatch); if (res != nullptr) + { return dynamic_cast(res); + } return nullptr; } @@ -347,7 +381,9 @@ namespace pcpp if (additionalRecord == nullptr || additionalRecord->getNextResource() == nullptr || additionalRecord->getType() != DnsAdditionalType || additionalRecord->getNextResource()->getType() != DnsAdditionalType) + { return nullptr; + } return (DnsResource*)(additionalRecord->getNextResource()); } @@ -480,7 +516,9 @@ namespace pcpp newResourceOffsetInLayer += curResource->getSize(); IDnsResource* nextResource = curResource->getNextResource(); if (nextResource == nullptr || nextResource->getType() > resType) + { break; + } curResource = nextResource; } @@ -488,9 +526,13 @@ namespace pcpp if (curResource != nullptr) { if (curResource->getType() > newResource->getType()) + { newResource->setNextResource(m_ResourceList); + } else + { newResource->setNextResource(curResource->getNextResource()); + } } else { @@ -556,15 +598,21 @@ namespace pcpp newQueryOffsetInLayer += curQuery->getSize(); DnsQuery* nextQuery = getNextQuery(curQuery); if (nextQuery == nullptr) + { break; + } curQuery = nextQuery; } // set next resource for new query. This must happen here for extendLayer to succeed if (curQuery != nullptr) + { newQuery->setNextResource(curQuery->getNextResource()); + } else + { newQuery->setNextResource(m_ResourceList); + } // extend layer to make room for the new query if (!extendLayer(newQueryOffsetInLayer, newQuery->getSize(), newQuery)) @@ -579,7 +627,9 @@ namespace pcpp // connect the new query to the layer's resource list if (curQuery != nullptr) + { curQuery->setNextResource(newQuery); + } else // curQuery == nullptr, meaning this is the first query { m_ResourceList = newQuery; @@ -595,7 +645,9 @@ namespace pcpp DnsQuery* DnsLayer::addQuery(DnsQuery* const copyQuery) { if (copyQuery == nullptr) + { return nullptr; + } return addQuery(copyQuery->getName(), copyQuery->getDnsType(), copyQuery->getDnsClass()); } @@ -640,7 +692,9 @@ namespace pcpp DnsResource* DnsLayer::addAnswer(DnsResource* const copyAnswer) { if (copyAnswer == nullptr) + { return nullptr; + } return addAnswer(copyAnswer->getName(), copyAnswer->getDnsType(), copyAnswer->getDnsClass(), copyAnswer->getTTL(), copyAnswer->getData().get()); @@ -686,7 +740,9 @@ namespace pcpp DnsResource* DnsLayer::addAuthority(DnsResource* const copyAuthority) { if (copyAuthority == nullptr) + { return nullptr; + } return addAuthority(copyAuthority->getName(), copyAuthority->getDnsType(), copyAuthority->getDnsClass(), copyAuthority->getTTL(), copyAuthority->getData().get()); @@ -744,7 +800,9 @@ namespace pcpp DnsResource* DnsLayer::addAdditionalRecord(DnsResource* const copyAdditionalRecord) { if (copyAdditionalRecord == nullptr) + { return nullptr; + } return addAdditionalRecord(copyAdditionalRecord->getName(), copyAdditionalRecord->getDnsType(), copyAdditionalRecord->getCustomDnsClass(), copyAdditionalRecord->getTTL(), @@ -792,7 +850,9 @@ namespace pcpp { IDnsResource* temp = prevResource->getNextResource(); if (temp == resourceToRemove) + { break; + } prevResource = temp; } @@ -826,9 +886,13 @@ namespace pcpp { IDnsResource* nextResource = resourceToRemove->getNextResource(); if (nextResource != nullptr && nextResource->getType() == resourceToRemove->getType()) + { setFirstResource(resourceToRemove->getType(), nextResource); + } else + { setFirstResource(resourceToRemove->getType(), nullptr); + } } // free resourceToRemove memory diff --git a/Packet++/src/DnsResource.cpp b/Packet++/src/DnsResource.cpp index de654574b8..da7f679eee 100644 --- a/Packet++/src/DnsResource.cpp +++ b/Packet++/src/DnsResource.cpp @@ -14,7 +14,9 @@ namespace pcpp char decodedName[4096]; m_NameLength = decodeName((const char*)getRawData(), decodedName); if (m_NameLength > 0) + { m_DecodedName = decodedName; + } } IDnsResource::IDnsResource(uint8_t* emptyRawData) @@ -25,7 +27,9 @@ namespace pcpp uint8_t* IDnsResource::getRawData() const { if (m_DnsLayer == nullptr) + { return m_ExternalRawData; + } return m_DnsLayer->m_Data + m_OffsetInLayer; } @@ -57,7 +61,9 @@ namespace pcpp size_t curOffsetInLayer = (uint8_t*)encodedName - m_DnsLayer->m_Data; if (curOffsetInLayer + 1 > m_DnsLayer->m_DataLen) + { return encodedNameLength; + } if (iteration > 20) { @@ -73,7 +79,9 @@ namespace pcpp if ((wordLength & 0xc0) == 0xc0) { if (curOffsetInLayer + 2 > m_DnsLayer->m_DataLen || encodedNameLength > 255) + { return cleanup(resultPtr, result, encodedNameLength); + } uint16_t offsetInLayer = (wordLength & 0x3f) * 256 + (0xFF & encodedName[1]) + m_DnsLayer->m_OffsetAdjustment; diff --git a/Packet++/src/DnsResourceData.cpp b/Packet++/src/DnsResourceData.cpp index 5365954639..50cb564da5 100644 --- a/Packet++/src/DnsResourceData.cpp +++ b/Packet++/src/DnsResourceData.cpp @@ -42,7 +42,9 @@ namespace pcpp m_Data = tempResult; } else + { PCPP_LOG_ERROR("Cannot decode name, dataPtr is nullptr or length is 0"); + } } bool StringDnsResourceData::toByteArr(uint8_t* arr, size_t& arrLength, IDnsResource* dnsResource) const @@ -99,7 +101,9 @@ namespace pcpp m_Data.mailExchange = tempMX; } else + { PCPP_LOG_ERROR("Cannot decode name, dataPtr is nullptr or length is 0"); + } } MxDnsResourceData::MxDnsResourceData(const uint16_t& preference, const std::string& mailExchange) @@ -174,7 +178,9 @@ namespace pcpp GenericDnsResourceData& GenericDnsResourceData::operator=(const GenericDnsResourceData& other) { if (m_Data != nullptr) + { delete[] m_Data; + } m_Data = nullptr; m_DataLen = other.m_DataLen; @@ -190,7 +196,9 @@ namespace pcpp bool GenericDnsResourceData::operator==(const GenericDnsResourceData& other) const { if (m_DataLen != other.m_DataLen) + { return false; + } return (memcmp(m_Data, other.m_Data, m_DataLen) == 0); } diff --git a/Packet++/src/DoIpLayer.cpp b/Packet++/src/DoIpLayer.cpp index 2944888109..aff851f03b 100644 --- a/Packet++/src/DoIpLayer.cpp +++ b/Packet++/src/DoIpLayer.cpp @@ -203,7 +203,9 @@ namespace pcpp bool DoIpLayer::isDataValid(uint8_t* data, size_t dataLen) { if (data == nullptr || dataLen < DOIP_HEADER_LEN) + { return false; + } auto* doipHeader = reinterpret_cast(data); const uint8_t version = doipHeader->protocolVersion; @@ -212,14 +214,20 @@ namespace pcpp const uint32_t lengthRaw = doipHeader->payloadLength; if (!isPayloadTypeValid(be16toh(payloadTypeRaw))) + { return false; + } // if payload type is validated, we ensure passing a valid type to isProtocolVersionValid() const DoIpPayloadTypes payloadType = static_cast(be16toh(payloadTypeRaw)); if (!isProtocolVersionValid(version, inVersion, payloadType)) + { return false; + } if (!isPayloadLengthValid(be32toh(lengthRaw), dataLen)) + { return false; + } return true; } @@ -594,11 +602,15 @@ namespace pcpp DoIpSyncStatus DoIpVehicleAnnouncementMessage::getSyncStatus() const { if (!hasSyncStatus()) + { throw std::runtime_error("Sync status field not present!"); + } uint8_t syncStatus = *(m_Data + SYNC_STATUS_OFFSET); if (syncStatus <= static_cast(DoIpSyncStatus::VIN_AND_OR_GID_ARE_NOT_SINCHRONIZED)) + { return static_cast(syncStatus); + } return DoIpSyncStatus::UNKNOWN; } @@ -714,7 +726,9 @@ namespace pcpp std::array DoIpRoutingActivationRequest::getReservedOem() const { if (!hasReservedOem()) + { throw std::runtime_error("Reserved OEM field not present!"); + } std::array reservedOem; memcpy(reservedOem.data(), m_Data + RESERVED_OEM_OFFSET, DOIP_RESERVED_OEM_LEN); @@ -761,8 +775,10 @@ namespace pcpp oss << "Reserved by ISO: " << pcpp::byteArrayToHexString(getReservedIso().data(), DOIP_RESERVED_ISO_LEN) << "\n"; if (hasReservedOem()) + { oss << "Reserved by OEM: " << pcpp::byteArrayToHexString(getReservedOem().data(), DOIP_RESERVED_OEM_LEN) << '\n'; + } return oss.str(); } @@ -836,7 +852,9 @@ namespace pcpp std::array DoIpRoutingActivationResponse::getReservedOem() const { if (!hasReservedOem()) + { throw std::runtime_error("Reserved OEM field not present!"); + } std::array reservedOem; memcpy(reservedOem.data(), m_Data + RESERVED_OEM_OFFSET, DOIP_RESERVED_OEM_LEN); @@ -884,8 +902,10 @@ namespace pcpp oss << "Reserved by ISO: " << pcpp::byteArrayToHexString(getReservedIso().data(), DOIP_RESERVED_ISO_LEN) << "\n"; if (hasReservedOem()) + { oss << "Reserved by OEM: " << pcpp::byteArrayToHexString(getReservedOem().data(), DOIP_RESERVED_OEM_LEN) << "\n"; + } return oss.str(); } @@ -976,7 +996,9 @@ namespace pcpp uint32_t DoIpEntityStatusResponse::getMaxDataSize() const { if (!hasMaxDataSize()) + { throw std::runtime_error("MaxDataSize field not present!"); + } uint32_t value; std::memcpy(&value, m_Data + MAX_DATA_SIZE_OFFSET, MAX_DATA_SIZE_LEN); @@ -1199,7 +1221,9 @@ namespace pcpp std::vector DoIpDiagnosticResponseMessageBase::getPreviousMessage() const { if (!hasPreviousMessage()) + { return {}; + } const uint8_t* dataPtr = m_Data + PREVIOUS_MSG_OFFSET; return std::vector(dataPtr, dataPtr + (m_DataLen - PREVIOUS_MSG_OFFSET)); diff --git a/Packet++/src/EthDot3Layer.cpp b/Packet++/src/EthDot3Layer.cpp index 35d6d48b14..9bc5a819f8 100644 --- a/Packet++/src/EthDot3Layer.cpp +++ b/Packet++/src/EthDot3Layer.cpp @@ -24,15 +24,21 @@ namespace pcpp void EthDot3Layer::parseNextLayer() { if (m_DataLen <= sizeof(ether_dot3_header)) + { return; + } uint8_t* payload = m_Data + sizeof(ether_dot3_header); size_t payloadLen = m_DataLen - sizeof(ether_dot3_header); if (LLCLayer::isDataValid(payload, payloadLen)) + { m_NextLayer = new LLCLayer(payload, payloadLen, this, m_Packet); + } else + { m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet); + } } std::string EthDot3Layer::toString() const diff --git a/Packet++/src/EthLayer.cpp b/Packet++/src/EthLayer.cpp index 40954d3174..085f24af09 100644 --- a/Packet++/src/EthLayer.cpp +++ b/Packet++/src/EthLayer.cpp @@ -30,7 +30,9 @@ namespace pcpp void EthLayer::parseNextLayer() { if (m_DataLen <= sizeof(ether_header)) + { return; + } ether_header* hdr = getEthHeader(); uint8_t* payload = m_Data + sizeof(ether_header); @@ -67,13 +69,17 @@ namespace pcpp // If no next layer was constructed, assume it's a payload layer if (!hasNextLayer()) + { constructNextLayer(payload, payloadLen, m_Packet); + } } void EthLayer::computeCalculateFields() { if (m_NextLayer == nullptr) + { return; + } switch (m_NextLayer->getProtocol()) { diff --git a/Packet++/src/FtpLayer.cpp b/Packet++/src/FtpLayer.cpp index dba5828da4..7b012ac810 100644 --- a/Packet++/src/FtpLayer.cpp +++ b/Packet++/src/FtpLayer.cpp @@ -43,7 +43,9 @@ namespace pcpp for (size_t idx = 0; idx < field.size(); ++idx) { if (int(field.c_str()[idx]) < 127 && int(field.c_str()[idx]) > 31) // From SPACE to ~ + { ss << field.c_str()[idx]; + } } return ss.str(); } @@ -250,7 +252,9 @@ namespace pcpp for (size_t idx = 0; idx < field.size(); ++idx) { if (int(field.c_str()[idx]) < 127 && int(field.c_str()[idx]) > 31) // From SPACE to ~ + { ss << field.c_str()[idx]; + } } return ss.str(); } diff --git a/Packet++/src/GreLayer.cpp b/Packet++/src/GreLayer.cpp index 2bf2868b47..c600408e39 100644 --- a/Packet++/src/GreLayer.cpp +++ b/Packet++/src/GreLayer.cpp @@ -23,16 +23,24 @@ namespace pcpp ProtocolType GreLayer::getGREVersion(uint8_t* greData, size_t greDataLen) { if (greDataLen < sizeof(gre_basic_header)) + { return UnknownProtocol; + } uint8_t version = *(greData + 1); version &= 0x07; if (version == 0) + { return GREv0; + } else if (version == 1) + { return GREv1; + } else + { return UnknownProtocol; + } } uint8_t* GreLayer::getFieldValue(GreField field, bool returnOffsetEvenIfFieldMissing) const @@ -86,7 +94,9 @@ namespace pcpp if (field == curField) { if (curFieldExists || returnOffsetEvenIfFieldMissing) + { return origPtr; + } return nullptr; } @@ -131,11 +141,15 @@ namespace pcpp gre_basic_header* header = (gre_basic_header*)m_Data; if (header->sequenceNumBit == 0) + { return false; + } uint32_t* val = (uint32_t*)getFieldValue(GreSeq, false); if (val == nullptr) + { return false; + } seqNumber = be32toh(*val); return true; @@ -148,7 +162,9 @@ namespace pcpp bool needToExtendLayer = false; if (header->sequenceNumBit == 0) + { needToExtendLayer = true; + } uint8_t* offsetPtr = getFieldValue(GreSeq, true); @@ -196,7 +212,9 @@ namespace pcpp { size_t headerLen = getHeaderLen(); if (m_DataLen <= headerLen) + { return; + } gre_basic_header* header = (gre_basic_header*)m_Data; uint8_t* payload = m_Data + headerLen; @@ -251,13 +269,21 @@ namespace pcpp gre_basic_header* header = (gre_basic_header*)m_Data; if (header->checksumBit == 1 || header->routingBit == 1) + { result += 4; + } if (header->keyBit == 1) + { result += 4; + } if (header->sequenceNumBit == 1) + { result += 4; + } if (header->ackSequenceNumBit == 1) + { result += 4; + } return result; } @@ -278,11 +304,15 @@ namespace pcpp bool GREv0Layer::getChecksum(uint16_t& checksum) { if (getGreHeader()->checksumBit == 0) + { return false; + } uint16_t* val = (uint16_t*)getFieldValue(GreChecksumOrRouting, false); if (val == nullptr) + { return false; + } checksum = be16toh(*val); return true; @@ -295,7 +325,9 @@ namespace pcpp bool needToExtendLayer = false; if (header->routingBit == 0 && header->checksumBit == 0) + { needToExtendLayer = true; + } uint8_t* offsetPtr = getFieldValue(GreChecksumOrRouting, true); int offset = offsetPtr - m_Data; @@ -358,11 +390,15 @@ namespace pcpp bool GREv0Layer::getOffset(uint16_t& offset) const { if (getGreHeader()->routingBit == 0) + { return false; + } uint8_t* val = (uint8_t*)getFieldValue(GreChecksumOrRouting, false); if (val == nullptr) + { return false; + } offset = be16toh(*(val + 2)); return true; @@ -371,11 +407,15 @@ namespace pcpp bool GREv0Layer::getKey(uint32_t& key) const { if (getGreHeader()->keyBit == 0) + { return false; + } uint32_t* val = (uint32_t*)getFieldValue(GreKey, false); if (val == nullptr) + { return false; + } key = be32toh(*val); return true; @@ -388,7 +428,9 @@ namespace pcpp bool needToExtendLayer = false; if (header->keyBit == 0) + { needToExtendLayer = true; + } uint8_t* offsetPtr = getFieldValue(GreKey, true); @@ -437,7 +479,9 @@ namespace pcpp computeCalculateFieldsInner(); if (getGreHeader()->checksumBit == 0) + { return; + } // calculate checksum setChecksum(0); @@ -476,11 +520,15 @@ namespace pcpp bool GREv1Layer::getAcknowledgmentNum(uint32_t& ackNum) const { if (getGreHeader()->ackSequenceNumBit == 0) + { return false; + } uint32_t* val = (uint32_t*)getFieldValue(GreAck, false); if (val == nullptr) + { return false; + } ackNum = be32toh(*val); return true; @@ -493,7 +541,9 @@ namespace pcpp gre1_header* header = getGreHeader(); if (header->ackSequenceNumBit == 0) + { needToExtendLayer = true; + } uint8_t* offsetPtr = getFieldValue(GreAck, true); int offset = offsetPtr - m_Data; @@ -567,7 +617,9 @@ namespace pcpp { size_t headerLen = getHeaderLen(); if (m_DataLen <= headerLen) + { return; + } uint8_t* payload = m_Data + headerLen; size_t payloadLen = m_DataLen - headerLen; @@ -608,7 +660,9 @@ namespace pcpp } } else + { header->protocol = 0; + } } } // namespace pcpp diff --git a/Packet++/src/HttpLayer.cpp b/Packet++/src/HttpLayer.cpp index 6da5d953d6..0629a03455 100644 --- a/Packet++/src/HttpLayer.cpp +++ b/Packet++/src/HttpLayer.cpp @@ -84,7 +84,9 @@ namespace pcpp HttpMessage::operator=(other); if (m_FirstLine != nullptr) + { delete m_FirstLine; + } m_FirstLine = new HttpRequestFirstLine(this); @@ -95,7 +97,9 @@ namespace pcpp { HeaderField* hostField = getFieldByName(PCPP_HTTP_HOST_FIELD); if (hostField == nullptr) + { return m_FirstLine->getUri(); + } return hostField->getFieldValue() + m_FirstLine->getUri(); } @@ -346,7 +350,9 @@ namespace pcpp } if (lengthDifference != 0) + { m_HttpRequest->shiftFieldsOffset(m_HttpRequest->getFirstField(), lengthDifference); + } memcpy(m_HttpRequest->m_Data, MethodEnumToString[newMethod].c_str(), MethodEnumToString[newMethod].length()); @@ -361,7 +367,9 @@ namespace pcpp { std::string result; if (m_UriOffset != -1 && m_VersionOffset != -1) + { result.assign((const char*)m_HttpRequest->m_Data + m_UriOffset, m_VersionOffset - 6 - m_UriOffset); + } // else first line is illegal, return empty string @@ -372,7 +380,9 @@ namespace pcpp { // make sure the new URI begins with "/" if (newUri.compare(0, 1, "/") != 0) + { newUri = "/" + newUri; + } // extend or shorten layer std::string currentUri = getUri(); @@ -395,7 +405,9 @@ namespace pcpp } if (lengthDifference != 0) + { m_HttpRequest->shiftFieldsOffset(m_HttpRequest->getFirstField(), lengthDifference); + } memcpy(m_HttpRequest->m_Data + m_UriOffset, newUri.c_str(), newUri.length()); @@ -407,10 +419,14 @@ namespace pcpp void HttpRequestFirstLine::setVersion(HttpVersion newVersion) { if (m_VersionOffset == -1) + { return; + } if (newVersion == HttpVersionUnknown) + { return; + } char* verPos = (char*)(m_HttpRequest->m_Data + m_VersionOffset); memcpy(verPos, VersionEnumToString[newVersion].c_str(), 3); @@ -700,7 +716,9 @@ namespace pcpp HttpMessage::operator=(other); if (m_FirstLine != nullptr) + { delete m_FirstLine; + } m_FirstLine = new HttpResponseFirstLine(this); @@ -719,7 +737,9 @@ namespace pcpp contentLengthField = insertField(prevField, PCPP_HTTP_CONTENT_LENGTH_FIELD, contentLengthAsString.str()); } else + { contentLengthField->setFieldValue(contentLengthAsString.str()); + } return contentLengthField; } @@ -731,7 +751,9 @@ namespace pcpp ::tolower); HeaderField* contentLengthField = getFieldByName(contentLengthFieldName); if (contentLengthField != nullptr) + { return atoi(contentLengthField->getFieldValue().c_str()); + } return 0; } @@ -819,7 +841,9 @@ namespace pcpp } if (lengthDifference != 0) + { m_HttpResponse->shiftFieldsOffset(m_HttpResponse->getFirstField(), lengthDifference); + } // copy status string memcpy(m_HttpResponse->m_Data + statusStringOffset, newStatusCodeMessage.c_str(), @@ -838,7 +862,9 @@ namespace pcpp void HttpResponseFirstLine::setVersion(HttpVersion newVersion) { if (newVersion == HttpVersionUnknown) + { return; + } char* verPos = (char*)(m_HttpResponse->m_Data + 5); memcpy(verPos, VersionEnumToString[newVersion].c_str(), 3); diff --git a/Packet++/src/IPReassembly.cpp b/Packet++/src/IPReassembly.cpp index c8de7c3d1a..6c3a448ae2 100644 --- a/Packet++/src/IPReassembly.cpp +++ b/Packet++/src/IPReassembly.cpp @@ -146,9 +146,13 @@ namespace pcpp { m_IPLayer = fragment->isPacketOfType(IPv6) ? fragment->getLayerOfType() : nullptr; if (m_IPLayer != nullptr) + { m_FragHeader = m_IPLayer->getExtensionOfType(); + } else + { m_FragHeader = nullptr; + } } // implement abstract methods @@ -161,7 +165,9 @@ namespace pcpp bool isFirstFragment() override { if (isFragment()) + { return m_FragHeader->isFirstFragment(); + } return false; } @@ -169,7 +175,9 @@ namespace pcpp bool isLastFragment() override { if (isFragment()) + { return m_FragHeader->isLastFragment(); + } return false; } @@ -177,7 +185,9 @@ namespace pcpp uint16_t getFragmentOffset() override { if (isFragment()) + { return m_FragHeader->getFragmentOffset(); + } return 0; } @@ -190,7 +200,9 @@ namespace pcpp uint32_t hashPacket() override { if (m_FragHeader == nullptr) + { return 0; + } ScalarBuffer vec[3]; @@ -299,9 +311,13 @@ namespace pcpp IPv6FragmentWrapper ipv6Wrapper(fragment); IPFragmentWrapper* fragWrapper = nullptr; if (fragment->isPacketOfType(IPv4)) + { fragWrapper = &ipv4Wrapper; + } else // fragment->isPacketOfType(IPv6) + { fragWrapper = &ipv6Wrapper; + } // packet is not a fragment if (!(fragWrapper->isFragment())) @@ -416,10 +432,14 @@ namespace pcpp // if this is the last fragment - mark it if (fragWrapper->isLastFragment()) + { gotLastFragment = true; + } else + { // if not the last fragment - check if the next fragments are waiting in the out-of-order list gotLastFragment = matchOutOfOrderFragments(fragData); + } } // if current fragment offset is larger than expected - this means this fragment is out-of-order else if (fragOffset > fragData->currentOffset) @@ -509,7 +529,9 @@ namespace pcpp // if got to here it means this fragment is either the first fragment or a fragment in the middle. Set the // appropriate status and return if (status != FIRST_FRAGMENT) + { status = FRAGMENT; + } return nullptr; } @@ -520,7 +542,9 @@ namespace pcpp Packet* parsedFragment = new Packet(fragment, false, parseUntil, parseUntilLayer); Packet* result = processPacket(parsedFragment, status, parseUntil, parseUntilLayer); if (result != parsedFragment) + { delete parsedFragment; + } return result; } @@ -617,7 +641,9 @@ namespace pcpp PacketKey* key = nullptr; if (m_OnFragmentsCleanCallback != nullptr) + { key = dataRemoved->packetKey->clone(); + } PCPP_LOG_DEBUG("Reached maximum packet capacity, removing data for FragID=0x" << std::hex << dataRemoved->fragmentID); @@ -684,7 +710,9 @@ namespace pcpp foundOutOfOrderFrag = true; } else + { index++; + } } // during the search we did on the out-of-order list we didn't find any matching fragment diff --git a/Packet++/src/IPSecLayer.cpp b/Packet++/src/IPSecLayer.cpp index 5f26dc0468..0280f64ce2 100644 --- a/Packet++/src/IPSecLayer.cpp +++ b/Packet++/src/IPSecLayer.cpp @@ -38,7 +38,9 @@ namespace pcpp { size_t icvLength = getICVLength(); if (icvLength > 0) + { return m_Data + sizeof(ipsec_authentication_header); + } return nullptr; } @@ -46,7 +48,9 @@ namespace pcpp { uint8_t* bytes = getICVBytes(); if (bytes == nullptr) + { return ""; + } return byteArrayToHexString(bytes, getICVLength()); } @@ -55,7 +59,9 @@ namespace pcpp { size_t headerLen = getHeaderLen(); if (m_DataLen <= headerLen) + { return; + } uint8_t* payload = m_Data + headerLen; size_t payloadLen = m_DataLen - headerLen; @@ -76,11 +82,17 @@ namespace pcpp { uint8_t ipVersion = *payload >> 4; if (ipVersion == 4 && IPv4Layer::isDataValid(payload, payloadLen)) + { m_NextLayer = new IPv4Layer(payload, payloadLen, this, m_Packet); + } else if (ipVersion == 6 && IPv6Layer::isDataValid(payload, payloadLen)) + { m_NextLayer = new IPv6Layer(payload, payloadLen, this, m_Packet); + } else + { m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet); + } break; } case PACKETPP_IPPROTO_ESP: @@ -116,7 +128,9 @@ namespace pcpp { size_t headerLen = getHeaderLen(); if (m_DataLen <= headerLen) + { return; + } m_NextLayer = new PayloadLayer(m_Data + headerLen, m_DataLen - headerLen, this, m_Packet); } diff --git a/Packet++/src/IPv4Layer.cpp b/Packet++/src/IPv4Layer.cpp index 4a09134b96..df604f69ca 100644 --- a/Packet++/src/IPv4Layer.cpp +++ b/Packet++/src/IPv4Layer.cpp @@ -40,10 +40,14 @@ namespace pcpp uint32_t ipAddrAsInt = ipAddr.toInt(); if (!firstZero) + { m_RecValue[0] += (uint8_t)4; + } if (!firstZero && ipAddrAsInt == 0) + { firstZero = true; + } memcpy(m_RecValue + curOffset, &ipAddrAsInt, sizeof(uint32_t)); curOffset += sizeof(uint32_t); @@ -102,7 +106,9 @@ namespace pcpp // for pointer calculation - find the first timestamp equals to 0 if (timestamp == 0 && firstZero == -1) + { firstZero = i; + } if (timestampValue.type == IPv4TimestampOptionValue::TimestampAndIP) { @@ -120,7 +126,9 @@ namespace pcpp { uint8_t pointerVal = (uint8_t)(4 * sizeof(uint8_t) + firstZero * sizeof(uint32_t) + 1); if (timestampValue.type == IPv4TimestampOptionValue::TimestampAndIP) + { pointerVal += (uint8_t)(firstZero * sizeof(uint32_t)); + } m_RecValue[0] = pointerVal; } @@ -131,7 +139,9 @@ namespace pcpp IPv4Option IPv4OptionBuilder::build() const { if (!m_BuilderParamsValid) + { return IPv4Option(nullptr); + } size_t optionSize = m_RecValueLen + 2 * sizeof(uint8_t); @@ -156,7 +166,9 @@ namespace pcpp { recordBuffer[1] = static_cast(optionSize); if (optionSize > 2 && m_RecValue != nullptr) + { memcpy(recordBuffer + 2, m_RecValue, m_RecValueLen); + } } return IPv4Option(recordBuffer); @@ -248,7 +260,9 @@ namespace pcpp { size_t hdrLen = getHeaderLen(); if (m_DataLen <= hdrLen || hdrLen == 0) + { return; + } iphdr* ipHdr = getIPv4Header(); @@ -324,9 +338,13 @@ namespace pcpp case IGMPv3: { if (igmpQuery) + { tryConstructNextLayerWithFallback(payload, payloadLen, m_Packet); + } else + { tryConstructNextLayerWithFallback(payload, payloadLen, m_Packet); + } break; } default: @@ -365,7 +383,9 @@ namespace pcpp // If no next layer was constructed, assume it's a payload layer if (!hasNextLayer()) + { constructNextLayer(payload, payloadLen, m_Packet); + } } void IPv4Layer::computeCalculateFields() @@ -441,11 +461,17 @@ namespace pcpp if (isFragment()) { if (isFirstFragment()) + { fragment = "First fragment"; + } else if (isLastFragment()) + { fragment = "Last fragment"; + } else + { fragment = "Fragment"; + } std::stringstream sstm; sstm << fragment << " [offset= " << getFragmentOffset() << "], "; @@ -482,17 +508,25 @@ namespace pcpp int newNumberOfTrailingBytes = 0; while ((totalOptSize + newNumberOfTrailingBytes) % 4 != 0) + { newNumberOfTrailingBytes++; + } if (newNumberOfTrailingBytes < m_NumOfTrailingBytes) + { shortenLayer(ipHdrSize + totalOptSize, m_NumOfTrailingBytes - newNumberOfTrailingBytes); + } else if (newNumberOfTrailingBytes > m_NumOfTrailingBytes) + { extendLayer(ipHdrSize + totalOptSize, newNumberOfTrailingBytes - m_NumOfTrailingBytes); + } m_NumOfTrailingBytes = newNumberOfTrailingBytes; for (int i = 0; i < m_NumOfTrailingBytes; i++) + { m_Data[ipHdrSize + totalOptSize + i] = IPV4OPT_DUMMY; + } m_TempHeaderExtension = 0; getIPv4Header()->internetHeaderLength = ((ipHdrSize + totalOptSize + m_NumOfTrailingBytes) / 4 & 0x0f); @@ -502,7 +536,9 @@ namespace pcpp { IPv4Option newOption = optionBuilder.build(); if (newOption.isNull()) + { return newOption; + } size_t sizeToExtend = newOption.getTotalSize(); @@ -612,7 +648,9 @@ namespace pcpp int offset = sizeof(iphdr); if (!shortenLayer(offset, getHeaderLen() - offset)) + { return false; + } getIPv4Header()->internetHeaderLength = (5 & 0xf); m_NumOfTrailingBytes = 0; diff --git a/Packet++/src/IPv6Extensions.cpp b/Packet++/src/IPv6Extensions.cpp index 4878e98baa..ac54b79777 100644 --- a/Packet++/src/IPv6Extensions.cpp +++ b/Packet++/src/IPv6Extensions.cpp @@ -29,7 +29,9 @@ namespace pcpp uint8_t* IPv6Extension::getDataPtr() const { if (m_DataContainer != nullptr) + { return m_DataContainer->getDataPtr(m_Offset); + } return m_ShadowData; } @@ -42,7 +44,9 @@ namespace pcpp IPv6Extension::~IPv6Extension() { if (m_ShadowData != nullptr) + { delete[] m_ShadowData; + } } // ======================= @@ -63,7 +67,9 @@ namespace pcpp fragOffset /= 8; fragOffset = htobe16(fragOffset << 3) & static_cast(0xf8ff); if (!lastFragment) + { fragOffset = fragOffset | 0x0100; + } fragHdr->fragOffsetAndFlags = fragOffset; } @@ -99,7 +105,9 @@ namespace pcpp size_t optionTotalSize = sizeof(uint8_t); uint8_t recType = static_cast(m_RecType); if (recType != IPv6TLVOptionHeader::IPv6Option::Pad0OptionType) + { optionTotalSize += sizeof(uint8_t) + m_RecValueLen; + } uint8_t* recordBuffer = new uint8_t[optionTotalSize]; memset(recordBuffer, 0, optionTotalSize); @@ -109,7 +117,9 @@ namespace pcpp recordBuffer[0] = recType; recordBuffer[1] = static_cast(m_RecValueLen); if (m_RecValueLen > 0) + { memcpy(recordBuffer + 2, m_RecValue, m_RecValueLen); + } } return IPv6Option(recordBuffer); @@ -158,7 +168,9 @@ namespace pcpp } while (totalSize % 8 != 0) + { totalSize++; + } initShadowPtr(totalSize); memset(getDataPtr(), 0, totalSize); @@ -189,7 +201,9 @@ namespace pcpp { size_t totalSize = sizeof(ipv6_routing_header) + additionalRoutingDataLen; while (totalSize % 8 != 0) + { totalSize++; + } initShadowPtr(totalSize); memset(getDataPtr(), 0, totalSize); @@ -212,7 +226,9 @@ namespace pcpp uint8_t* IPv6RoutingHeader::getRoutingAdditionalData() const { if (getExtensionLen() > sizeof(ipv6_routing_header)) + { return getDataPtr() + sizeof(ipv6_routing_header); + } return nullptr; } @@ -221,7 +237,9 @@ namespace pcpp { int result = getExtensionLen() - sizeof(ipv6_routing_header); if (result < 0) + { return (size_t)0; + } return (size_t)result; } @@ -231,7 +249,9 @@ namespace pcpp size_t routingAddDataLen = getRoutingAdditionalDataLength(); if (routingAddDataLen - offset >= 16) + { return IPv6Address(getRoutingAdditionalData() + offset); + } return IPv6Address(); } @@ -246,7 +266,9 @@ namespace pcpp { size_t totalSize = sizeof(ipv6_authentication_header) + integrityCheckValueLen; while (totalSize % 8 != 0) + { totalSize++; + } initShadowPtr(totalSize); memset(getDataPtr(), 0, totalSize); @@ -269,7 +291,9 @@ namespace pcpp uint8_t* IPv6AuthenticationHeader::getIntegrityCheckValue() const { if (getExtensionLen() > sizeof(ipv6_authentication_header)) + { return getDataPtr() + sizeof(ipv6_authentication_header); + } return nullptr; } @@ -278,7 +302,9 @@ namespace pcpp { int result = getExtensionLen() - sizeof(ipv6_authentication_header); if (result < 0) + { return (size_t)0; + } return (size_t)result; } diff --git a/Packet++/src/IPv6Layer.cpp b/Packet++/src/IPv6Layer.cpp index fb17d09051..cc2aba3ea6 100644 --- a/Packet++/src/IPv6Layer.cpp +++ b/Packet++/src/IPv6Layer.cpp @@ -38,7 +38,9 @@ namespace pcpp size_t totalLen = be16toh(getIPv6Header()->payloadLength) + getHeaderLen(); if (totalLen < m_DataLen) + { m_DataLen = totalLen; + } } IPv6Layer::IPv6Layer() @@ -123,7 +125,9 @@ namespace pcpp } if (newExt == nullptr) + { break; + } if (m_FirstExtension == nullptr) { @@ -181,7 +185,9 @@ namespace pcpp void IPv6Layer::removeAllExtensions() { if (m_LastExtension != nullptr) + { getIPv6Header()->nextHeader = m_LastExtension->getBaseHeader()->nextHeader; + } shortenLayer((int)sizeof(ip6_hdr), m_ExtensionsLen); @@ -198,7 +204,9 @@ namespace pcpp size_t headerLen = getHeaderLen(); if (m_DataLen <= headerLen) + { return; + } uint8_t* payload = m_Data + headerLen; size_t payloadLen = m_DataLen - headerLen; @@ -235,22 +243,34 @@ namespace pcpp { uint8_t ipVersion = *payload >> 4; if (ipVersion == 4 && IPv4Layer::isDataValid(payload, payloadLen)) + { m_NextLayer = new IPv4Layer(payload, payloadLen, this, m_Packet); + } else if (ipVersion == 6 && IPv6Layer::isDataValid(payload, payloadLen)) + { m_NextLayer = new IPv6Layer(payload, payloadLen, this, m_Packet); + } else + { m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet); + } break; } case PACKETPP_IPPROTO_GRE: { ProtocolType greVer = GreLayer::getGREVersion(payload, payloadLen); if (greVer == GREv0 && GREv0Layer::isDataValid(payload, payloadLen)) + { m_NextLayer = new GREv0Layer(payload, payloadLen, this, m_Packet); + } else if (greVer == GREv1 && GREv1Layer::isDataValid(payload, payloadLen)) + { m_NextLayer = new GREv1Layer(payload, payloadLen, this, m_Packet); + } else + { m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet); + } break; } case PACKETPP_IPPROTO_AH: @@ -272,9 +292,13 @@ namespace pcpp { auto vrrpVer = VrrpLayer::getVersionFromData(payload, payloadLen); if (vrrpVer == VRRPv3) + { m_NextLayer = new VrrpV3Layer(payload, payloadLen, this, m_Packet, IPAddress::IPv6AddressType); + } else + { m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet); + } break; } default: @@ -320,9 +344,13 @@ namespace pcpp if (nextHeader != 0) { if (m_LastExtension != nullptr) + { m_LastExtension->getBaseHeader()->nextHeader = nextHeader; + } else + { ipHdr->nextHeader = nextHeader; + } } } } diff --git a/Packet++/src/IcmpLayer.cpp b/Packet++/src/IcmpLayer.cpp index 171560aaef..30e3063ce6 100644 --- a/Packet++/src/IcmpLayer.cpp +++ b/Packet++/src/IcmpLayer.cpp @@ -14,7 +14,9 @@ namespace pcpp icmp_router_address_structure* icmp_router_advertisement::getRouterAddress(int index) const { if (index < 0 || index >= header->advertisementCount) + { return nullptr; + } uint8_t* headerAsByteArr = reinterpret_cast(header); return reinterpret_cast( @@ -39,7 +41,9 @@ namespace pcpp { uint8_t type = getIcmpHeader()->type; if (type > 18) + { return ICMP_UNSUPPORTED; + } return static_cast(type); } @@ -52,7 +56,9 @@ namespace pcpp { bool res = m_Packet->removeAllLayersAfter(this); if (!res) + { return false; + } } // shorten layer to size of icmphdr @@ -61,7 +67,9 @@ namespace pcpp if (headerLen > sizeof(icmphdr)) { if (!this->shortenLayer(sizeof(icmphdr), headerLen - sizeof(icmphdr))) + { return false; + } } return true; @@ -71,20 +79,30 @@ namespace pcpp const uint8_t* data, size_t dataLen) { if (!cleanIcmpLayer()) + { return false; + } if (!this->extendLayer(m_DataLen, sizeof(icmp_echo_hdr) - sizeof(icmphdr) + dataLen)) + { return false; + } getIcmpHeader()->type = static_cast(echoType); icmp_echo_request* header = nullptr; if (echoType == ICMP_ECHO_REQUEST) + { header = getEchoRequestData(); + } else if (echoType == ICMP_ECHO_REPLY) + { header = reinterpret_cast(getEchoReplyData()); + } else + { return false; + } header->header->code = 0; header->header->checksum = 0; @@ -92,7 +110,9 @@ namespace pcpp header->header->sequence = htobe16(sequence); header->header->timestamp = timestamp; if (data != nullptr && dataLen > 0) + { memcpy(header->data, data, dataLen); + } return true; } @@ -124,7 +144,9 @@ namespace pcpp icmp_echo_request* IcmpLayer::getEchoRequestData() { if (!isMessageOfType(ICMP_ECHO_REQUEST)) + { return nullptr; + } m_EchoData.header = reinterpret_cast(m_Data); m_EchoData.data = reinterpret_cast(m_Data + sizeof(icmp_echo_hdr)); @@ -137,15 +159,21 @@ namespace pcpp const uint8_t* data, size_t dataLen) { if (setEchoData(ICMP_ECHO_REQUEST, id, sequence, timestamp, data, dataLen)) + { return getEchoRequestData(); + } else + { return nullptr; + } } icmp_echo_reply* IcmpLayer::getEchoReplyData() { if (!isMessageOfType(ICMP_ECHO_REPLY)) + { return nullptr; + } m_EchoData.header = reinterpret_cast(m_Data); m_EchoData.data = reinterpret_cast(m_Data + sizeof(icmp_echo_hdr)); @@ -158,15 +186,21 @@ namespace pcpp const uint8_t* data, size_t dataLen) { if (setEchoData(ICMP_ECHO_REPLY, id, sequence, timestamp, data, dataLen)) + { return getEchoReplyData(); + } else + { return nullptr; + } } icmp_timestamp_request* IcmpLayer::getTimestampRequestData() { if (!isMessageOfType(ICMP_TIMESTAMP_REQUEST)) + { return nullptr; + } return reinterpret_cast(m_Data); } @@ -175,10 +209,14 @@ namespace pcpp timeval originateTimestamp) { if (!cleanIcmpLayer()) + { return nullptr; + } if (!this->extendLayer(m_DataLen, sizeof(icmp_timestamp_request) - sizeof(icmphdr))) + { return nullptr; + } getIcmpHeader()->type = static_cast(ICMP_TIMESTAMP_REQUEST); @@ -196,7 +234,9 @@ namespace pcpp icmp_timestamp_reply* IcmpLayer::getTimestampReplyData() { if (!isMessageOfType(ICMP_TIMESTAMP_REPLY)) + { return nullptr; + } return reinterpret_cast(m_Data); } @@ -205,10 +245,14 @@ namespace pcpp timeval receiveTimestamp, timeval transmitTimestamp) { if (!cleanIcmpLayer()) + { return nullptr; + } if (!this->extendLayer(m_DataLen, sizeof(icmp_timestamp_reply) - sizeof(icmphdr))) + { return nullptr; + } getIcmpHeader()->type = static_cast(ICMP_TIMESTAMP_REPLY); @@ -226,7 +270,9 @@ namespace pcpp icmp_destination_unreachable* IcmpLayer::getDestUnreachableData() { if (!isMessageOfType(ICMP_DEST_UNREACHABLE)) + { return nullptr; + } return reinterpret_cast(m_Data); } @@ -235,10 +281,14 @@ namespace pcpp IPv4Layer* ipHeader, Layer* l4Header) { if (!cleanIcmpLayer()) + { return nullptr; + } if (!this->extendLayer(m_DataLen, sizeof(icmp_destination_unreachable) - sizeof(icmphdr))) + { return nullptr; + } getIcmpHeader()->type = static_cast(ICMP_DEST_UNREACHABLE); @@ -248,7 +298,9 @@ namespace pcpp header->unused = 0; if (!setIpAndL4Layers(ipHeader, l4Header)) + { return nullptr; + } return header; } @@ -256,7 +308,9 @@ namespace pcpp icmp_source_quench* IcmpLayer::getSourceQuenchdata() { if (!isMessageOfType(ICMP_SOURCE_QUENCH)) + { return nullptr; + } return reinterpret_cast(m_Data); } @@ -264,10 +318,14 @@ namespace pcpp icmp_source_quench* IcmpLayer::setSourceQuenchdata(IPv4Layer* ipHeader, Layer* l4Header) { if (!cleanIcmpLayer()) + { return nullptr; + } if (!this->extendLayer(m_DataLen, sizeof(icmp_source_quench) - sizeof(icmphdr))) + { return nullptr; + } getIcmpHeader()->type = static_cast(ICMP_SOURCE_QUENCH); @@ -275,7 +333,9 @@ namespace pcpp header->unused = 0; if (!setIpAndL4Layers(ipHeader, l4Header)) + { return nullptr; + } return header; } @@ -283,7 +343,9 @@ namespace pcpp icmp_redirect* IcmpLayer::getRedirectData() { if (!isMessageOfType(ICMP_REDIRECT)) + { return nullptr; + } return reinterpret_cast(m_Data); } @@ -298,10 +360,14 @@ namespace pcpp } if (!cleanIcmpLayer()) + { return nullptr; + } if (!this->extendLayer(m_DataLen, sizeof(icmp_redirect) - sizeof(icmphdr))) + { return nullptr; + } getIcmpHeader()->type = static_cast(ICMP_REDIRECT); @@ -310,7 +376,9 @@ namespace pcpp header->gatewayAddress = gatewayAddress.toInt(); if (!setIpAndL4Layers(ipHeader, l4Header)) + { return nullptr; + } return header; } @@ -318,7 +386,9 @@ namespace pcpp icmp_router_advertisement* IcmpLayer::getRouterAdvertisementData() const { if (!isMessageOfType(ICMP_ROUTER_ADV)) + { return nullptr; + } m_RouterAdvData.header = reinterpret_cast(m_Data); @@ -336,12 +406,16 @@ namespace pcpp } if (!cleanIcmpLayer()) + { return nullptr; + } if (!this->extendLayer(m_DataLen, sizeof(icmp_router_advertisement_hdr) + (routerAddresses.size() * sizeof(icmp_router_address_structure)) - sizeof(icmphdr))) + { return nullptr; + } getIcmpHeader()->type = static_cast(ICMP_ROUTER_ADV); @@ -366,7 +440,9 @@ namespace pcpp icmp_router_solicitation* IcmpLayer::getRouterSolicitationData() { if (!isMessageOfType(ICMP_ROUTER_SOL)) + { return nullptr; + } return reinterpret_cast(m_Data); } @@ -374,7 +450,9 @@ namespace pcpp icmp_router_solicitation* IcmpLayer::setRouterSolicitationData() { if (!cleanIcmpLayer()) + { return nullptr; + } getIcmpHeader()->type = static_cast(ICMP_ROUTER_SOL); @@ -387,7 +465,9 @@ namespace pcpp icmp_time_exceeded* IcmpLayer::getTimeExceededData() { if (!isMessageOfType(ICMP_TIME_EXCEEDED)) + { return nullptr; + } return reinterpret_cast(m_Data); } @@ -401,10 +481,14 @@ namespace pcpp } if (!cleanIcmpLayer()) + { return nullptr; + } if (!this->extendLayer(m_DataLen, sizeof(icmp_time_exceeded) - sizeof(icmphdr))) + { return nullptr; + } getIcmpHeader()->type = static_cast(ICMP_TIME_EXCEEDED); @@ -413,7 +497,9 @@ namespace pcpp header->unused = 0; if (!setIpAndL4Layers(ipHeader, l4Header)) + { return nullptr; + } return header; } @@ -421,7 +507,9 @@ namespace pcpp icmp_param_problem* IcmpLayer::getParamProblemData() { if (!isMessageOfType(ICMP_PARAM_PROBLEM)) + { return nullptr; + } return reinterpret_cast(m_Data); } @@ -436,10 +524,14 @@ namespace pcpp } if (!cleanIcmpLayer()) + { return nullptr; + } if (!this->extendLayer(m_DataLen, sizeof(icmp_param_problem) - sizeof(icmphdr))) + { return nullptr; + } getIcmpHeader()->type = static_cast(ICMP_PARAM_PROBLEM); @@ -450,7 +542,9 @@ namespace pcpp header->pointer = errorOctetPointer; if (!setIpAndL4Layers(ipHeader, l4Header)) + { return nullptr; + } return header; } @@ -458,7 +552,9 @@ namespace pcpp icmp_address_mask_request* IcmpLayer::getAddressMaskRequestData() { if (!isMessageOfType(ICMP_ADDRESS_MASK_REQUEST)) + { return nullptr; + } return reinterpret_cast(m_Data); } @@ -466,10 +562,14 @@ namespace pcpp icmp_address_mask_request* IcmpLayer::setAddressMaskRequestData(uint16_t id, uint16_t sequence, IPv4Address mask) { if (!cleanIcmpLayer()) + { return nullptr; + } if (!this->extendLayer(m_DataLen, sizeof(icmp_address_mask_request) - sizeof(icmphdr))) + { return nullptr; + } getIcmpHeader()->type = static_cast(ICMP_ADDRESS_MASK_REQUEST); @@ -485,7 +585,9 @@ namespace pcpp icmp_address_mask_reply* IcmpLayer::getAddressMaskReplyData() { if (!isMessageOfType(ICMP_ADDRESS_MASK_REPLY)) + { return nullptr; + } return reinterpret_cast(m_Data); } @@ -493,10 +595,14 @@ namespace pcpp icmp_address_mask_reply* IcmpLayer::setAddressMaskReplyData(uint16_t id, uint16_t sequence, IPv4Address mask) { if (!cleanIcmpLayer()) + { return nullptr; + } if (!this->extendLayer(m_DataLen, sizeof(icmp_address_mask_reply) - sizeof(icmphdr))) + { return nullptr; + } getIcmpHeader()->type = static_cast(ICMP_ADDRESS_MASK_REPLY); @@ -512,7 +618,9 @@ namespace pcpp icmp_info_request* IcmpLayer::getInfoRequestData() { if (!isMessageOfType(ICMP_INFO_REQUEST)) + { return nullptr; + } return reinterpret_cast(m_Data); } @@ -520,10 +628,14 @@ namespace pcpp icmp_info_request* IcmpLayer::setInfoRequestData(uint16_t id, uint16_t sequence) { if (!cleanIcmpLayer()) + { return nullptr; + } if (!this->extendLayer(m_DataLen, sizeof(icmp_info_request) - sizeof(icmphdr))) + { return nullptr; + } getIcmpHeader()->type = static_cast(ICMP_INFO_REQUEST); @@ -538,7 +650,9 @@ namespace pcpp icmp_info_reply* IcmpLayer::getInfoReplyData() { if (!isMessageOfType(ICMP_INFO_REPLY)) + { return nullptr; + } return reinterpret_cast(m_Data); } @@ -546,10 +660,14 @@ namespace pcpp icmp_info_reply* IcmpLayer::setInfoReplyData(uint16_t id, uint16_t sequence) { if (!cleanIcmpLayer()) + { return nullptr; + } if (!this->extendLayer(m_DataLen, sizeof(icmp_info_reply) - sizeof(icmphdr))) + { return nullptr; + } getIcmpHeader()->type = static_cast(ICMP_INFO_REPLY); @@ -580,7 +698,9 @@ namespace pcpp return; default: if (m_DataLen > headerLen) + { m_NextLayer = new PayloadLayer(m_Data + headerLen, m_DataLen - headerLen, this, m_Packet); + } return; } } @@ -619,7 +739,9 @@ namespace pcpp routerAdvSize = sizeof(icmp_router_advertisement_hdr) + (getRouterAdvertisementData()->header->advertisementCount * sizeof(icmp_router_address_structure)); // clang-format on if (routerAdvSize > m_DataLen) + { return m_DataLen; + } return routerAdvSize; default: return sizeof(icmphdr); diff --git a/Packet++/src/IcmpV6Layer.cpp b/Packet++/src/IcmpV6Layer.cpp index 000031845c..61b2ffb49f 100644 --- a/Packet++/src/IcmpV6Layer.cpp +++ b/Packet++/src/IcmpV6Layer.cpp @@ -17,7 +17,9 @@ namespace pcpp Layer* IcmpV6Layer::parseIcmpV6Layer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet) { if (dataLen < sizeof(icmpv6hdr)) + { return new PayloadLayer(data, dataLen, prevLayer, packet); + } icmpv6hdr* hdr = (icmpv6hdr*)data; ICMPv6MessageType messageType = static_cast(hdr->type); @@ -50,7 +52,9 @@ namespace pcpp hdr->code = code; if (data != nullptr && dataLen > 0) + { memcpy(m_Data + sizeof(icmpv6hdr), data, dataLen); + } } ICMPv6MessageType IcmpV6Layer::getMessageType() const @@ -145,7 +149,9 @@ namespace pcpp header->sequence = htobe16(sequence); if (data != nullptr && dataLen > 0) + { memcpy(getEchoDataPtr(), data, dataLen); + } } uint16_t ICMPv6EchoLayer::getIdentifier() const diff --git a/Packet++/src/IgmpLayer.cpp b/Packet++/src/IgmpLayer.cpp index 3fd57f1b16..eb32d68736 100644 --- a/Packet++/src/IgmpLayer.cpp +++ b/Packet++/src/IgmpLayer.cpp @@ -46,7 +46,9 @@ namespace pcpp void IgmpLayer::setType(IgmpType type) { if (type == IgmpType_Unknown) + { return; + } igmp_header* hdr = getIgmpHeader(); hdr->type = type; @@ -57,7 +59,9 @@ namespace pcpp isQuery = false; if (dataLen < 8 || data == nullptr) + { return UnknownProtocol; + } switch ((int)data[0]) { @@ -73,12 +77,18 @@ namespace pcpp isQuery = true; if (dataLen >= sizeof(igmpv3_query_header)) + { return IGMPv3; + } if (data[1] == 0) + { return IGMPv1; + } else + { return IGMPv2; + } } default: return UnknownProtocol; @@ -96,14 +106,20 @@ namespace pcpp size_t IgmpLayer::getHeaderSizeByVerAndType(ProtocolType igmpVer, IgmpType igmpType) const { if (igmpVer == IGMPv1 || igmpVer == IGMPv2) + { return sizeof(igmp_header); + } if (igmpVer == IGMPv3) { if (igmpType == IgmpType_MembershipQuery) + { return sizeof(igmpv3_query_header); + } else if (igmpType == IgmpType_MembershipReportV3) + { return sizeof(igmpv3_report_header); + } } return 0; @@ -216,12 +232,16 @@ namespace pcpp { uint16_t numOfSources = getSourceAddressCount(); if (index < 0 || index >= numOfSources) + { return IPv4Address(); + } // verify numOfRecords is a reasonable number that points to data within the packet int ptrOffset = index * sizeof(uint32_t) + sizeof(igmpv3_query_header); if (ptrOffset + sizeof(uint32_t) > getDataLen()) + { return IPv4Address(); + } uint8_t* ptr = m_Data + ptrOffset; return IPv4Address(*reinterpret_cast(ptr)); @@ -235,7 +255,9 @@ namespace pcpp // verify numOfRecords is a reasonable number that points to data within the packet if ((size_t)headerLen > getDataLen()) + { return getDataLen(); + } return (size_t)headerLen; } @@ -337,7 +359,9 @@ namespace pcpp { // check if there are group records at all if (getHeaderLen() <= sizeof(igmpv3_report_header)) + { return nullptr; + } uint8_t* curGroupPtr = m_Data + sizeof(igmpv3_report_header); return (igmpv3_group_record*)curGroupPtr; @@ -346,7 +370,9 @@ namespace pcpp igmpv3_group_record* IgmpV3ReportLayer::getNextGroupRecord(igmpv3_group_record* groupRecord) const { if (groupRecord == nullptr) + { return nullptr; + } uint8_t* nextGroupRecordBegin = reinterpret_cast(groupRecord) + groupRecord->getRecordLen(); if (std::distance(m_Data, nextGroupRecordBegin) >= static_cast(getHeaderLen())) @@ -507,7 +533,9 @@ namespace pcpp { uint16_t numOfRecords = getSourceAddressCount(); if (index < 0 || index >= numOfRecords) + { return IPv4Address(); + } int offset = index * sizeof(uint32_t); const uint8_t* ptr = sourceAddresses + offset; diff --git a/Packet++/src/LLCLayer.cpp b/Packet++/src/LLCLayer.cpp index 5cfe5d84da..013eef1833 100644 --- a/Packet++/src/LLCLayer.cpp +++ b/Packet++/src/LLCLayer.cpp @@ -27,7 +27,9 @@ namespace pcpp void LLCLayer::parseNextLayer() { if (m_DataLen <= sizeof(llc_header)) + { return; + } llc_header* hdr = getLlcHeader(); uint8_t* payload = m_Data + sizeof(llc_header); @@ -37,7 +39,9 @@ namespace pcpp { m_NextLayer = StpLayer::parseStpLayer(payload, payloadLen, this, m_Packet); if (!m_NextLayer) + { m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet); + } return; } m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet); diff --git a/Packet++/src/Layer.cpp b/Packet++/src/Layer.cpp index ced53ab4ba..398c94ba8a 100644 --- a/Packet++/src/Layer.cpp +++ b/Packet++/src/Layer.cpp @@ -11,7 +11,9 @@ namespace pcpp Layer::~Layer() { if (!isAllocatedToPacket()) + { delete[] m_Data; + } } Layer::Layer(const Layer& other) @@ -26,10 +28,14 @@ namespace pcpp Layer& Layer::operator=(const Layer& other) { if (this == &other) + { return *this; + } if (m_Data != nullptr) + { delete[] m_Data; + } m_DataLen = other.getHeaderLen(); m_Packet = nullptr; diff --git a/Packet++/src/LdapLayer.cpp b/Packet++/src/LdapLayer.cpp index ebb0e844d5..505ada56d3 100644 --- a/Packet++/src/LdapLayer.cpp +++ b/Packet++/src/LdapLayer.cpp @@ -364,7 +364,9 @@ namespace pcpp { size_t headerLen = getHeaderLen(); if (m_DataLen <= headerLen || headerLen == 0) + { return; + } uint8_t* payload = m_Data + headerLen; size_t payloadLen = m_DataLen - headerLen; diff --git a/Packet++/src/MplsLayer.cpp b/Packet++/src/MplsLayer.cpp index fe57a68529..ea06135a62 100644 --- a/Packet++/src/MplsLayer.cpp +++ b/Packet++/src/MplsLayer.cpp @@ -33,9 +33,13 @@ namespace pcpp void MplsLayer::setBottomOfStack(bool val) { if (!val) + { getMplsHeader()->misc &= 0xFE; + } else + { getMplsHeader()->misc |= 0x1; + } } uint8_t MplsLayer::getExperimentalUseValue() const @@ -105,7 +109,9 @@ namespace pcpp { size_t headerLen = getHeaderLen(); if (m_DataLen < headerLen + 1) + { return; + } uint8_t* payload = m_Data + sizeof(mpls_header); size_t payloadLen = m_DataLen - sizeof(mpls_header); diff --git a/Packet++/src/NdpLayer.cpp b/Packet++/src/NdpLayer.cpp index 38da82ec9e..5034733700 100644 --- a/Packet++/src/NdpLayer.cpp +++ b/Packet++/src/NdpLayer.cpp @@ -85,7 +85,9 @@ namespace pcpp { int offset = getNdpHeaderLen(); if (!shortenLayer(offset, getHeaderLen() - offset)) + { return false; + } m_OptionReader.changeTLVRecordCount(0 - getNdpOptionCount()); return true; diff --git a/Packet++/src/NtpLayer.cpp b/Packet++/src/NtpLayer.cpp index b7031be775..bf8f26943d 100644 --- a/Packet++/src/NtpLayer.cpp +++ b/Packet++/src/NtpLayer.cpp @@ -26,7 +26,9 @@ namespace pcpp NtpLayer::LeapIndicator NtpLayer::getLeapIndicator() const { if (getNtpHeader()->leapIndicator < 4) // Since leap indicator field is 2bit + { return static_cast(getNtpHeader()->leapIndicator); + } PCPP_LOG_ERROR("Unknown NTP Leap Indicator"); return Unknown; } @@ -49,7 +51,9 @@ namespace pcpp NtpLayer::Mode NtpLayer::getMode() const { if (getNtpHeader()->mode < 8) // Since mode field 3bit + { return static_cast(getNtpHeader()->mode); + } PCPP_LOG_ERROR("Unknown NTP Mode"); return Reserved; } @@ -474,7 +478,9 @@ namespace pcpp case 3: { if (m_DataLen < (sizeof(ntp_header) + sizeof(ntp_v3_auth))) + { return 0; + } ntp_v3_auth* header = (ntp_v3_auth*)(m_Data + sizeof(ntp_header)); return header->keyID; @@ -511,7 +517,9 @@ namespace pcpp case 3: { if (m_DataLen < (sizeof(ntp_header) + sizeof(ntp_v3_auth))) + { return std::string(); + } ntp_v3_auth* header = (ntp_v3_auth*)(m_Data + sizeof(ntp_header)); return byteArrayToHexString(header->dgst, 8); @@ -589,14 +597,18 @@ namespace pcpp time_t timeStruct = integerPart; #if defined(_WIN32) if (timeStruct < 0) + { timeStruct = 0; + } timer = gmtime(&timeStruct); #else struct tm timer_r; timer = gmtime_r(&timeStruct, &timer_r); if (timer != nullptr) + { timer = &timer_r; + } #endif if (timer == nullptr) { diff --git a/Packet++/src/PPPoELayer.cpp b/Packet++/src/PPPoELayer.cpp index f8d0e88388..5c523a5ea4 100644 --- a/Packet++/src/PPPoELayer.cpp +++ b/Packet++/src/PPPoELayer.cpp @@ -44,7 +44,9 @@ namespace pcpp { size_t headerLen = getHeaderLen(); if (m_DataLen <= headerLen) + { return; + } uint8_t* payload = m_Data + headerLen; size_t payloadLen = m_DataLen - headerLen; @@ -237,7 +239,9 @@ namespace pcpp auto findResult = PPPNextProtoToString.find(getPPPNextProtocol()); std::string nextProtocol; if (findResult != PPPNextProtoToString.end()) + { nextProtocol = findResult->second; + } else { std::ostringstream stream; @@ -254,7 +258,9 @@ namespace pcpp PPPoEDiscoveryLayer::PPPoETagTypes PPPoEDiscoveryLayer::PPPoETag::getType() const { if (m_Data == nullptr) + { return PPPoEDiscoveryLayer::PPPoETagTypes::PPPOE_TAG_EOL; + } return static_cast(be16toh(m_Data->recordType)); } @@ -262,7 +268,9 @@ namespace pcpp size_t PPPoEDiscoveryLayer::PPPoETag::getTotalSize() const { if (m_Data == nullptr) + { return 0; + } return 2 * sizeof(uint16_t) + be16toh(m_Data->recordLen); } @@ -270,7 +278,9 @@ namespace pcpp size_t PPPoEDiscoveryLayer::PPPoETag::getDataSize() const { if (m_Data == nullptr) + { return 0; + } return be16toh(m_Data->recordLen); } @@ -284,7 +294,9 @@ namespace pcpp memcpy(recordBuffer, &tagTypeVal, sizeof(uint16_t)); memcpy(recordBuffer + sizeof(uint16_t), &tagLength, sizeof(uint16_t)); if (tagLength > 0 && m_RecValue != nullptr) + { memcpy(recordBuffer + 2 * sizeof(uint16_t), m_RecValue, m_RecValueLen); + } return PPPoEDiscoveryLayer::PPPoETag(recordBuffer); } @@ -370,7 +382,9 @@ namespace pcpp { size_t payloadLen = sizeof(pppoe_header) + be16toh(getPPPoEHeader()->payloadLength); if (payloadLen > m_DataLen) + { return m_DataLen; + } return payloadLen; } diff --git a/Packet++/src/Packet.cpp b/Packet++/src/Packet.cpp index 6826bac736..9e39c10e10 100644 --- a/Packet++/src/Packet.cpp +++ b/Packet++/src/Packet.cpp @@ -57,7 +57,9 @@ namespace pcpp m_RawPacket = rawPacket; m_CanReallocateData = true; if (m_RawPacket == nullptr) + { return; + } LinkLayerType linkType = m_RawPacket->getLinkLayerType(); @@ -166,7 +168,9 @@ namespace pcpp { Layer* nextLayer = curLayer->getNextLayer(); if (curLayer->m_IsAllocatedInPacket) + { delete curLayer; + } curLayer = nextLayer; } @@ -200,7 +204,9 @@ namespace pcpp curLayer->m_IsAllocatedInPacket = true; curLayer = curLayer->getNextLayer(); if (curLayer != nullptr) + { m_LastLayer = curLayer; + } } } @@ -260,15 +266,21 @@ namespace pcpp } // reallocate to maximum value of: twice the max size of the packet or max size + new required length if (m_RawPacket->getRawDataLen() + newLayerHeaderLen > m_MaxPacketLen * 2) + { reallocateRawData(m_RawPacket->getRawDataLen() + newLayerHeaderLen + m_MaxPacketLen); + } else + { reallocateRawData(m_MaxPacketLen * 2); + } } // insert layer data to raw packet int indexToInsertData = 0; if (prevLayer != nullptr) + { indexToInsertData = prevLayer->m_Data + prevLayer->getHeaderLen() - m_RawPacket->getRawData(); + } m_RawPacket->insertData(indexToInsertData, newLayer->m_Data, newLayerHeaderLen); // delete previous layer data @@ -285,21 +297,29 @@ namespace pcpp { newLayer->setNextLayer(m_FirstLayer); if (m_FirstLayer != nullptr) + { m_FirstLayer->setPrevLayer(newLayer); + } m_FirstLayer = newLayer; } if (newLayer->getNextLayer() == nullptr) + { m_LastLayer = newLayer; + } else + { newLayer->getNextLayer()->setPrevLayer(newLayer); + } // assign layer with this packet only newLayer->m_Packet = this; // Set flag to indicate if new layer is allocated to packet. if (ownInPacket) + { newLayer->m_IsAllocatedInPacket = true; + } // re-calculate all layers data ptr and data length @@ -310,7 +330,9 @@ namespace pcpp // if a packet trailer exists, get its length size_t packetTrailerLen = 0; if (m_LastLayer != nullptr && m_LastLayer->getProtocol() == PacketTrailer) + { packetTrailerLen = m_LastLayer->getDataLen(); + } // go over all layers from the first layer to the last layer and set the data ptr and data length for each one for (Layer* curLayer = m_FirstLayer; curLayer != nullptr; curLayer = curLayer->getNextLayer()) @@ -323,9 +345,13 @@ namespace pcpp // whole data, including the packet trailer. If this layer is L3-7, exclude the packet trailer from its data // length if (curLayer->getOsiModelLayer() == OsiModelDataLinkLayer) + { curLayer->m_DataLen = dataLen; + } else + { curLayer->m_DataLen = dataLen - packetTrailerLen; + } // advance data ptr and data length dataPtr += curLayer->getHeaderLen(); @@ -381,7 +407,9 @@ namespace pcpp { Layer* tempLayer = curLayer->getNextLayer(); if (!removeLayer(curLayer, true)) + { return false; + } curLayer = tempLayer; } @@ -395,9 +423,13 @@ namespace pcpp if (layerToDetach != nullptr) { if (removeLayer(layerToDetach, false)) + { return layerToDetach; + } else + { return nullptr; + } } else { @@ -424,7 +456,9 @@ namespace pcpp // verify layer is allocated to *this* packet Layer* curLayer = layer; while (curLayer->m_PrevLayer != nullptr) + { curLayer = curLayer->m_PrevLayer; + } if (curLayer != m_FirstLayer) { PCPP_LOG_ERROR("Layer isn't allocated to this packet"); @@ -448,22 +482,32 @@ namespace pcpp // remove layer from layers linked list if (layer->m_PrevLayer != nullptr) + { layer->m_PrevLayer->setNextLayer(layer->m_NextLayer); + } if (layer->m_NextLayer != nullptr) + { layer->m_NextLayer->setPrevLayer(layer->m_PrevLayer); + } // take care of head and tail ptrs if (m_FirstLayer == layer) + { m_FirstLayer = layer->m_NextLayer; + } if (m_LastLayer == layer) + { m_LastLayer = layer->m_PrevLayer; + } layer->setNextLayer(nullptr); layer->setPrevLayer(nullptr); // get packet trailer len if exists size_t packetTrailerLen = 0; if (m_LastLayer != nullptr && m_LastLayer->getProtocol() == PacketTrailer) + { packetTrailerLen = m_LastLayer->getDataLen(); + } // re-calculate all layers data ptr and data length @@ -484,9 +528,13 @@ namespace pcpp // whole data, including the packet trailer. If this layer is L3-7, exclude the packet trailer from its data // length if (curLayer->getOsiModelLayer() == OsiModelDataLinkLayer) + { curLayer->m_DataLen = dataLen; + } else + { curLayer->m_DataLen = dataLen - packetTrailerLen; + } // advance data ptr and data length dataPtr += curLayer->getHeaderLen(); @@ -519,10 +567,14 @@ namespace pcpp for (Layer* curLayer = getFirstLayer(); curLayer != nullptr; curLayer = curLayer->getNextLayer()) { if (curLayer->getProtocol() != layerType) + { continue; + } if (curIndex == index) + { return curLayer; + } curIndex++; } @@ -584,9 +636,13 @@ namespace pcpp } // reallocate to maximum value of: twice the max size of the packet or max size + new required length if (m_RawPacket->getRawDataLen() + numOfBytesToExtend > m_MaxPacketLen * 2) + { reallocateRawData(m_RawPacket->getRawDataLen() + numOfBytesToExtend + m_MaxPacketLen); + } else + { reallocateRawData(m_MaxPacketLen * 2); + } } // insert layer data to raw packet @@ -610,12 +666,16 @@ namespace pcpp // set a flag if arrived to the layer being extended if (curLayer->getPrevLayer() == layer) + { passedExtendedLayer = true; + } // change the data length only for layers who come before the extended layer. For layers who come after, // data length isn't changed if (!passedExtendedLayer) + { curLayer->m_DataLen += numOfBytesToExtend; + } // assuming header length of the layer that requested to be extended hasn't been enlarged yet size_t headerLen = curLayer->getHeaderLen() + (curLayer == layer ? numOfBytesToExtend : 0); @@ -661,12 +721,16 @@ namespace pcpp // set a flag if arrived to the layer being shortened if (curLayer->getPrevLayer() == layer) + { passedExtendedLayer = true; + } // change the data length only for layers who come before the shortened layer. For layers who come after, // data length isn't changed if (!passedExtendedLayer) + { curLayer->m_DataLen -= numOfBytesToShorten; + } // assuming header length of the layer that requested to be extended hasn't been enlarged yet size_t headerLen = curLayer->getHeaderLen() - (curLayer == layer ? numOfBytesToShorten : 0); @@ -702,20 +766,30 @@ namespace pcpp // to use localtime_r and gmtime_r struct tm nowtm_r; if (timeAsLocalTime) + { nowtm = localtime_r(&nowtime, &nowtm_r); + } else + { nowtm = gmtime_r(&nowtime, &nowtm_r); + } if (nowtm != nullptr) + { nowtm = &nowtm_r; + } #else // on Window compilers localtime and gmtime are already thread safe. // in old compilers (< C++0x) gmtime_r and localtime_r were not defined so we have to fall back to localtime and // gmtime if (timeAsLocalTime) + { nowtm = localtime(&nowtime); + } else + { nowtm = gmtime(&nowtime); + } #endif char buf[128]; @@ -726,7 +800,9 @@ namespace pcpp snprintf(buf, sizeof(buf), "%s.%09lu", tmbuf, (unsigned long)timestamp.tv_nsec); } else + { snprintf(buf, sizeof(buf), "0000-00-00 00:00:00.000000000"); + } return "Packet length: " + dataLenStream.str() + " [Bytes], Arrival time: " + std::string(buf); } @@ -735,7 +811,9 @@ namespace pcpp { size_t rawDataLen = (size_t)m_RawPacket->getRawDataLen(); if (rawDataLen == 0) + { return nullptr; + } const uint8_t* rawData = m_RawPacket->getRawData(); diff --git a/Packet++/src/PacketTrailerLayer.cpp b/Packet++/src/PacketTrailerLayer.cpp index f937680de1..da57d1822c 100644 --- a/Packet++/src/PacketTrailerLayer.cpp +++ b/Packet++/src/PacketTrailerLayer.cpp @@ -18,7 +18,9 @@ namespace pcpp std::string trailerStr = byteArrayToHexString(m_Data, m_DataLen, 15); if (m_DataLen > 15) + { trailerStr += "..."; + } return "Packet Trailer, Data: " + trailerStr + ", Length: " + dataLenStream.str() + " [Bytes]"; } diff --git a/Packet++/src/PacketUtils.cpp b/Packet++/src/PacketUtils.cpp index dab0170068..0b606cd136 100644 --- a/Packet++/src/PacketUtils.cpp +++ b/Packet++/src/PacketUtils.cpp @@ -139,13 +139,19 @@ namespace pcpp uint32_t hash5Tuple(Packet* packet, bool const& directionUnique) { if (!packet->isPacketOfType(IPv4) && !packet->isPacketOfType(IPv6)) + { return 0; + } if (packet->isPacketOfType(ICMP)) + { return 0; + } if (!(packet->isPacketOfType(TCP)) && (!packet->isPacketOfType(UDP))) + { return 0; + } ScalarBuffer vec[5]; @@ -169,7 +175,9 @@ namespace pcpp if (!directionUnique) { if (portDst < portSrc) + { srcPosition = 1; + } } vec[0 + srcPosition].buffer = reinterpret_cast(&portSrc); @@ -182,7 +190,9 @@ namespace pcpp { if (!directionUnique && portSrc == portDst && ipv4Layer->getIPv4Header()->ipDst < ipv4Layer->getIPv4Header()->ipSrc) + { srcPosition = 1; + } vec[2 + srcPosition].buffer = reinterpret_cast(&ipv4Layer->getIPv4Header()->ipSrc); vec[2 + srcPosition].len = 4; @@ -196,7 +206,9 @@ namespace pcpp IPv6Layer* ipv6Layer = packet->getLayerOfType(); if (!directionUnique && portSrc == portDst && memcmp(ipv6Layer->getIPv6Header()->ipDst, ipv6Layer->getIPv6Header()->ipSrc, 16) < 0) + { srcPosition = 1; + } vec[2 + srcPosition].buffer = ipv6Layer->getIPv6Header()->ipSrc; vec[2 + srcPosition].len = 16; @@ -212,7 +224,9 @@ namespace pcpp uint32_t hash2Tuple(Packet* packet) { if (!packet->isPacketOfType(IPv4) && !packet->isPacketOfType(IPv6)) + { return 0; + } ScalarBuffer vec[2]; @@ -221,7 +235,9 @@ namespace pcpp { int srcPosition = 0; if (ipv4Layer->getIPv4Header()->ipDst < ipv4Layer->getIPv4Header()->ipSrc) + { srcPosition = 1; + } vec[0 + srcPosition].buffer = reinterpret_cast(&ipv4Layer->getIPv4Header()->ipSrc); vec[0 + srcPosition].len = 4; @@ -233,7 +249,9 @@ namespace pcpp IPv6Layer* ipv6Layer = packet->getLayerOfType(); int srcPosition = 0; if (memcmp(ipv6Layer->getIPv6Header()->ipDst, ipv6Layer->getIPv6Header()->ipSrc, 16) < 0) + { srcPosition = 1; + } vec[0 + srcPosition].buffer = ipv6Layer->getIPv6Header()->ipSrc; vec[0 + srcPosition].len = 16; diff --git a/Packet++/src/RadiusLayer.cpp b/Packet++/src/RadiusLayer.cpp index 72a8a656f6..c2254ba438 100644 --- a/Packet++/src/RadiusLayer.cpp +++ b/Packet++/src/RadiusLayer.cpp @@ -16,7 +16,9 @@ namespace pcpp recordBuffer[0] = static_cast(m_RecType); recordBuffer[1] = static_cast(recSize); if (m_RecValueLen > 0) + { memcpy(recordBuffer + 2, m_RecValue, m_RecValueLen); + } return RadiusAttribute(recordBuffer); } @@ -33,9 +35,13 @@ namespace pcpp hdr->id = id; hdr->length = htobe16(sizeof(radius_header)); if (authenticatorArrSize == 0 || authenticator == nullptr) + { return; + } if (authenticatorArrSize > 16) + { authenticatorArrSize = 16; + } memcpy(hdr->authenticator, authenticator, authenticatorArrSize); } @@ -136,7 +142,9 @@ namespace pcpp { uint16_t len = be16toh(getRadiusHeader()->length); if (len > m_DataLen) + { return m_DataLen; + } return len; } @@ -230,7 +238,9 @@ namespace pcpp int offset = sizeof(radius_header); if (!shortenLayer(offset, getHeaderLen() - offset)) + { return false; + } m_AttributeReader.changeTLVRecordCount(0 - getAttributeCount()); diff --git a/Packet++/src/RawPacket.cpp b/Packet++/src/RawPacket.cpp index 08022885c0..9e14966a86 100644 --- a/Packet++/src/RawPacket.cpp +++ b/Packet++/src/RawPacket.cpp @@ -50,7 +50,9 @@ namespace pcpp void RawPacket::copyDataFrom(const RawPacket& other, bool allocateData) { if (!other.m_RawPacketSet) + { return; + } m_TimeStamp = other.m_TimeStamp; @@ -97,7 +99,9 @@ namespace pcpp void RawPacket::clear() { if (m_RawData != nullptr && m_DeleteRawDataAtDestructor) + { delete[] m_RawData; + } m_RawData = nullptr; m_RawDataLen = 0; @@ -132,7 +136,9 @@ namespace pcpp bool RawPacket::reallocateData(size_t newBufferLength) { if ((int)newBufferLength == m_RawDataLen) + { return true; + } if ((int)newBufferLength < m_RawDataLen) { @@ -145,7 +151,9 @@ namespace pcpp memset(newBuffer, 0, newBufferLength); memcpy(newBuffer, m_RawData, m_RawDataLen); if (m_DeleteRawDataAtDestructor) + { delete[] m_RawData; + } m_DeleteRawDataAtDestructor = true; m_RawData = newBuffer; @@ -165,10 +173,12 @@ namespace pcpp // this is so that resizing of the last layer can occur fast by just reducing the fictional length of the packet // (m_RawDataLen) by the given amount if ((atIndex + (int)numOfBytesToRemove) != m_RawDataLen) + { // memmove copies data as if there was an intermediate buffer in between - so it allows for copying // processes on overlapping src/dest ptrs memmove((uint8_t*)m_RawData + atIndex, (uint8_t*)m_RawData + atIndex + numOfBytesToRemove, m_RawDataLen - (atIndex + numOfBytesToRemove)); + } m_RawDataLen -= numOfBytesToRemove; m_FrameLength = m_RawDataLen; @@ -189,7 +199,9 @@ namespace pcpp bool RawPacket::isLinkTypeValid(int linkTypeValue) { if ((linkTypeValue < 0 || linkTypeValue > 264) && linkTypeValue != 276) + { return false; + } switch (static_cast(linkTypeValue)) { diff --git a/Packet++/src/S7CommLayer.cpp b/Packet++/src/S7CommLayer.cpp index d28d672cb1..f317388d55 100644 --- a/Packet++/src/S7CommLayer.cpp +++ b/Packet++/src/S7CommLayer.cpp @@ -73,7 +73,9 @@ namespace pcpp bool S7CommLayer::isDataValid(const uint8_t* data, size_t dataSize) { if (!data || dataSize < sizeof(s7commhdr)) + { return false; + } return data[0] == 0x32; } diff --git a/Packet++/src/SSHLayer.cpp b/Packet++/src/SSHLayer.cpp index 7181cf6f6d..877ef7f2af 100644 --- a/Packet++/src/SSHLayer.cpp +++ b/Packet++/src/SSHLayer.cpp @@ -19,11 +19,15 @@ namespace pcpp { SSHIdentificationMessage* sshIdnetMsg = SSHIdentificationMessage::tryParse(data, dataLen, prevLayer, packet); if (sshIdnetMsg != nullptr) + { return sshIdnetMsg; + } SSHHandshakeMessage* sshHandshakeMessage = SSHHandshakeMessage::tryParse(data, dataLen, prevLayer, packet); if (sshHandshakeMessage != nullptr) + { return sshHandshakeMessage; + } return new SSHEncryptedMessage(data, dataLen, prevLayer, packet); } @@ -32,7 +36,9 @@ namespace pcpp { size_t headerLen = getHeaderLen(); if (m_DataLen <= headerLen) + { return; + } m_NextLayer = SSHLayer::createSSHMessage(m_Data + headerLen, m_DataLen - headerLen, this, m_Packet); } @@ -45,11 +51,15 @@ namespace pcpp { // Payload must be at least as long as the string "SSH-" if (dataLen < 5) + { return nullptr; + } // Payload must begin with "SSH-" and end with "\n" if (data[0] == 0x53 && data[1] == 0x53 && data[2] == 0x48 && data[3] == 0x2d && data[dataLen - 1] == 0x0a) + { return new SSHIdentificationMessage(data, dataLen, prevLayer, packet); + } return nullptr; } @@ -74,7 +84,9 @@ namespace pcpp { uint8_t messageCode = getMsgBaseHeader()->messageCode; if (messageCode == 20 || messageCode == 21 || (messageCode >= 30 && messageCode <= 34)) + { return static_cast(messageCode); + } return SSHHandshakeMessage::SSH_MSG_UNKNOWN; } @@ -183,17 +195,23 @@ namespace pcpp { m_OffsetsInitialized = true; if (m_DataLen <= sizeof(ssh_message_base) + 16) + { return; + } size_t offset = sizeof(ssh_message_base) + 16; for (int i = 0; i < 10; i++) { if (offset + sizeof(uint32_t) >= m_DataLen) + { return; + } size_t fieldLength = static_cast(be32toh(*reinterpret_cast(m_Data + offset))); if (offset + sizeof(uint32_t) + fieldLength > m_DataLen) + { return; + } PCPP_LOG_DEBUG("Field offset [" << i << "] = " << offset << ", length = " << fieldLength); m_FieldOffsets[i] = offset; @@ -201,7 +219,9 @@ namespace pcpp } if (offset >= m_DataLen) + { return; + } m_FieldOffsets[10] = offset; } @@ -209,10 +229,14 @@ namespace pcpp std::string SSHKeyExchangeInitMessage::getFieldValue(int fieldOffsetIndex) { if (!m_OffsetsInitialized) + { parseMessageAndInitOffsets(); + } if (m_FieldOffsets[fieldOffsetIndex] == 0) + { return ""; + } size_t fieldOffset = m_FieldOffsets[fieldOffsetIndex]; uint32_t fieldLength = be32toh(*reinterpret_cast(m_Data + fieldOffset)); @@ -222,7 +246,9 @@ namespace pcpp uint8_t* SSHKeyExchangeInitMessage::getCookie() { if (m_DataLen < sizeof(ssh_message_base) + 16) + { return nullptr; + } return m_Data + sizeof(ssh_message_base); } @@ -231,7 +257,9 @@ namespace pcpp { uint8_t* cookie = getCookie(); if (cookie == nullptr) + { return ""; + } return byteArrayToHexString(cookie, 16); } @@ -239,10 +267,14 @@ namespace pcpp bool SSHKeyExchangeInitMessage::isFirstKexPacketFollows() { if (!m_OffsetsInitialized) + { parseMessageAndInitOffsets(); + } if (m_FieldOffsets[10] == 0) + { return false; + } return m_Data[m_FieldOffsets[10]] != 0; } diff --git a/Packet++/src/SSLCommon.cpp b/Packet++/src/SSLCommon.cpp index 1ddd0bea97..ba635c29f1 100644 --- a/Packet++/src/SSLCommon.cpp +++ b/Packet++/src/SSLCommon.cpp @@ -12,15 +12,21 @@ namespace pcpp SSLVersion::SSLVersionEnum SSLVersion::asEnum(bool countTlsDraftsAs1_3) { if (m_SSLVersionValue >= 0x0300 && m_SSLVersionValue <= 0x0304) + { return static_cast(m_SSLVersionValue); + } if ((m_SSLVersionValue >= 0x7f0e && m_SSLVersionValue <= 0x7f1c) || m_SSLVersionValue == 0xfb17 || m_SSLVersionValue == 0xfb1a) { if (countTlsDraftsAs1_3) + { return SSLVersion::TLS1_3; + } else + { return static_cast(m_SSLVersionValue); + } } return SSLVersion::Unknown; diff --git a/Packet++/src/SSLHandshake.cpp b/Packet++/src/SSLHandshake.cpp index d8953b4b05..90ae72d918 100644 --- a/Packet++/src/SSLHandshake.cpp +++ b/Packet++/src/SSLHandshake.cpp @@ -1056,9 +1056,13 @@ namespace pcpp { std::unordered_map::const_iterator pos = CipherSuiteIdToObjectMap.find(id); if (pos == CipherSuiteIdToObjectMap.end()) + { return nullptr; + } else + { return pos->second; + } } SSLCipherSuite* SSLCipherSuite::getCipherSuiteByName(std::string name) @@ -1066,9 +1070,13 @@ namespace pcpp uint32_t nameHash = hashString(std::move(name)); std::unordered_map::const_iterator pos = CipherSuiteStringToObjectMap.find(nameHash); if (pos == CipherSuiteStringToObjectMap.end()) + { return nullptr; + } else + { return pos->second; + } } // -------------------- @@ -1084,7 +1092,9 @@ namespace pcpp { uint16_t typeAsInt = getTypeAsInt(); if (typeAsInt <= 24 || typeAsInt == 35 || typeAsInt == 65281) + { return (SSLExtensionType)typeAsInt; + } return SSL_EXT_Unknown; } @@ -1154,7 +1164,9 @@ namespace pcpp { uint8_t listLength = *getData(); if (listLength != static_cast(extensionLength - 1) || listLength % 2 != 0) + { return result; // bad extension data + } uint8_t* dataPtr = getData() + sizeof(uint8_t); for (int i = 0; i < listLength / 2; i++) @@ -1177,11 +1189,15 @@ namespace pcpp uint16_t extensionLength = getLength(); if (extensionLength < sizeof(uint16_t)) + { return result; // bad extension data + } uint16_t listLength = be16toh(*(uint16_t*)getData()); if (listLength != (extensionLength - sizeof(uint16_t)) || listLength % 2 != 0) + { return result; // bad extension data + } uint8_t* dataPtr = getData() + sizeof(uint16_t); for (int i = 0; i < listLength / 2; i++) @@ -1204,7 +1220,9 @@ namespace pcpp uint16_t extensionLength = getLength(); uint8_t listLength = *getData(); if (listLength != static_cast(extensionLength - 1)) + { return result; // bad extension data + } uint8_t* dataPtr = getData() + sizeof(uint8_t); for (int i = 0; i < listLength; i++) @@ -1262,7 +1280,9 @@ namespace pcpp SSLHandshakeLayer* container) { if (dataLen < sizeof(ssl_tls_handshake_layer)) + { return nullptr; + } ssl_tls_handshake_layer* hsMsgHeader = reinterpret_cast(data); @@ -1318,7 +1338,9 @@ namespace pcpp // TODO: add handshakeLayer->length1 to the calculation size_t len = sizeof(ssl_tls_handshake_layer) + be16toh(handshakeLayer->length2); if (len > m_DataLen) + { return m_DataLen; + } return len; } @@ -1326,7 +1348,9 @@ namespace pcpp bool SSLHandshakeMessage::isMessageComplete() const { if (m_DataLen < sizeof(ssl_tls_handshake_layer)) + { return false; + } ssl_tls_handshake_layer* handshakeLayer = reinterpret_cast(m_Data); size_t len = sizeof(ssl_tls_handshake_layer) + be16toh(handshakeLayer->length2); @@ -1344,7 +1368,9 @@ namespace pcpp sizeof(uint16_t) + sizeof(uint16_t) * getCipherSuiteCount() + 2 * sizeof(uint8_t); if (extensionLengthOffset + sizeof(uint16_t) > m_DataLen) + { return; + } uint8_t* extensionLengthPos = m_Data + extensionLengthOffset; uint16_t extensionLength = getExtensionsLength(); @@ -1397,11 +1423,15 @@ namespace pcpp uint8_t SSLClientHelloMessage::getSessionIDLength() const { if (m_DataLen <= sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t)) + { return 0; + } uint8_t val = *(m_Data + sizeof(ssl_tls_client_server_hello)); if ((size_t)val > m_DataLen - sizeof(ssl_tls_client_server_hello) - 1) + { return (uint8_t)(m_DataLen - sizeof(ssl_tls_client_server_hello) - 1); + } return val; } @@ -1409,16 +1439,22 @@ namespace pcpp uint8_t* SSLClientHelloMessage::getSessionID() const { if (getSessionIDLength() > 0) + { return (m_Data + sizeof(ssl_tls_client_server_hello) + 1); + } else + { return nullptr; + } } int SSLClientHelloMessage::getCipherSuiteCount() const { size_t cipherSuiteOffset = sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t) + getSessionIDLength(); if (cipherSuiteOffset + sizeof(uint16_t) > m_DataLen) + { return 0; + } uint16_t cipherSuiteLen = *(uint16_t*)(m_Data + cipherSuiteOffset); return be16toh(cipherSuiteLen) / 2; @@ -1457,7 +1493,9 @@ namespace pcpp size_t offset = sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t) + getSessionIDLength() + sizeof(uint16_t) + sizeof(uint16_t) * getCipherSuiteCount() + sizeof(uint8_t); if (offset + sizeof(uint8_t) > m_DataLen) + { return 0xff; + } uint8_t* pos = m_Data + offset; return *pos; @@ -1474,7 +1512,9 @@ namespace pcpp sizeof(uint16_t) + sizeof(uint16_t) * getCipherSuiteCount() + 2 * sizeof(uint8_t); if (extensionLengthOffset + sizeof(uint16_t) > m_DataLen) + { return 0; + } uint8_t* extensionLengthPos = m_Data + extensionLengthOffset; return be16toh(*(uint16_t*)extensionLengthPos); @@ -1492,7 +1532,9 @@ namespace pcpp { SSLExtension* curElem = const_cast(m_ExtensionList.at(i)); if (curElem->getTypeAsInt() == type) + { return curElem; + } } return nullptr; @@ -1505,7 +1547,9 @@ namespace pcpp { SSLExtension* curElem = const_cast(m_ExtensionList.at(i)); if (curElem->getType() == type) + { return curElem; + } } return nullptr; @@ -1525,7 +1569,9 @@ namespace pcpp bool isValid = false; uint16_t cipherSuiteID = getCipherSuiteID(i, isValid); if (isValid && GreaseSet.find(cipherSuiteID) == GreaseSet.end()) + { result.cipherSuites.push_back(cipherSuiteID); + } } // extract extensions @@ -1534,7 +1580,9 @@ namespace pcpp { uint16_t extensionType = getExtension(i)->getTypeAsInt(); if (GreaseSet.find(extensionType) != GreaseSet.end()) + { continue; + } result.extensions.push_back(extensionType); } @@ -1545,8 +1593,12 @@ namespace pcpp { std::vector supportedGroups = supportedGroupsExt->getSupportedGroups(); for (const auto& iter : supportedGroups) + { if (GreaseSet.find(iter) == GreaseSet.end()) + { result.supportedGroups.push_back(iter); + } + } } // extract EC point formats @@ -1635,7 +1687,9 @@ namespace pcpp size_t extensionLengthOffset = sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t) + getSessionIDLength() + sizeof(uint16_t) + sizeof(uint8_t); if (extensionLengthOffset + sizeof(uint16_t) > m_DataLen) + { return; + } uint8_t* extensionLengthPos = m_Data + extensionLengthOffset; uint16_t extensionLength = getExtensionsLength(); @@ -1684,7 +1738,9 @@ namespace pcpp { std::vector supportedVersions = supportedVersionsExt->getSupportedVersions(); if (supportedVersions.size() == 1) + { return supportedVersions[0]; + } } uint16_t handshakeVersion = be16toh(getServerHelloHeader()->handshakeVersion); @@ -1693,11 +1749,15 @@ namespace pcpp uint8_t SSLServerHelloMessage::getSessionIDLength() const { if (m_DataLen <= sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t)) + { return 0; + } uint8_t val = *(m_Data + sizeof(ssl_tls_client_server_hello)); if ((size_t)val > m_DataLen - sizeof(ssl_tls_client_server_hello) - 1) + { return (uint8_t)(m_DataLen - sizeof(ssl_tls_client_server_hello) - 1); + } return val; } @@ -1705,9 +1765,13 @@ namespace pcpp uint8_t* SSLServerHelloMessage::getSessionID() const { if (getSessionIDLength() > 0) + { return (m_Data + sizeof(ssl_tls_client_server_hello) + 1); + } else + { return nullptr; + } } SSLCipherSuite* SSLServerHelloMessage::getCipherSuite() const @@ -1735,7 +1799,9 @@ namespace pcpp { size_t offset = sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t) + getSessionIDLength() + sizeof(uint16_t); if (offset + sizeof(uint8_t) > m_DataLen) + { return 0xff; + } uint8_t* pos = m_Data + offset; return *pos; @@ -1751,7 +1817,9 @@ namespace pcpp size_t extensionLengthOffset = sizeof(ssl_tls_client_server_hello) + sizeof(uint8_t) + getSessionIDLength() + sizeof(uint16_t) + sizeof(uint8_t); if (extensionLengthOffset + sizeof(uint16_t) > m_DataLen) + { return 0; + } uint16_t* extensionLengthPos = (uint16_t*)(m_Data + extensionLengthOffset); return be16toh(*extensionLengthPos); @@ -1760,7 +1828,9 @@ namespace pcpp SSLExtension* SSLServerHelloMessage::getExtension(int index) const { if (index < 0 || index >= (int)m_ExtensionList.size()) + { return nullptr; + } return const_cast(m_ExtensionList.at(index)); } @@ -1772,7 +1842,9 @@ namespace pcpp { SSLExtension* curElem = const_cast(m_ExtensionList.at(i)); if (curElem->getType() == type) + { return curElem; + } } return nullptr; @@ -1785,7 +1857,9 @@ namespace pcpp { SSLExtension* curElem = const_cast(m_ExtensionList.at(i)); if (curElem->getType() == type) + { return curElem; + } } return nullptr; @@ -1861,7 +1935,9 @@ namespace pcpp : SSLHandshakeMessage(data, dataLen, container) { if (dataLen < sizeof(ssl_tls_handshake_layer) + sizeof(uint8_t) * 3) // certificates length (3B) + { return; + } size_t messageLen = getMessageLength(); // read certificates length @@ -1869,7 +1945,9 @@ namespace pcpp uint8_t* curPos = data + sizeof(ssl_tls_handshake_layer) + sizeof(uint8_t); uint16_t certificatesLength = be16toh(*(uint16_t*)(curPos)); if (certificatesLength == 0) + { return; + } // advance to position of first certificate curPos += sizeof(uint16_t); @@ -1879,7 +1957,9 @@ namespace pcpp // try to read certificate length (3B) // TODO: certificate length is 3B. Currently assuming the MSB is 0 and reading only 2 LSBs if (curPos + 3 * sizeof(uint8_t) - data > (int)messageLen) + { break; + } // read certificate length curPos += sizeof(uint8_t); @@ -1952,7 +2032,9 @@ namespace pcpp uint8_t* SSLServerKeyExchangeMessage::getServerKeyExchangeParams() const { if (getMessageLength() > sizeof(ssl_tls_handshake_layer)) + { return (m_Data + sizeof(ssl_tls_handshake_layer)); + } return nullptr; } @@ -1961,7 +2043,9 @@ namespace pcpp { size_t msgLength = getMessageLength(); if (msgLength <= sizeof(ssl_tls_handshake_layer)) + { return 0; + } return msgLength - sizeof(ssl_tls_handshake_layer); } @@ -1978,7 +2062,9 @@ namespace pcpp uint8_t* SSLClientKeyExchangeMessage::getClientKeyExchangeParams() const { if (getMessageLength() > sizeof(ssl_tls_handshake_layer)) + { return (m_Data + sizeof(ssl_tls_handshake_layer)); + } return nullptr; } @@ -1987,7 +2073,9 @@ namespace pcpp { size_t msgLength = getMessageLength(); if (msgLength <= sizeof(ssl_tls_handshake_layer)) + { return 0; + } return msgLength - sizeof(ssl_tls_handshake_layer); } @@ -2007,25 +2095,35 @@ namespace pcpp { size_t minMessageSize = sizeof(ssl_tls_handshake_layer) + sizeof(uint8_t); // certificate types count (1B) if (dataLen < minMessageSize) + { return; + } size_t messageLen = getMessageLength(); if (messageLen < minMessageSize) + { return; + } uint8_t certificateTypesCount = *(uint8_t*)(data + sizeof(ssl_tls_handshake_layer)); if (certificateTypesCount > messageLen - minMessageSize) + { certificateTypesCount = messageLen - minMessageSize; + } uint8_t* pos = data + sizeof(ssl_tls_handshake_layer) + sizeof(uint8_t); for (uint8_t i = 0; i < certificateTypesCount; i++) { uint8_t certType = *(uint8_t*)(pos + i); if (certType == 0 || (certType > 6 && certType < 20) || (certType > 20 && certType < 64) || certType > 64) + { m_ClientCertificateTypes.push_back(SSL_CCT_UNKNOWN); + } else + { m_ClientCertificateTypes.push_back(static_cast(certType)); + } } } @@ -2040,7 +2138,9 @@ namespace pcpp size_t offset = sizeof(ssl_tls_handshake_layer) + sizeof(uint8_t) + m_ClientCertificateTypes.size() + sizeof(uint16_t); if (offset >= messageLen) + { return nullptr; + } return m_Data + offset; } @@ -2050,14 +2150,18 @@ namespace pcpp size_t messageLen = getMessageLength(); size_t offset = sizeof(ssl_tls_handshake_layer) + sizeof(uint8_t) + m_ClientCertificateTypes.size(); if (offset + sizeof(uint16_t) >= messageLen) + { return 0; + } uint16_t certAuthLen = be16toh(*(uint16_t*)(m_Data + offset)); offset += sizeof(uint16_t); if (messageLen - offset < certAuthLen) + { return messageLen - offset; + } return certAuthLen; } @@ -2074,7 +2178,9 @@ namespace pcpp uint8_t* SSLCertificateVerifyMessage::getSignedHash() const { if (getMessageLength() > sizeof(ssl_tls_handshake_layer)) + { return (m_Data + sizeof(ssl_tls_handshake_layer)); + } return nullptr; } @@ -2083,7 +2189,9 @@ namespace pcpp { size_t msgLength = getMessageLength(); if (msgLength <= sizeof(ssl_tls_handshake_layer)) + { return 0; + } return msgLength - sizeof(ssl_tls_handshake_layer); } @@ -2100,7 +2208,9 @@ namespace pcpp uint8_t* SSLFinishedMessage::getSignedHash() const { if (getMessageLength() > sizeof(ssl_tls_handshake_layer)) + { return (m_Data + sizeof(ssl_tls_handshake_layer)); + } return nullptr; } @@ -2109,7 +2219,9 @@ namespace pcpp { size_t msgLength = getMessageLength(); if (msgLength <= sizeof(ssl_tls_handshake_layer)) + { return 0; + } return msgLength - sizeof(ssl_tls_handshake_layer); } @@ -2126,7 +2238,9 @@ namespace pcpp uint8_t* SSLNewSessionTicketMessage::getSessionTicketData() const { if (getMessageLength() > sizeof(ssl_tls_handshake_layer)) + { return (m_Data + sizeof(ssl_tls_handshake_layer)); + } return nullptr; } @@ -2135,7 +2249,9 @@ namespace pcpp { size_t msgLength = getMessageLength(); if (msgLength <= sizeof(ssl_tls_handshake_layer)) + { return 0; + } return msgLength - sizeof(ssl_tls_handshake_layer); } diff --git a/Packet++/src/SSLLayer.cpp b/Packet++/src/SSLLayer.cpp index e83b789c07..a196e8c148 100644 --- a/Packet++/src/SSLLayer.cpp +++ b/Packet++/src/SSLLayer.cpp @@ -15,28 +15,40 @@ namespace pcpp { // check the port map first if (!ignorePorts && !isSSLPort(srcPort) && !isSSLPort(dstPort)) + { return false; + } if (dataLen < sizeof(ssl_tls_record_layer)) + { return false; + } ssl_tls_record_layer* recordLayer = (ssl_tls_record_layer*)data; // there is no SSL message with length 0 if (recordLayer->length == 0) + { return false; + } if (recordLayer->recordType < 20 || recordLayer->recordType > 23) + { return false; + } SSLVersion::SSLVersionEnum recordVersion = SSLVersion(be16toh(recordLayer->recordVersion)).asEnum(true); if (recordVersion == SSLVersion::TLS1_3 || recordVersion == SSLVersion::TLS1_2 || recordVersion == SSLVersion::TLS1_1 || recordVersion == SSLVersion::TLS1_0 || recordVersion == SSLVersion::SSL3) + { return true; + } else + { return false; + } } SSLLayer* SSLLayer::createSSLMessage(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet) @@ -84,7 +96,9 @@ namespace pcpp { size_t len = sizeof(ssl_tls_record_layer) + be16toh(getRecordLayer()->length); if (len > m_DataLen) + { return m_DataLen; + } return len; } @@ -92,10 +106,14 @@ namespace pcpp { size_t headerLen = getHeaderLen(); if (m_DataLen <= headerLen) + { return; + } if (SSLLayer::IsSSLMessage(0, 0, m_Data + headerLen, m_DataLen - headerLen, true)) + { m_NextLayer = SSLLayer::createSSLMessage(m_Data + headerLen, m_DataLen - headerLen, this, m_Packet); + } } // ------------------------- @@ -109,9 +127,13 @@ namespace pcpp for (size_t i = 0; i < m_MessageList.size(); i++) { if (i == 0) + { result << " " << m_MessageList.at(i)->toString(); + } else + { result << ", " << m_MessageList.at(i)->toString(); + } } return result.str(); } @@ -122,7 +144,9 @@ namespace pcpp uint8_t* curPos = m_Data + sizeof(ssl_tls_record_layer); size_t recordDataLen = be16toh(getRecordLayer()->length); if (recordDataLen > m_DataLen - sizeof(ssl_tls_record_layer)) + { recordDataLen = m_DataLen - sizeof(ssl_tls_record_layer); + } size_t curPosIndex = 0; while (true) @@ -130,7 +154,9 @@ namespace pcpp SSLHandshakeMessage* message = SSLHandshakeMessage::createHandshakeMessage(curPos, recordDataLen - curPosIndex, this); if (message == nullptr) + { break; + } m_MessageList.pushBack(message); curPos += message->getMessageLength(); @@ -141,7 +167,9 @@ namespace pcpp SSLHandshakeMessage* SSLHandshakeLayer::getHandshakeMessageAt(int index) const { if (index < 0 || index >= (int)(m_MessageList.size())) + { return nullptr; + } return const_cast(m_MessageList.at(index)); } @@ -166,15 +194,21 @@ namespace pcpp uint8_t* pos = m_Data + sizeof(ssl_tls_record_layer); uint8_t alertLevel = *pos; if (alertLevel == SSL_ALERT_LEVEL_WARNING || alertLevel == SSL_ALERT_LEVEL_FATAL) + { return (SSLAlertLevel)alertLevel; + } else + { return SSL_ALERT_LEVEL_ENCRYPTED; + } } SSLAlertDescription SSLAlertLayer::getAlertDescription() { if (getAlertLevel() == SSL_ALERT_LEVEL_ENCRYPTED) + { return SSL_ALERT_ENCRYPTED; + } uint8_t* pos = m_Data + sizeof(ssl_tls_record_layer) + sizeof(uint8_t); uint8_t alertDesc = *pos; @@ -217,10 +251,14 @@ namespace pcpp std::stringstream result; result << getRecordVersion().toString(true) << " Layer, "; if (getAlertLevel() == SSL_ALERT_LEVEL_ENCRYPTED) + { result << "Encrypted Alert"; + } else + { // TODO: add alert level and description here result << "Alert"; + } return result.str(); } @@ -231,7 +269,9 @@ namespace pcpp uint8_t* SSLApplicationDataLayer::getEncryptedData() const { if (getHeaderLen() <= sizeof(ssl_tls_record_layer)) + { return nullptr; + } return m_Data + sizeof(ssl_tls_record_layer); } @@ -240,7 +280,9 @@ namespace pcpp { int result = (int)getHeaderLen() - (int)sizeof(ssl_tls_record_layer); if (result < 0) + { return 0; + } return (size_t)result; } diff --git a/Packet++/src/SdpLayer.cpp b/Packet++/src/SdpLayer.cpp index 5fa2fd0e94..cd100cff0a 100644 --- a/Packet++/src/SdpLayer.cpp +++ b/Packet++/src/SdpLayer.cpp @@ -13,7 +13,9 @@ namespace pcpp std::stringstream stream(str); std::vector result; while (stream >> buf) + { result.push_back(buf); + } return result; } @@ -74,14 +76,20 @@ namespace pcpp { HeaderField* originator = getFieldByName(PCPP_SDP_ORIGINATOR_FIELD); if (originator == nullptr) + { return IPv4Address::Zero; + } std::vector tokens = splitByWhiteSpaces(originator->getFieldValue()); if (tokens.size() < 6) + { return IPv4Address::Zero; + } if (tokens[3] != "IN" || tokens[4] != "IP4") + { return IPv4Address::Zero; + } try { @@ -103,7 +111,9 @@ namespace pcpp std::vector tokens = splitByWhiteSpaces(mediaDesc->getFieldValue()); if (tokens.size() >= 2 && tokens[0] == mediaType) + { return atoi(tokens[1].c_str()); + } mediaFieldIndex++; mediaDesc = getFieldByName(PCPP_SDP_MEDIA_NAME_FIELD, mediaFieldIndex); diff --git a/Packet++/src/SingleCommandTextProtocol.cpp b/Packet++/src/SingleCommandTextProtocol.cpp index aa7b4882b0..06fe932be7 100644 --- a/Packet++/src/SingleCommandTextProtocol.cpp +++ b/Packet++/src/SingleCommandTextProtocol.cpp @@ -15,9 +15,13 @@ namespace pcpp { size_t maxLen; if (m_DataLen < MAX_COMMAND_LENGTH) + { maxLen = m_DataLen; + } else + { maxLen = MAX_COMMAND_LENGTH; + } // To correctly detect multi-line packets with the option containing a space in // the first MAX_CONTENT_LENGTH bytes, search the both of hyphen and space to take @@ -31,13 +35,19 @@ namespace pcpp // No delimiter or packet end if (posHyphen == std::string::npos && posSpace == std::string::npos && posCRLF == std::string::npos) + { return 0; + } // Both hyphen and space found else if (posHyphen != std::string::npos || posSpace != std::string::npos) + { return std::min(posSpace, posHyphen); + } // If nothing found but there is a CRLF it is a only command packet else if (posCRLF != std::string::npos) + { return posCRLF; + } return 0; } @@ -45,9 +55,13 @@ namespace pcpp void SingleCommandTextProtocol::setDelimiter(bool hyphen) { if (hyphen) + { memset(&m_Data[getArgumentFieldOffset()], ASCII_HYPHEN, 1); + } else + { memset(&m_Data[getArgumentFieldOffset()], ASCII_SPACE, 1); + } } bool SingleCommandTextProtocol::hyphenRequired(const std::string& value) @@ -64,28 +78,40 @@ namespace pcpp m_Data = new uint8_t[MIN_PACKET_LENGTH]; m_DataLen = MIN_PACKET_LENGTH; if (!command.empty()) + { setCommandInternal(command); + } if (!option.empty()) + { setCommandOptionInternal(option); + } } bool SingleCommandTextProtocol::setCommandInternal(std::string value) { size_t currentOffset = getArgumentFieldOffset(); if (currentOffset == m_DataLen - 1) + { currentOffset = 0; + } if (!currentOffset) + { value += " \r\n"; + } if (value.size() < currentOffset) { if (!shortenLayer(0, currentOffset - value.size())) + { return false; + } } else if (m_Data && value.size() > currentOffset) { if (!extendLayer(0, value.size() - currentOffset)) + { return false; + } } memcpy(m_Data, value.c_str(), value.size()); @@ -96,27 +122,37 @@ namespace pcpp { size_t lastPos = value.rfind("\r\n"); if (lastPos == std::string::npos || lastPos != value.size() - 2) + { value += "\r\n"; + } size_t currentOffset = getArgumentFieldOffset() + 1; if (value.size() < (m_DataLen - currentOffset)) { if (!shortenLayer(currentOffset, (m_DataLen - currentOffset) - value.size())) + { return false; + } } else if (m_Data && value.size() > (m_DataLen - currentOffset)) { if (!extendLayer(currentOffset, value.size() - (m_DataLen - currentOffset))) + { return false; + } } memcpy(&m_Data[currentOffset], value.c_str(), value.size()); if (hyphenRequired(value)) + { setDelimiter(true); + } else + { setDelimiter(false); + } return true; } @@ -126,7 +162,9 @@ namespace pcpp // If there is no option remove trailing newline characters if (offset == (m_DataLen - 1) && offset > 1) + { return std::string(reinterpret_cast(m_Data), offset - 1); + } return std::string(reinterpret_cast(m_Data), offset); } @@ -170,7 +208,9 @@ namespace pcpp bool SingleCommandTextProtocol::isDataValid(const uint8_t* data, size_t dataSize) { if (data == nullptr || dataSize < MIN_PACKET_LENGTH) + { return false; + } std::string payload = std::string(reinterpret_cast(data), dataSize); return payload.rfind("\r\n") == dataSize - 2; diff --git a/Packet++/src/SipLayer.cpp b/Packet++/src/SipLayer.cpp index ac9acb1289..7a1a08a4e2 100644 --- a/Packet++/src/SipLayer.cpp +++ b/Packet++/src/SipLayer.cpp @@ -43,7 +43,9 @@ namespace pcpp ::tolower); HeaderField* contentLengthField = getFieldByName(contentLengthFieldName); if (contentLengthField != nullptr) + { return atoi(contentLengthField->getFieldValue().c_str()); + } return 0; } @@ -59,7 +61,9 @@ namespace pcpp contentLengthField = insertField(prevField, PCPP_SIP_CONTENT_LENGTH_FIELD, contentLengthAsString.str()); } else + { contentLengthField->setFieldValue(contentLengthAsString.str()); + } return contentLengthField; } @@ -67,7 +71,9 @@ namespace pcpp void SipLayer::parseNextLayer() { if (getLayerPayloadSize() == 0) + { return; + } size_t headerLen = getHeaderLen(); std::string contentType; @@ -75,7 +81,9 @@ namespace pcpp { HeaderField* contentTypeField = getFieldByName(PCPP_SIP_CONTENT_TYPE_FIELD); if (contentTypeField != nullptr) + { contentType = contentTypeField->getFieldValue(); + } } if (contentType.find("application/sdp") != std::string::npos) @@ -92,14 +100,18 @@ namespace pcpp { HeaderField* contentLengthField = getFieldByName(PCPP_SIP_CONTENT_LENGTH_FIELD); if (contentLengthField == nullptr) + { return; + } size_t headerLen = getHeaderLen(); if (m_DataLen > headerLen) { int currentContentLength = getContentLength(); if (currentContentLength != static_cast(m_DataLen - headerLen)) + { setContentLength(m_DataLen - headerLen); + } } } @@ -114,7 +126,9 @@ namespace pcpp PCPP_LOG_DEBUG("Couldn't resolve SIP request method"); } else + { m_UriOffset = SipMethodEnumToString[m_Method].length() + 1; + } parseVersion(); @@ -241,7 +255,9 @@ namespace pcpp int endOfVerPos = 0; while (((verPos + endOfVerPos) < reinterpret_cast(m_SipRequest->m_Data + m_SipRequest->m_DataLen)) && ((verPos + endOfVerPos)[0] != '\r') && ((verPos + endOfVerPos)[0] != '\n')) + { endOfVerPos++; + } m_Version = std::string(verPos, endOfVerPos); @@ -297,8 +313,10 @@ namespace pcpp { std::string result; if (m_UriOffset != -1 && m_VersionOffset != -1) + { result.assign(reinterpret_cast(m_SipRequest->m_Data + m_UriOffset), m_VersionOffset - 1 - m_UriOffset); + } // else first line is illegal, return empty string @@ -374,7 +392,9 @@ namespace pcpp SipLayer::operator=(other); if (m_FirstLine != nullptr) + { delete m_FirstLine; + } m_FirstLine = new SipRequestFirstLine(this); @@ -616,7 +636,9 @@ namespace pcpp SipLayer::operator=(other); if (m_FirstLine != nullptr) + { delete m_FirstLine; + } m_FirstLine = new SipResponseFirstLine(this); @@ -670,7 +692,9 @@ namespace pcpp { int statusStringEndOffset = m_FirstLineEndOffset - 2; if ((*(m_SipResponse->m_Data + statusStringEndOffset)) != '\r') + { statusStringEndOffset++; + } result.assign(reinterpret_cast(m_SipResponse->m_Data + statusStringOffset), statusStringEndOffset - statusStringOffset); } @@ -693,7 +717,9 @@ namespace pcpp size_t statusStringOffset = 12; if (statusCodeString == "") + { statusCodeString = StatusCodeEnumToString[newStatusCode]; + } int lengthDifference = statusCodeString.length() - getStatusCodeString().length(); if (lengthDifference > 0) @@ -736,7 +762,9 @@ namespace pcpp void SipResponseFirstLine::setVersion(const std::string& newVersion) { if (newVersion == "") + { return; + } if (newVersion.length() != m_Version.length()) { @@ -830,7 +858,9 @@ namespace pcpp std::ostringstream statusCodeAsString; statusCodeAsString << StatusCodeEnumToInt[m_StatusCode]; if (statusCodeString == "") + { statusCodeString = StatusCodeEnumToString[m_StatusCode]; + } std::string firstLine = m_Version + " " + statusCodeAsString.str() + " " + statusCodeString + "\r\n"; m_FirstLineEndOffset = firstLine.length(); @@ -858,7 +888,9 @@ namespace pcpp const char* nextSpace = static_cast(memchr(data, ' ', dataLen)); if (nextSpace == nullptr) + { return ""; + } return std::string(data, nextSpace - data); } diff --git a/Packet++/src/Sll2Layer.cpp b/Packet++/src/Sll2Layer.cpp index 8bcbd3cedd..2c0893d567 100644 --- a/Packet++/src/Sll2Layer.cpp +++ b/Packet++/src/Sll2Layer.cpp @@ -59,7 +59,9 @@ namespace pcpp void Sll2Layer::parseNextLayer() { if (m_DataLen <= sizeof(sll2_header)) + { return; + } uint8_t* payload = m_Data + sizeof(sll2_header); size_t payloadLen = m_DataLen - sizeof(sll2_header); @@ -105,7 +107,9 @@ namespace pcpp void Sll2Layer::computeCalculateFields() { if (m_NextLayer == nullptr) + { return; + } sll2_header* hdr = getSll2Header(); switch (m_NextLayer->getProtocol()) diff --git a/Packet++/src/SllLayer.cpp b/Packet++/src/SllLayer.cpp index 9e2141f9c1..b5156c8a70 100644 --- a/Packet++/src/SllLayer.cpp +++ b/Packet++/src/SllLayer.cpp @@ -51,7 +51,9 @@ namespace pcpp void SllLayer::parseNextLayer() { if (m_DataLen <= sizeof(sll_header)) + { return; + } uint8_t* payload = m_Data + sizeof(sll_header); size_t payloadLen = m_DataLen - sizeof(sll_header); @@ -97,7 +99,9 @@ namespace pcpp void SllLayer::computeCalculateFields() { if (m_NextLayer == nullptr) + { return; + } sll_header* hdr = getSllHeader(); switch (m_NextLayer->getProtocol()) diff --git a/Packet++/src/SomeIpLayer.cpp b/Packet++/src/SomeIpLayer.cpp index baf8a06e7b..7d84779eb5 100644 --- a/Packet++/src/SomeIpLayer.cpp +++ b/Packet++/src/SomeIpLayer.cpp @@ -48,16 +48,22 @@ namespace pcpp // Ideas taken from wireshark some ip dissector const size_t headerLen = sizeof(someiphdr); if (dataLen < headerLen) + { return new PayloadLayer(data, dataLen, prevLayer, packet); + } uint32_t lengthBE = 0; memcpy(&lengthBE, data + sizeof(uint32_t), sizeof(uint32_t)); // length field in SOME/IP header uint32_t length = be32toh(lengthBE); if ((length < 8) || (length > dataLen - 8)) + { return new PayloadLayer(data, dataLen, prevLayer, packet); + } if (data[12] != SOMEIP_PROTOCOL_VERSION) + { return new PayloadLayer(data, dataLen, prevLayer, packet); + } someiphdr* hdr = (someiphdr*)data; @@ -259,7 +265,9 @@ namespace pcpp { size_t headerLen = getHeaderLen(); if (m_DataLen <= headerLen) + { return; + } uint8_t* payload = m_Data + headerLen; size_t payloadLen = m_DataLen - headerLen; diff --git a/Packet++/src/SomeIpSdLayer.cpp b/Packet++/src/SomeIpSdLayer.cpp index b92edf5552..5ad6965c53 100644 --- a/Packet++/src/SomeIpSdLayer.cpp +++ b/Packet++/src/SomeIpSdLayer.cpp @@ -13,7 +13,9 @@ namespace pcpp SomeIpSdOption::~SomeIpSdOption() { if (m_ShadowData != nullptr) + { delete[] m_ShadowData; + } } SomeIpSdOption::OptionType SomeIpSdOption::getType() const @@ -24,7 +26,9 @@ namespace pcpp uint8_t* SomeIpSdOption::getDataPtr() const { if (m_DataContainer != nullptr) + { return m_DataContainer->getDataPtr(m_Offset); + } return m_ShadowData; } @@ -281,13 +285,17 @@ namespace pcpp SomeIpSdEntry::~SomeIpSdEntry() { if (m_ShadowData != nullptr) + { delete[] m_ShadowData; + } } uint8_t* SomeIpSdEntry::getDataPtr() const { if (m_Layer != nullptr) + { return m_Layer->getDataPtr(m_Offset); + } return m_ShadowData; } @@ -540,7 +548,9 @@ namespace pcpp OptionPtr option; if (index >= getNumEntries()) + { return vecOptions; + } size_t remainingLen = getLenOptions(); size_t offset = sizeof(someipsdhdr) + sizeof(uint32_t) + getLenEntries() + sizeof(uint32_t); @@ -655,12 +665,16 @@ namespace pcpp while (len < lenOptions) { if (len + sizeof(uint16_t) + 3 * sizeof(uint8_t) > lenOptions) + { return false; + } uint32_t lenOption = be16toh(*((uint16_t*)(data + offsetOption + len))) + 3 * sizeof(uint8_t); len += lenOption; if (len > lenOptions) // the last one must be equal to lenOptions + { return false; + } ++(count); } diff --git a/Packet++/src/StpLayer.cpp b/Packet++/src/StpLayer.cpp index 0eda516624..4af81356b1 100644 --- a/Packet++/src/StpLayer.cpp +++ b/Packet++/src/StpLayer.cpp @@ -44,13 +44,17 @@ namespace pcpp : nullptr; case 0x02: if (ptr->version == 0x2) + { return RapidStpLayer::isDataValid(data, dataLen) ? new RapidStpLayer(data, dataLen, prevLayer, packet) : nullptr; + } if (ptr->version == 0x3) + { return MultipleStpLayer::isDataValid(data, dataLen) ? new MultipleStpLayer(data, dataLen, prevLayer, packet) : nullptr; + } PCPP_LOG_DEBUG("Unknown Spanning Tree Version"); return nullptr; case 0x80: @@ -82,7 +86,9 @@ namespace pcpp void StpTopologyChangeBPDULayer::parseNextLayer() { if (m_DataLen > sizeof(stp_tcn_bpdu)) + { m_NextLayer = new PayloadLayer(m_Data, m_DataLen - sizeof(stp_tcn_bpdu), this, m_Packet); + } } // ---------------------- Class StpConfigurationBPDULayer ---------------------- @@ -227,7 +233,9 @@ namespace pcpp void StpConfigurationBPDULayer::parseNextLayer() { if (m_DataLen > sizeof(stp_conf_bpdu)) + { m_NextLayer = new PayloadLayer(m_Data, m_DataLen - sizeof(stp_conf_bpdu), this, m_Packet); + } } // ---------------------- Class RapidStpLayer ---------------------- @@ -242,7 +250,9 @@ namespace pcpp void RapidStpLayer::parseNextLayer() { if (m_DataLen > sizeof(rstp_conf_bpdu)) + { m_NextLayer = new PayloadLayer(m_Data, m_DataLen - sizeof(rstp_conf_bpdu), this, m_Packet); + } } // ---------------------- Class MultipleStpLayer ---------------------- @@ -341,7 +351,9 @@ namespace pcpp msti_conf_msg* MultipleStpLayer::getMstiConfMessages() const { if (getNumberOfMSTIConfMessages()) + { return reinterpret_cast(m_Data + sizeof(mstp_conf_bpdu)); + } return nullptr; } diff --git a/Packet++/src/TLVData.cpp b/Packet++/src/TLVData.cpp index 48da747aa2..73dba45e0f 100644 --- a/Packet++/src/TLVData.cpp +++ b/Packet++/src/TLVData.cpp @@ -95,7 +95,9 @@ namespace pcpp TLVRecordBuilder::~TLVRecordBuilder() { if (m_RecValue != nullptr) + { delete[] m_RecValue; + } } void TLVRecordBuilder::init(uint32_t recType, const uint8_t* recValue, size_t recValueLen) @@ -104,9 +106,13 @@ namespace pcpp m_RecValueLen = recValueLen; m_RecValue = new uint8_t[recValueLen]; if (recValue != nullptr) + { memcpy(m_RecValue, recValue, recValueLen); + } else + { memset(m_RecValue, 0, recValueLen); + } } } // namespace pcpp diff --git a/Packet++/src/TcpLayer.cpp b/Packet++/src/TcpLayer.cpp index 0250b5e7b0..2473b3b10d 100644 --- a/Packet++/src/TcpLayer.cpp +++ b/Packet++/src/TcpLayer.cpp @@ -88,7 +88,9 @@ namespace pcpp { recordBuffer[1] = static_cast(optionSize); if (optionSize > 2 && m_RecValue != nullptr) + { memcpy(recordBuffer + 2, m_RecValue, m_RecValueLen); + } } return TcpOption(recordBuffer); @@ -124,7 +126,9 @@ namespace pcpp TcpOption nextOpt = m_OptionReader.getNextTLVRecord(tcpOption, getOptionsBasePtr(), getHeaderLen() - sizeof(tcphdr)); if (nextOpt.isNotNull() && nextOpt.getType() == TCPOPT_DUMMY) + { return TcpOption(nullptr); + } return nextOpt; } @@ -201,7 +205,9 @@ namespace pcpp const int offset = sizeof(tcphdr); if (!shortenLayer(offset, getHeaderLen() - offset)) + { return false; + } getTcpHeader()->dataOffset = sizeof(tcphdr) / 4; m_NumOfTrailingBytes = 0; @@ -213,7 +219,9 @@ namespace pcpp { TcpOption newOption = optionBuilder.build(); if (newOption.isNull()) + { return newOption; + } // calculate total TCP option size TcpOption curOpt = getFirstTcpOption(); @@ -251,17 +259,25 @@ namespace pcpp { int newNumberOfTrailingBytes = 0; while ((totalOptSize + newNumberOfTrailingBytes) % 4 != 0) + { newNumberOfTrailingBytes++; + } if (newNumberOfTrailingBytes < m_NumOfTrailingBytes) + { shortenLayer(sizeof(tcphdr) + totalOptSize, m_NumOfTrailingBytes - newNumberOfTrailingBytes - 1); + } else if (newNumberOfTrailingBytes > m_NumOfTrailingBytes) + { extendLayer(sizeof(tcphdr) + totalOptSize, newNumberOfTrailingBytes - m_NumOfTrailingBytes); + } m_NumOfTrailingBytes = newNumberOfTrailingBytes; for (int i = 0; i < m_NumOfTrailingBytes; i++) + { m_Data[sizeof(tcphdr) + totalOptSize + i] = TCPOPT_DUMMY; + } getTcpHeader()->dataOffset = (sizeof(tcphdr) + totalOptSize + m_NumOfTrailingBytes) / 4; } @@ -301,9 +317,13 @@ namespace pcpp } if (writeResultToPacket) + { tcpHdr->headerChecksum = htobe16(checksumRes); + } else + { tcpHdr->headerChecksum = currChecksumValue; + } return checksumRes; } @@ -360,7 +380,9 @@ namespace pcpp { const size_t headerLen = getHeaderLen(); if (m_DataLen <= headerLen) + { return; + } uint8_t* payload = m_Data + headerLen; const size_t payloadLen = m_DataLen - headerLen; @@ -403,7 +425,9 @@ namespace pcpp { m_NextLayer = BgpLayer::parseBgpLayer(payload, payloadLen, this, m_Packet); if (!m_NextLayer) + { constructNextLayer(payload, payloadLen, m_Packet); + } } else if (SSHLayer::isSSHPort(portSrc, portDst)) { @@ -436,7 +460,9 @@ namespace pcpp { m_NextLayer = DoIpLayer::parseDoIpLayer(payload, payloadLen, this, m_Packet); if (!m_NextLayer) + { constructNextLayer(payload, payloadLen, m_Packet); + } } else if (SomeIpLayer::isSomeIpPort(portSrc) || SomeIpLayer::isSomeIpPort(portDst)) { @@ -458,7 +484,9 @@ namespace pcpp { m_NextLayer = LdapLayer::parseLdapMessage(payload, payloadLen, this, m_Packet); if (!m_NextLayer) + { constructNextLayer(payload, payloadLen, m_Packet); + } } else if ((GtpV2Layer::isGTPv2Port(portDst) || GtpV2Layer::isGTPv2Port(portSrc)) && GtpV2Layer::isDataValid(payload, payloadLen)) @@ -490,19 +518,29 @@ namespace pcpp if (hdr->synFlag) { if (hdr->ackFlag) + { result += "[SYN, ACK], "; + } else + { result += "[SYN], "; + } } else if (hdr->finFlag) { if (hdr->ackFlag) + { result += "[FIN, ACK], "; + } else + { result += "[FIN], "; + } } else if (hdr->ackFlag) + { result += "[ACK], "; + } std::ostringstream srcPortStream; srcPortStream << getSrcPort(); diff --git a/Packet++/src/TcpReassembly.cpp b/Packet++/src/TcpReassembly.cpp index 165d594c75..114a0bfeef 100644 --- a/Packet++/src/TcpReassembly.cpp +++ b/Packet++/src/TcpReassembly.cpp @@ -101,7 +101,9 @@ namespace pcpp dstIP = ipLayer->getDstIPAddress(); } else + { return NonIpPacket; + } // Ignore non-TCP packets TcpLayer* tcpLayer = tcpData.getLayerOfType(true); // lookup in reverse order @@ -165,7 +167,9 @@ namespace pcpp // fire connection start callback if (m_OnConnStart != nullptr) + { m_OnConnStart(tcpReassemblyData->connData, m_UserCookie); + } } else // connection already exists { @@ -317,7 +321,9 @@ namespace pcpp // set initial sequence tcpReassemblyData->twoSides[sideIndex].sequence = sequence + tcpPayloadSize; if (tcpLayer->getTcpHeader()->synFlag != 0) + { tcpReassemblyData->twoSides[sideIndex].sequence++; + } // send data to the callback if (tcpPayloadSize != 0 && m_OnMessageReadyCallback != nullptr) @@ -330,7 +336,9 @@ namespace pcpp // handle case where this packet is FIN or RST (although it's unlikely) if (isFinOrRst) + { handleFinOrRst(tcpReassemblyData, sideIndex, flowKey, isRst); + } // return - nothing else to do here return status; @@ -373,7 +381,9 @@ namespace pcpp // handle case where this packet is FIN or RST if (isFinOrRst) + { handleFinOrRst(tcpReassemblyData, sideIndex, flowKey, isRst); + } // return - nothing else to do here return status; @@ -408,7 +418,9 @@ namespace pcpp // if this is a SYN packet - add +1 to the sequence if (tcpLayer->getTcpHeader()->synFlag != 0) + { tcpReassemblyData->twoSides[sideIndex].sequence++; + } // send the data to the callback if (m_OnMessageReadyCallback != nullptr) @@ -425,7 +437,9 @@ namespace pcpp // handle case where this packet is FIN or RST if (isFinOrRst) + { handleFinOrRst(tcpReassemblyData, sideIndex, flowKey, isRst); + } // return - nothing else to do here return status; @@ -504,7 +518,9 @@ namespace pcpp { // if this side already saw a FIN or RST packet, do nothing and return if (tcpReassemblyData->twoSides[sideIndex].gotFinOrRst) + { return; + } PCPP_LOG_DEBUG("Handling FIN or RST packet on side " << static_cast(sideIndex)); @@ -520,11 +536,15 @@ namespace pcpp return; } else + { checkOutOfOrderFragments(tcpReassemblyData, sideIndex, true); + } // and if it's a rst, close the flow unilaterally if (isRst) + { closeConnectionInternal(flowKey, TcpReassembly::TcpReassemblyConnectionClosedByFIN_RST); + } } void TcpReassembly::checkOutOfOrderFragments(TcpReassemblyData* tcpReassemblyData, int8_t sideIndex, @@ -737,7 +757,9 @@ namespace pcpp TcpReassemblyData& tcpReassemblyData = iter->second; if (tcpReassemblyData.closed) // the connection is already closed + { return; + } PCPP_LOG_DEBUG("Closing connection with flow key 0x" << std::hex << flowKey); @@ -748,7 +770,9 @@ namespace pcpp checkOutOfOrderFragments(&tcpReassemblyData, 1, true); if (m_OnConnEnd != nullptr) + { m_OnConnEnd(tcpReassemblyData.connData, reason, m_UserCookie); + } tcpReassemblyData.closed = true; // mark the connection as closed insertIntoCleanupList(flowKey); @@ -766,7 +790,9 @@ namespace pcpp TcpReassemblyData& tcpReassemblyData = iter->second; if (tcpReassemblyData.closed) // the connection is already closed, skip it + { continue; + } uint32_t flowKey = tcpReassemblyData.connData.flowKey; PCPP_LOG_DEBUG("Closing connection with flow key 0x" << std::hex << flowKey); @@ -778,7 +804,9 @@ namespace pcpp checkOutOfOrderFragments(&tcpReassemblyData, 1, true); if (m_OnConnEnd != nullptr) + { m_OnConnEnd(tcpReassemblyData.connData, TcpReassemblyConnectionClosedManually, m_UserCookie); + } tcpReassemblyData.closed = true; // mark the connection as closed insertIntoCleanupList(flowKey); @@ -791,7 +819,9 @@ namespace pcpp { auto iter = m_ConnectionList.find(connection.flowKey); if (iter != m_ConnectionList.end()) + { return iter->second.closed == false; + } return -1; } @@ -815,7 +845,9 @@ namespace pcpp uint32_t count = 0; if (maxNumToClean == 0) + { maxNumToClean = m_MaxNumToClean; + } CleanupList::iterator iterTime = m_CleanupList.begin(), iterTimeEnd = m_CleanupList.upper_bound(time(nullptr)); while (iterTime != iterTimeEnd && count < maxNumToClean) @@ -831,9 +863,13 @@ namespace pcpp } if (keysList.empty()) + { m_CleanupList.erase(iterTime++); + } else + { ++iterTime; + } } return count; diff --git a/Packet++/src/TelnetLayer.cpp b/Packet++/src/TelnetLayer.cpp index 9da3ba6c1a..f4399b0703 100644 --- a/Packet++/src/TelnetLayer.cpp +++ b/Packet++/src/TelnetLayer.cpp @@ -79,14 +79,20 @@ namespace pcpp { // If it is second turn position should be adjusted to after second FF if (addition) + { addition += 2; + } pos = (uint8_t*)memchr(startPos + currentOffset + 1, static_cast(TelnetCommand::InterpretAsCommand), maxLength - currentOffset); if (pos) + { addition += pos - (startPos + currentOffset); + } else + { addition += maxLength - currentOffset; + } currentOffset = currentOffset + addition; // "FF FF" means data continue } while (pos && ((pos + 1) < (startPos + maxLength)) && @@ -102,11 +108,15 @@ namespace pcpp { // If subnegotiation parse until next IAC if (startPos[1] == static_cast(TelnetCommand::Subnegotiation)) + { return distanceToNextIAC(startPos, maxLength); + } // Only WILL, WONT, DO, DONT have option. Ref http://pcmicro.com/netfoss/telnet.html else if (startPos[1] >= static_cast(TelnetCommand::WillPerform) && startPos[1] <= static_cast(TelnetCommand::DontPerform)) + { return 3; + } return 2; } return distanceToNextIAC(startPos, maxLength); @@ -179,7 +189,9 @@ namespace pcpp int16_t TelnetLayer::getSubCommand(uint8_t* pos, size_t len) { if (len < 3 || pos[1] < static_cast(TelnetCommand::Subnegotiation)) + { return static_cast(TelnetOption::TelnetOptionNoOption); + } return pos[2]; } @@ -249,7 +261,9 @@ namespace pcpp { size_t ctr = 0; if (isTelnetCommand(m_Data, m_DataLen)) + { ++ctr; + } uint8_t* pos = m_Data; while (pos != nullptr) @@ -257,7 +271,9 @@ namespace pcpp size_t offset = pos - m_Data; pos = getNextCommandField(pos, m_DataLen - offset); if (pos) + { ++ctr; + } } return ctr; @@ -266,11 +282,15 @@ namespace pcpp size_t TelnetLayer::getNumberOfCommands(TelnetCommand command) { if (static_cast(command) < 0) + { return 0; + } size_t ctr = 0; if (isTelnetCommand(m_Data, m_DataLen) && m_Data[1] == static_cast(command)) + { ++ctr; + } uint8_t* pos = m_Data; while (pos != nullptr) @@ -278,7 +298,9 @@ namespace pcpp size_t offset = pos - m_Data; pos = getNextCommandField(pos, m_DataLen - offset); if (pos && pos[1] == static_cast(command)) + { ++ctr; + } } return ctr; @@ -288,12 +310,16 @@ namespace pcpp { // If starts with command if (isTelnetCommand(m_Data, m_DataLen)) + { return static_cast(m_Data[1]); + } // Check is there any command uint8_t* pos = getNextCommandField(m_Data, m_DataLen); if (pos) + { return static_cast(pos[1]); + } return TelnetCommand::TelnetCommandEndOfPacket; } @@ -303,7 +329,9 @@ namespace pcpp { lastPositionOffset = 0; if (isTelnetCommand(m_Data, m_DataLen)) + { return static_cast(m_Data[1]); + } } uint8_t* pos = getNextCommandField(&m_Data[lastPositionOffset], m_DataLen - lastPositionOffset); @@ -319,8 +347,10 @@ namespace pcpp TelnetLayer::TelnetOption TelnetLayer::getOption() { if (lastPositionOffset < m_DataLen) + { return static_cast(getSubCommand( &m_Data[lastPositionOffset], getFieldLen(&m_Data[lastPositionOffset], m_DataLen - lastPositionOffset))); + } return TelnetOption::TelnetOptionNoOption; } @@ -334,7 +364,9 @@ namespace pcpp } if (isTelnetCommand(m_Data, m_DataLen) && m_Data[1] == static_cast(command)) + { return static_cast(getSubCommand(m_Data, getFieldLen(m_Data, m_DataLen))); + } uint8_t* pos = m_Data; while (pos != nullptr) @@ -343,7 +375,9 @@ namespace pcpp pos = getNextCommandField(pos, m_DataLen - offset); if (pos && pos[1] == static_cast(command)) + { return static_cast(getSubCommand(pos, getFieldLen(pos, m_DataLen - offset))); + } } PCPP_LOG_DEBUG("Can't find requested command"); diff --git a/Packet++/src/TextBasedProtocol.cpp b/Packet++/src/TextBasedProtocol.cpp index 1d35996384..a3c0aaebb0 100644 --- a/Packet++/src/TextBasedProtocol.cpp +++ b/Packet++/src/TextBasedProtocol.cpp @@ -12,7 +12,9 @@ namespace pcpp size_t tbp_my_own_strnlen(const char* s, size_t maxlen) { if (s == nullptr || maxlen == 0) + { return 0; + } size_t i = 0; for (; (i < maxlen) && s[i]; ++i) @@ -97,9 +99,13 @@ namespace pcpp PCPP_LOG_DEBUG(" Field value = " << firstField->getFieldValue()); if (m_FieldList == nullptr) + { m_FieldList = firstField; + } else + { m_FieldList->setNextField(firstField); + } std::string fieldName = firstField->getFieldName(); std::transform(fieldName.begin(), fieldName.end(), fieldName.begin(), ::tolower); @@ -185,7 +191,9 @@ namespace pcpp { HeaderField* prevField = getFieldByName(prevFieldName); if (prevField == nullptr) + { return nullptr; + } return insertField(prevField, fieldName, fieldValue); } @@ -209,7 +217,9 @@ namespace pcpp int newFieldOffset = m_FieldsOffset; if (prevField != nullptr) + { newFieldOffset = prevField->m_NameOffsetInMessage + prevField->getFieldSize(); + } // extend layer to make room for the new field. Field will be added just before the last field if (!extendLayer(newFieldOffset, newFieldToAdd->getFieldSize())) @@ -221,7 +231,9 @@ namespace pcpp HeaderField* curField = m_FieldList; if (prevField != nullptr) + { curField = prevField->getNextField(); + } // go over all fields after prevField and update their offsets shiftFieldsOffset(curField, newFieldToAdd->getFieldSize()); @@ -246,7 +258,9 @@ namespace pcpp // if newField is the last field, update m_LastField if (newFieldToAdd->getNextField() == nullptr) + { m_LastField = newFieldToAdd; + } // insert the new field into name to field map std::string fieldName = newFieldToAdd->getFieldName(); @@ -276,7 +290,9 @@ namespace pcpp } if (fieldToRemove != nullptr) + { return removeField(fieldToRemove); + } else { PCPP_LOG_ERROR("Cannot find field '" << fieldName << "'"); @@ -287,7 +303,9 @@ namespace pcpp bool TextBasedProtocolMessage::removeField(HeaderField* fieldToRemove) { if (fieldToRemove == nullptr) + { return true; + } if (fieldToRemove->m_TextBasedProtocolMessage != this) { @@ -310,12 +328,16 @@ namespace pcpp // update fields link list if (fieldToRemove == m_FieldList) + { m_FieldList = m_FieldList->getNextField(); + } else { curField = m_FieldList; while (curField->getNextField() != fieldToRemove) + { curField = curField->getNextField(); + } curField->setNextField(fieldToRemove->getNextField()); } @@ -324,12 +346,16 @@ namespace pcpp if (fieldToRemove == m_LastField) { if (m_FieldList == nullptr) + { m_LastField = nullptr; + } else { curField = m_FieldList; while (curField->getNextField() != nullptr) + { curField = curField->getNextField(); + } m_LastField = curField; } } @@ -355,7 +381,9 @@ namespace pcpp bool TextBasedProtocolMessage::isHeaderComplete() const { if (m_LastField == nullptr) + { return false; + } return (m_LastField->getFieldName() == PCPP_END_OF_TEXT_BASED_PROTOCOL_HEADER); } @@ -366,7 +394,9 @@ namespace pcpp { fromField->m_NameOffsetInMessage += numOfBytesToShift; if (fromField->m_ValueOffsetInMessage != -1) + { fromField->m_ValueOffsetInMessage += numOfBytesToShift; + } fromField = fromField->getNextField(); } } @@ -380,7 +410,9 @@ namespace pcpp for (std::multimap::const_iterator iter = range.first; iter != range.second; ++iter) { if (i == index) + { return iter->second; + } i++; } @@ -396,7 +428,9 @@ namespace pcpp while (curField != nullptr) { if (!curField->isEndOfHeader()) + { result++; + } curField = curField->getNextField(); } @@ -407,7 +441,9 @@ namespace pcpp { size_t headerLen = getHeaderLen(); if (m_DataLen <= headerLen) + { return; + } m_NextLayer = new PayloadLayer(m_Data + headerLen, m_DataLen - headerLen, this, m_Packet); } @@ -434,10 +470,14 @@ namespace pcpp char* fieldEndPtr = static_cast(memchr( fieldData, '\n', m_TextBasedProtocolMessage->m_DataLen - static_cast(m_NameOffsetInMessage))); if (fieldEndPtr == nullptr) + { m_FieldSize = tbp_my_own_strnlen(fieldData, m_TextBasedProtocolMessage->m_DataLen - static_cast(m_NameOffsetInMessage)); + } else + { m_FieldSize = fieldEndPtr - fieldData + 1; + } if (m_FieldSize == 0 || (*fieldData) == '\r' || (*fieldData) == '\n') { @@ -449,7 +489,9 @@ namespace pcpp return; } else + { m_IsEndOfHeaderField = false; + } char* fieldValuePtr = static_cast( memchr(fieldData, nameValueSeparator, @@ -513,7 +555,9 @@ namespace pcpp m_FieldValueSize = fieldEndPtr - fieldValuePtr; // if field ends with \r\n, decrease the value length by 1 if ((*(--fieldEndPtr)) == '\r') + { m_FieldValueSize--; + } } } } @@ -536,44 +580,64 @@ namespace pcpp // first building the name-value separator std::string nameValueSeparation(1, m_NameValueSeparator); if (m_SpacesAllowedBetweenNameAndValue) + { nameValueSeparation += " "; + } // Field size is: name_length + separator_len + value_length + '\r\n' if (name != PCPP_END_OF_TEXT_BASED_PROTOCOL_HEADER) + { m_FieldSize = name.length() + nameValueSeparation.length() + value.length() + 2; + } else + { // Field is \r\n (2B) m_FieldSize = 2; + } m_NewFieldData = new uint8_t[m_FieldSize]; std::string fieldData; if (name != PCPP_END_OF_TEXT_BASED_PROTOCOL_HEADER) + { fieldData = name + nameValueSeparation + value + "\r\n"; + } else + { fieldData = "\r\n"; + } // copy field data to m_NewFieldData memcpy(m_NewFieldData, fieldData.c_str(), m_FieldSize); // calculate value offset if (name != PCPP_END_OF_TEXT_BASED_PROTOCOL_HEADER) + { m_ValueOffsetInMessage = name.length() + nameValueSeparation.length(); + } else + { m_ValueOffsetInMessage = 0; + } m_FieldNameSize = name.length(); m_FieldValueSize = value.length(); if (name != PCPP_END_OF_TEXT_BASED_PROTOCOL_HEADER) + { m_IsEndOfHeaderField = false; + } else + { m_IsEndOfHeaderField = true; + } } HeaderField::~HeaderField() { if (m_NewFieldData != nullptr) + { delete[] m_NewFieldData; + } } HeaderField::HeaderField(const HeaderField& other) @@ -589,7 +653,9 @@ namespace pcpp m_NameValueSeparator = other.m_NameValueSeparator; m_SpacesAllowedBetweenNameAndValue = other.m_SpacesAllowedBetweenNameAndValue; if (m_NewFieldData != nullptr) + { delete[] m_NewFieldData; + } initNewField(other.getFieldName(), other.getFieldValue()); return (*this); @@ -598,9 +664,13 @@ namespace pcpp char* HeaderField::getData() const { if (m_TextBasedProtocolMessage == nullptr) + { return reinterpret_cast(m_NewFieldData); + } else + { return reinterpret_cast(m_TextBasedProtocolMessage->m_Data); + } } void HeaderField::setNextField(HeaderField* nextField) @@ -618,7 +688,9 @@ namespace pcpp std::string result; if (m_FieldNameSize != static_cast(-1)) + { result.assign((getData() + m_NameOffsetInMessage), m_FieldNameSize); + } return result; } @@ -627,7 +699,9 @@ namespace pcpp { std::string result; if (m_ValueOffsetInMessage != -1) + { result.assign((getData() + m_ValueOffsetInMessage), m_FieldValueSize); + } return result; } @@ -664,7 +738,9 @@ namespace pcpp } if (lengthDifference != 0) + { m_TextBasedProtocolMessage->shiftFieldsOffset(getNextField(), lengthDifference); + } // update sizes m_FieldValueSize += lengthDifference; diff --git a/Packet++/src/TpktLayer.cpp b/Packet++/src/TpktLayer.cpp index c3fe3a9ff7..353a59da4f 100644 --- a/Packet++/src/TpktLayer.cpp +++ b/Packet++/src/TpktLayer.cpp @@ -58,7 +58,9 @@ namespace pcpp { size_t headerLen = getHeaderLen(); if (m_DataLen <= headerLen) + { return; + } uint8_t* payload = m_Data + headerLen; size_t payloadLen = m_DataLen - headerLen; @@ -68,7 +70,9 @@ namespace pcpp m_NextLayer = new CotpLayer(payload, payloadLen, this, m_Packet); } else + { m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet); + } } } // namespace pcpp diff --git a/Packet++/src/UdpLayer.cpp b/Packet++/src/UdpLayer.cpp index 478d2893a3..4d44491cc7 100644 --- a/Packet++/src/UdpLayer.cpp +++ b/Packet++/src/UdpLayer.cpp @@ -80,12 +80,18 @@ namespace pcpp } if (checksumRes == 0) + { checksumRes = 0xffff; + } if (writeResultToPacket) + { udpHdr->headerChecksum = htobe16(checksumRes); + } else + { udpHdr->headerChecksum = currChecksumValue; + } return checksumRes; } @@ -93,7 +99,9 @@ namespace pcpp void UdpLayer::parseNextLayer() { if (m_DataLen <= sizeof(udphdr)) + { return; + } uint16_t portDst = getDstPort(); uint16_t portSrc = getSrcPort(); @@ -102,58 +110,90 @@ namespace pcpp size_t udpDataLen = m_DataLen - sizeof(udphdr); if (DhcpLayer::isDhcpPorts(portSrc, portDst)) + { m_NextLayer = new DhcpLayer(udpData, udpDataLen, this, m_Packet); + } else if (VxlanLayer::isVxlanPort(portDst)) + { m_NextLayer = new VxlanLayer(udpData, udpDataLen, this, m_Packet); + } else if (DnsLayer::isDataValid(udpData, udpDataLen) && (DnsLayer::isDnsPort(portDst) || DnsLayer::isDnsPort(portSrc))) + { m_NextLayer = new DnsLayer(udpData, udpDataLen, this, m_Packet); + } else if (SipLayer::isSipPort(portDst) || SipLayer::isSipPort(portSrc)) { if (SipRequestFirstLine::parseMethod((char*)udpData, udpDataLen) != SipRequestLayer::SipMethodUnknown) + { m_NextLayer = new SipRequestLayer(udpData, udpDataLen, this, m_Packet); + } else if (SipResponseFirstLine::parseStatusCode((char*)udpData, udpDataLen) != SipResponseLayer::SipStatusCodeUnknown && SipResponseFirstLine::parseVersion((char*)udpData, udpDataLen) != "") + { m_NextLayer = new SipResponseLayer(udpData, udpDataLen, this, m_Packet); + } else + { m_NextLayer = new PayloadLayer(udpData, udpDataLen, this, m_Packet); + } } else if ((RadiusLayer::isRadiusPort(portDst) || RadiusLayer::isRadiusPort(portSrc)) && RadiusLayer::isDataValid(udpData, udpDataLen)) + { m_NextLayer = new RadiusLayer(udpData, udpDataLen, this, m_Packet); + } else if ((GtpV1Layer::isGTPv1Port(portDst) || GtpV1Layer::isGTPv1Port(portSrc)) && GtpV1Layer::isGTPv1(udpData, udpDataLen)) + { m_NextLayer = new GtpV1Layer(udpData, udpDataLen, this, m_Packet); + } else if ((GtpV2Layer::isGTPv2Port(portDst) || GtpV2Layer::isGTPv2Port(portSrc)) && GtpV2Layer::isDataValid(udpData, udpDataLen)) + { m_NextLayer = new GtpV2Layer(udpData, udpDataLen, this, m_Packet); + } else if ((DhcpV6Layer::isDhcpV6Port(portSrc) || DhcpV6Layer::isDhcpV6Port(portDst)) && (DhcpV6Layer::isDataValid(udpData, udpDataLen))) + { m_NextLayer = new DhcpV6Layer(udpData, udpDataLen, this, m_Packet); + } else if ((NtpLayer::isNTPPort(portSrc) || NtpLayer::isNTPPort(portDst)) && NtpLayer::isDataValid(udpData, udpDataLen)) + { m_NextLayer = new NtpLayer(udpData, udpDataLen, this, m_Packet); + } else if ((DoIpLayer::isDoIpPort(portSrc) || DoIpLayer::isDoIpPort(portDst)) && (DoIpLayer::isDataValid(udpData, udpDataLen))) { m_NextLayer = DoIpLayer::parseDoIpLayer(udpData, udpDataLen, this, m_Packet); if (!m_NextLayer) + { constructNextLayer(udpData, udpDataLen, m_Packet); + } } else if (SomeIpLayer::isSomeIpPort(portSrc) || SomeIpLayer::isSomeIpPort(portDst)) + { m_NextLayer = SomeIpLayer::parseSomeIpLayer(udpData, udpDataLen, this, m_Packet); + } else if ((WakeOnLanLayer::isWakeOnLanPort(portDst) && WakeOnLanLayer::isDataValid(udpData, udpDataLen))) + { m_NextLayer = new WakeOnLanLayer(udpData, udpDataLen, this, m_Packet); + } else if ((WireGuardLayer::isWireGuardPorts(portDst, portSrc) && WireGuardLayer::isDataValid(udpData, udpDataLen))) { m_NextLayer = WireGuardLayer::parseWireGuardLayer(udpData, udpDataLen, this, m_Packet); if (!m_NextLayer) + { m_NextLayer = new PayloadLayer(udpData, udpDataLen, this, m_Packet); + } } else + { m_NextLayer = new PayloadLayer(udpData, udpDataLen, this, m_Packet); + } } void UdpLayer::computeCalculateFields() diff --git a/Packet++/src/VlanLayer.cpp b/Packet++/src/VlanLayer.cpp index f12ca798ae..98de536ece 100644 --- a/Packet++/src/VlanLayer.cpp +++ b/Packet++/src/VlanLayer.cpp @@ -62,7 +62,9 @@ namespace pcpp void VlanLayer::parseNextLayer() { if (m_DataLen <= sizeof(vlan_header)) + { return; + } uint8_t* payload = m_Data + sizeof(vlan_header); size_t payloadLen = m_DataLen - sizeof(vlan_header); @@ -110,7 +112,9 @@ namespace pcpp void VlanLayer::computeCalculateFields() { if (m_NextLayer == nullptr) + { return; + } switch (m_NextLayer->getProtocol()) { diff --git a/Packet++/src/VxlanLayer.cpp b/Packet++/src/VxlanLayer.cpp index 6001b4197b..b92635104b 100644 --- a/Packet++/src/VxlanLayer.cpp +++ b/Packet++/src/VxlanLayer.cpp @@ -17,21 +17,31 @@ namespace pcpp m_Protocol = VXLAN; if (vni != 0) + { setVNI(vni); + } vxlan_header* vxlanHeader = getVxlanHeader(); if (groupPolicyID != 0) + { vxlanHeader->groupPolicyID = htobe16(groupPolicyID); + } vxlanHeader->vniPresentFlag = 1; if (setGbpFlag) + { vxlanHeader->gbpFlag = 1; + } if (setPolicyAppliedFlag) + { vxlanHeader->policyAppliedFlag = 1; + } if (setDontLearnFlag) + { vxlanHeader->dontLearnFlag = 1; + } } uint32_t VxlanLayer::getVNI() const @@ -52,7 +62,9 @@ namespace pcpp void VxlanLayer::parseNextLayer() { if (m_DataLen <= sizeof(vxlan_header)) + { return; + } m_NextLayer = new EthLayer(m_Data + sizeof(vxlan_header), m_DataLen - sizeof(vxlan_header), this, m_Packet); } diff --git a/Packet++/src/WakeOnLanLayer.cpp b/Packet++/src/WakeOnLanLayer.cpp index 1175375d5a..57cde3b8c1 100644 --- a/Packet++/src/WakeOnLanLayer.cpp +++ b/Packet++/src/WakeOnLanLayer.cpp @@ -51,7 +51,9 @@ namespace pcpp void WakeOnLanLayer::setTargetAddr(const pcpp::MacAddress& targetAddr) { for (size_t idx = 0; idx < 16; ++idx) + { memcpy(&(getWakeOnLanHeader()->addrBody[idx * 6]), targetAddr.getRawData(), 6); + } } std::string WakeOnLanLayer::getPassword() const @@ -120,7 +122,9 @@ namespace pcpp for (size_t idx = 1; idx < 16; ++idx) { if (bufAddr != pcpp::MacAddress(&data[6 + idx * 6])) + { return false; + } } return true; } diff --git a/Packet++/src/WireGuardLayer.cpp b/Packet++/src/WireGuardLayer.cpp index a00bbf6b99..176a76d324 100644 --- a/Packet++/src/WireGuardLayer.cpp +++ b/Packet++/src/WireGuardLayer.cpp @@ -10,7 +10,9 @@ namespace pcpp WireGuardLayer* WireGuardLayer::parseWireGuardLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet) { if (dataLen < sizeof(WireGuardLayer::wg_common_header)) + { return nullptr; + } wg_common_header* wgHeader = reinterpret_cast(data); switch (wgHeader->messageType) @@ -77,7 +79,9 @@ namespace pcpp bool WireGuardLayer::isDataValid(const uint8_t* data, size_t dataLen) { if (dataLen < sizeof(WireGuardLayer::wg_common_header)) + { return false; + } uint8_t messageType = data[0]; return messageType >= static_cast(WireGuardLayer::WireGuardMessageType::HandshakeInitiation) && diff --git a/Packet++/src/X509Decoder.cpp b/Packet++/src/X509Decoder.cpp index b34fbe64b4..0ce57f7750 100644 --- a/Packet++/src/X509Decoder.cpp +++ b/Packet++/src/X509Decoder.cpp @@ -468,7 +468,9 @@ namespace pcpp auto it = X509ExtensionTypeOidMap.find(oidStr); if (it != X509ExtensionTypeOidMap.end()) + { return { it->second }; + } return { Unknown }; } diff --git a/Pcap++/header/DpdkDeviceList.h b/Pcap++/header/DpdkDeviceList.h index d5b56b9d2c..0f7cbaf5dc 100644 --- a/Pcap++/header/DpdkDeviceList.h +++ b/Pcap++/header/DpdkDeviceList.h @@ -92,7 +92,9 @@ namespace pcpp { static DpdkDeviceList instance; if (!instance.isInitialized()) + { instance.initDpdkDevices(DpdkDeviceList::m_MBufPoolSizePerDevice, DpdkDeviceList::m_MBufDataSize); + } return instance; } diff --git a/Pcap++/src/DpdkDevice.cpp b/Pcap++/src/DpdkDevice.cpp index a26ce7ccb2..3a307b72a7 100644 --- a/Pcap++/src/DpdkDevice.cpp +++ b/Pcap++/src/DpdkDevice.cpp @@ -165,10 +165,14 @@ namespace pcpp DpdkDevice::~DpdkDevice() { if (m_TxBuffers != nullptr) + { delete[] m_TxBuffers; + } if (m_TxBufferLastDrainTsc != nullptr) + { delete[] m_TxBufferLastDrainTsc; + } } uint32_t DpdkDevice::getCurrentCoreId() const @@ -221,7 +225,9 @@ namespace pcpp clearCoreConfiguration(); if (!initQueues(numOfRxQueuesToOpen, numOfTxQueuesToOpen)) + { return false; + } if (!startDevice()) { @@ -413,10 +419,14 @@ namespace pcpp } if (m_TxBuffers != nullptr) + { delete[] m_TxBuffers; + } if (m_TxBufferLastDrainTsc != nullptr) + { delete[] m_TxBufferLastDrainTsc; + } m_TxBuffers = new rte_eth_dev_tx_buffer*[numOfTxQueuesToInit]; m_TxBufferLastDrainTsc = new uint64_t[numOfTxQueuesToInit]; @@ -511,8 +521,12 @@ namespace pcpp { int res = 0; for (int i = 0; i < MAX_NUM_OF_CORES; i++) + { if (m_CoreConfiguration[i].IsCoreInUse) + { res++; + } + } return res; } @@ -528,41 +542,77 @@ namespace pcpp m_PMDName = std::string(portInfo.driver_name); if (m_PMDName == "eth_bond") + { m_PMDType = PMD_BOND; + } else if (m_PMDName == "rte_em_pmd") + { m_PMDType = PMD_E1000EM; + } else if (m_PMDName == "rte_igb_pmd") + { m_PMDType = PMD_IGB; + } else if (m_PMDName == "rte_igbvf_pmd") + { m_PMDType = PMD_IGBVF; + } else if (m_PMDName == "rte_enic_pmd") + { m_PMDType = PMD_ENIC; + } else if (m_PMDName == "rte_pmd_fm10k") + { m_PMDType = PMD_FM10K; + } else if (m_PMDName == "rte_i40e_pmd" || m_PMDName == "net_i40e") + { m_PMDType = PMD_I40E; + } else if (m_PMDName == "rte_i40evf_pmd") + { m_PMDType = PMD_I40EVF; + } else if (m_PMDName == "rte_ixgbe_pmd") + { m_PMDType = PMD_IXGBE; + } else if (m_PMDName == "rte_ixgbevf_pmd") + { m_PMDType = PMD_IXGBEVF; + } else if (m_PMDName == "librte_pmd_mlx4") + { m_PMDType = PMD_MLX4; + } else if (m_PMDName == "eth_null") + { m_PMDType = PMD_NULL; + } else if (m_PMDName == "eth_pcap") + { m_PMDType = PMD_PCAP; + } else if (m_PMDName == "eth_ring") + { m_PMDType = PMD_RING; + } else if (m_PMDName == "rte_virtio_pmd") + { m_PMDType = PMD_VIRTIO; + } else if (m_PMDName == "rte_vmxnet3_pmd") + { m_PMDType = PMD_VMXNET3; + } else if (m_PMDName == "eth_xenvirt") + { m_PMDType = PMD_XENVIRT; + } else + { m_PMDType = PMD_UNKNOWN; + } #if (RTE_VER_YEAR < 18) || (RTE_VER_YEAR == 18 && RTE_VER_MONTH < 5) // before 18.05 char pciName[30]; @@ -688,7 +738,9 @@ namespace pcpp for (int coreId = 0; coreId < MAX_NUM_OF_CORES; coreId++) { if (coreId == (int)GET_MASTER_CORE() || !rte_lcore_is_enabled(coreId)) + { continue; + } m_CoreConfiguration[coreId].IsCoreInUse = true; m_CoreConfiguration[coreId].RxQueueId = 0; @@ -720,7 +772,9 @@ namespace pcpp } if (!initCoreConfigurationByCoreMask(coreMask)) + { return false; + } if (m_NumOfRxQueuesOpened != getCoresInUseCount()) { @@ -736,7 +790,9 @@ namespace pcpp for (int coreId = 0; coreId < MAX_NUM_OF_CORES; coreId++) { if (!m_CoreConfiguration[coreId].IsCoreInUse) + { continue; + } // create a new thread m_CoreConfiguration[coreId].RxQueueId = rxQueue++; @@ -763,7 +819,9 @@ namespace pcpp for (int coreId = 0; coreId < MAX_NUM_OF_CORES; coreId++) { if (!m_CoreConfiguration[coreId].IsCoreInUse) + { continue; + } rte_eal_wait_lcore(coreId); PCPP_LOG_DEBUG("Thread on core [" << coreId << "] stopped"); } @@ -792,7 +850,9 @@ namespace pcpp uint32_t numOfPktsReceived = rte_eth_rx_burst(pThis->m_Id, queueId, mBufArray, MAX_BURST_SIZE); if (unlikely(numOfPktsReceived == 0)) + { continue; + } timespec time; clock_gettime(CLOCK_REALTIME, &time); @@ -974,7 +1034,9 @@ namespace pcpp { struct rte_mbuf* mBuf = mBufArray[index]; if (rawPacketsArr[index] == nullptr) + { rawPacketsArr[index] = new MBufRawPacket(); + } rawPacketsArr[index]->setMBuf(mBuf, time); } @@ -1019,7 +1081,9 @@ namespace pcpp MBufRawPacket* newRawPacket = new MBufRawPacket(); newRawPacket->setMBuf(mBuf, time); if (packetsArr[index] == nullptr) + { packetsArr[index] = new Packet(); + } packetsArr[index]->setRawPacket(newRawPacket, true); } @@ -1036,13 +1100,19 @@ namespace pcpp uint64_t curTsc = rte_rdtsc(); if (curTsc - m_TxBufferLastDrainTsc[txQueueId] > m_TxBufferDrainTsc) + { m_TxBufferLastDrainTsc[txQueueId] = curTsc; + } else + { flush = false; + } } if (flush) + { return rte_eth_tx_buffer_flush(m_Id, txQueueId, m_TxBuffers[txQueueId]); + } return 0; } @@ -1153,10 +1223,14 @@ namespace pcpp } for (int index = 0; index < applyForMBufs; index++) + { rawPacketsArr[index]->setFreeMbuf(needToFreeMbuf); + } for (int index = applyForMBufs; index < arrLength; index++) + { rawPacketsArr[index]->setFreeMbuf(!needToFreeMbuf); + } return packetsSent; } @@ -1196,7 +1270,9 @@ namespace pcpp bool needToFreeMbuf = (!useTxBuffer && (packetsSent != arrLength)); for (int index = 0; index < arrLength; index++) + { mBufRawPacketArr[index]->setFreeMbuf(needToFreeMbuf); + } return packetsSent; } @@ -1238,7 +1314,9 @@ namespace pcpp bool needToFreeMbuf = (!useTxBuffer && (packetsSent != vecSize)); for (size_t index = 0; index < rawPacketsVec.size(); index++) + { mBufRawPacketArr[index]->setFreeMbuf(needToFreeMbuf); + } return packetsSent; } @@ -1252,7 +1330,9 @@ namespace pcpp bool needToFreeMbuf = (!useTxBuffer && (packetsSent != vecSize)); for (size_t index = 0; index < vecSize; index++) + { rawPacketsVec.at(index)->setFreeMbuf(needToFreeMbuf); + } return packetsSent; } @@ -1271,7 +1351,9 @@ namespace pcpp MBufRawPacket mbufRawPacket; if (unlikely(!mbufRawPacket.initFromRawPacket(&rawPacket, this))) + { return false; + } bool packetSent = (sendPacketsInner(txQueueId, &mbufRawPacket, getNextPacketFromMBufRawPacket, 1, useTxBuffer) == 1); @@ -1321,64 +1403,104 @@ namespace pcpp uint64_t dpdkRssHF = 0; if ((rssHF & RSS_IPV4) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_IPV4; + } if ((rssHF & RSS_FRAG_IPV4) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_FRAG_IPV4; + } if ((rssHF & RSS_NONFRAG_IPV4_TCP) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_NONFRAG_IPV4_TCP; + } if ((rssHF & RSS_NONFRAG_IPV4_UDP) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_NONFRAG_IPV4_UDP; + } if ((rssHF & RSS_NONFRAG_IPV4_SCTP) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_NONFRAG_IPV4_SCTP; + } if ((rssHF & RSS_NONFRAG_IPV4_OTHER) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_NONFRAG_IPV4_OTHER; + } if ((rssHF & RSS_IPV6) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_IPV6; + } if ((rssHF & RSS_FRAG_IPV6) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_FRAG_IPV6; + } if ((rssHF & RSS_NONFRAG_IPV6_TCP) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_NONFRAG_IPV6_TCP; + } if ((rssHF & RSS_NONFRAG_IPV6_UDP) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_NONFRAG_IPV6_UDP; + } if ((rssHF & RSS_NONFRAG_IPV6_SCTP) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_NONFRAG_IPV6_SCTP; + } if ((rssHF & RSS_NONFRAG_IPV6_OTHER) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_NONFRAG_IPV6_OTHER; + } if ((rssHF & RSS_L2_PAYLOAD) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_L2_PAYLOAD; + } if ((rssHF & RSS_IPV6_EX) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_IPV6_EX; + } if ((rssHF & RSS_IPV6_TCP_EX) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_IPV6_TCP_EX; + } if ((rssHF & RSS_IPV6_UDP_EX) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_IPV6_UDP_EX; + } if ((rssHF & RSS_PORT) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_PORT; + } if ((rssHF & RSS_VXLAN) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_VXLAN; + } if ((rssHF & RSS_GENEVE) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_GENEVE; + } if ((rssHF & RSS_NVGRE) != 0) + { dpdkRssHF |= DPDK_CONFIG_ETH_RSS_NVGRE; + } return dpdkRssHF; } @@ -1388,64 +1510,104 @@ namespace pcpp uint64_t rssHF = 0; if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_IPV4) != 0) + { rssHF |= RSS_IPV4; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_FRAG_IPV4) != 0) + { rssHF |= RSS_FRAG_IPV4; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_NONFRAG_IPV4_TCP) != 0) + { rssHF |= RSS_NONFRAG_IPV4_TCP; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_NONFRAG_IPV4_UDP) != 0) + { rssHF |= RSS_NONFRAG_IPV4_UDP; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_NONFRAG_IPV4_SCTP) != 0) + { rssHF |= RSS_NONFRAG_IPV4_SCTP; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_NONFRAG_IPV4_OTHER) != 0) + { rssHF |= RSS_NONFRAG_IPV4_OTHER; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_IPV6) != 0) + { rssHF |= RSS_IPV6; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_FRAG_IPV6) != 0) + { rssHF |= RSS_FRAG_IPV6; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_NONFRAG_IPV6_TCP) != 0) + { rssHF |= RSS_NONFRAG_IPV6_TCP; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_NONFRAG_IPV6_UDP) != 0) + { rssHF |= RSS_NONFRAG_IPV6_UDP; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_NONFRAG_IPV6_SCTP) != 0) + { rssHF |= RSS_NONFRAG_IPV6_SCTP; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_NONFRAG_IPV6_OTHER) != 0) + { rssHF |= RSS_NONFRAG_IPV6_OTHER; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_L2_PAYLOAD) != 0) + { rssHF |= RSS_L2_PAYLOAD; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_IPV6_EX) != 0) + { rssHF |= RSS_IPV6_EX; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_IPV6_TCP_EX) != 0) + { rssHF |= RSS_IPV6_TCP_EX; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_IPV6_UDP_EX) != 0) + { rssHF |= RSS_IPV6_UDP_EX; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_PORT) != 0) + { rssHF |= RSS_PORT; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_VXLAN) != 0) + { rssHF |= RSS_VXLAN; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_GENEVE) != 0) + { rssHF |= RSS_GENEVE; + } if ((dpdkRssHF & DPDK_CONFIG_ETH_RSS_NVGRE) != 0) + { rssHF |= RSS_NVGRE; + } return rssHF; } @@ -1513,64 +1675,104 @@ namespace pcpp } if ((rssHFMask & RSS_IPV4) != 0) + { result.push_back("RSS_IPV4"); + } if ((rssHFMask & RSS_FRAG_IPV4) != 0) + { result.push_back("RSS_FRAG_IPV4"); + } if ((rssHFMask & RSS_NONFRAG_IPV4_TCP) != 0) + { result.push_back("RSS_NONFRAG_IPV4_TCP"); + } if ((rssHFMask & RSS_NONFRAG_IPV4_UDP) != 0) + { result.push_back("RSS_NONFRAG_IPV4_UDP"); + } if ((rssHFMask & RSS_NONFRAG_IPV4_SCTP) != 0) + { result.push_back("RSS_NONFRAG_IPV4_SCTP"); + } if ((rssHFMask & RSS_NONFRAG_IPV4_OTHER) != 0) + { result.push_back("RSS_NONFRAG_IPV4_OTHER"); + } if ((rssHFMask & RSS_IPV6) != 0) + { result.push_back("RSS_IPV6"); + } if ((rssHFMask & RSS_FRAG_IPV6) != 0) + { result.push_back("RSS_FRAG_IPV6"); + } if ((rssHFMask & RSS_NONFRAG_IPV6_TCP) != 0) + { result.push_back("RSS_NONFRAG_IPV6_TCP"); + } if ((rssHFMask & RSS_NONFRAG_IPV6_UDP) != 0) + { result.push_back("RSS_NONFRAG_IPV6_UDP"); + } if ((rssHFMask & RSS_NONFRAG_IPV6_SCTP) != 0) + { result.push_back("RSS_NONFRAG_IPV6_SCTP"); + } if ((rssHFMask & RSS_NONFRAG_IPV6_OTHER) != 0) + { result.push_back("RSS_NONFRAG_IPV6_OTHER"); + } if ((rssHFMask & RSS_L2_PAYLOAD) != 0) + { result.push_back("RSS_L2_PAYLOAD"); + } if ((rssHFMask & RSS_IPV6_EX) != 0) + { result.push_back("RSS_IPV6_EX"); + } if ((rssHFMask & RSS_IPV6_TCP_EX) != 0) + { result.push_back("RSS_IPV6_TCP_EX"); + } if ((rssHFMask & RSS_IPV6_UDP_EX) != 0) + { result.push_back("RSS_IPV6_UDP_EX"); + } if ((rssHFMask & RSS_PORT) != 0) + { result.push_back("RSS_PORT"); + } if ((rssHFMask & RSS_VXLAN) != 0) + { result.push_back("RSS_VXLAN"); + } if ((rssHFMask & RSS_GENEVE) != 0) + { result.push_back("RSS_GENEVE"); + } if ((rssHFMask & RSS_NVGRE) != 0) + { result.push_back("RSS_NVGRE"); + } return result; } diff --git a/Pcap++/src/DpdkDeviceList.cpp b/Pcap++/src/DpdkDeviceList.cpp index e3ef1f5727..2f15cadbf0 100644 --- a/Pcap++/src/DpdkDeviceList.cpp +++ b/Pcap++/src/DpdkDeviceList.cpp @@ -84,7 +84,9 @@ namespace pcpp if (m_IsDpdkInitialized) { if (coreMask == m_CoreMask) + { return true; + } else { PCPP_LOG_ERROR("Trying to re-initialize DPDK with a different core mask"); @@ -179,7 +181,9 @@ namespace pcpp } if (m_IsInitialized) + { return true; + } #if (RTE_VER_YEAR < 18) || (RTE_VER_YEAR == 18 && RTE_VER_MONTH < 5) int numOfPorts = (int)rte_eth_dev_count(); @@ -294,7 +298,9 @@ namespace pcpp } } else + { PCPP_LOG_DEBUG("igb_uio driver is loaded"); + } return true; } @@ -308,14 +314,22 @@ namespace pcpp { #if (RTE_VER_YEAR > 17) || (RTE_VER_YEAR == 17 && RTE_VER_MONTH >= 11) if (logLevel == Logger::Info) + { rte_log_set_global_level(RTE_LOG_NOTICE); + } else // logLevel == Logger::Debug + { rte_log_set_global_level(RTE_LOG_DEBUG); + } #else if (logLevel == Logger::Info) + { rte_set_log_level(RTE_LOG_NOTICE); + } else // logLevel == Logger::Debug + { rte_set_log_level(RTE_LOG_DEBUG); + } #endif } @@ -328,7 +342,9 @@ namespace pcpp #endif return Logger::Info; else + { return Logger::Debug; + } } bool DpdkDeviceList::writeDpdkLogToFile(FILE* logFile) diff --git a/Pcap++/src/KniDevice.cpp b/Pcap++/src/KniDevice.cpp index 359555b4ab..9b11a20ea1 100644 --- a/Pcap++/src/KniDevice.cpp +++ b/Pcap++/src/KniDevice.cpp @@ -154,13 +154,17 @@ namespace pcpp struct rte_kni_ops kniOps; struct rte_kni_conf kniConf; if (!m_DeviceInfo.init(conf)) + { return; + } m_Requests.thread = nullptr; std::memset(&m_Capturing, 0, sizeof(m_Capturing)); std::memset(&m_Requests, 0, sizeof(m_Requests)); if ((m_MBufMempool = createMempool(mempoolSize, unique, conf.name.c_str())) == nullptr) + { return; + } std::memset(&kniOps, 0, sizeof(kniOps)); std::memset(&kniConf, 0, sizeof(kniConf)); @@ -170,7 +174,9 @@ namespace pcpp kniConf.force_bind = conf.bindKthread ? 1 : 0; #if RTE_VERSION >= RTE_VERSION_NUM(18, 2, 0, 0) if (conf.mac != MacAddress::Zero) + { conf.mac.copyTo((uint8_t*)kniConf.mac_addr); + } kniConf.mtu = conf.mtu; #endif @@ -210,7 +216,9 @@ namespace pcpp destroyKniDevice(m_Device, m_DeviceInfo.name.c_str()); } if (m_MBufMempool != nullptr) + { rte_mempool_free(m_MBufMempool); + } } bool KniDevice::KniDeviceInfo::init(const KniDeviceConfiguration& conf) @@ -240,7 +248,9 @@ namespace pcpp KniDevice::KniLinkState KniDevice::getLinkState(KniInfoState state) { if (state == KniDevice::INFO_CACHED) + { return m_DeviceInfo.link; + } struct ifreq req; std::memset(&req, 0, sizeof(req)); if (!m_DeviceInfo.soc.makeRequest(m_DeviceInfo.name.c_str(), SIOCGIFFLAGS, &req)) @@ -255,7 +265,9 @@ namespace pcpp MacAddress KniDevice::getMacAddress(KniInfoState state) { if (state == KniDevice::INFO_CACHED) + { return m_DeviceInfo.mac; + } struct ifreq req; std::memset(&req, 0, sizeof(req)); req.ifr_hwaddr.sa_family = ARPHRD_ETHER; @@ -271,7 +283,9 @@ namespace pcpp uint16_t KniDevice::getMtu(KniInfoState state) { if (state == KniDevice::INFO_CACHED) + { return m_DeviceInfo.mtu; + } struct ifreq req; std::memset(&req, 0, sizeof(req)); if (!m_DeviceInfo.soc.makeRequest(m_DeviceInfo.name.c_str(), SIOCGIFMTU, &req)) @@ -286,7 +300,9 @@ namespace pcpp KniDevice::KniPromiscuousMode KniDevice::getPromiscuous(KniInfoState state) { if (state == KniDevice::INFO_CACHED) + { return m_DeviceInfo.promisc; + } struct ifreq req; std::memset(&req, 0, sizeof(req)); if (!m_DeviceInfo.soc.makeRequest(m_DeviceInfo.name.c_str(), SIOCGIFFLAGS, &req)) @@ -302,7 +318,9 @@ namespace pcpp bool KniDevice::setLinkState(KniLinkState state) { if (!(state == KniDevice::LINK_DOWN || state == KniDevice::LINK_UP)) + { return false; + } struct ifreq req; std::memset(&req, 0, sizeof(req)); if (!m_DeviceInfo.soc.makeRequest(m_DeviceInfo.name.c_str(), SIOCGIFFLAGS, &req)) @@ -356,7 +374,9 @@ namespace pcpp bool KniDevice::setPromiscuous(KniPromiscuousMode mode) { if (!(mode == KniDevice::PROMISC_DISABLE || mode == KniDevice::PROMISC_ENABLE)) + { return false; + } struct ifreq req; std::memset(&req, 0, sizeof(req)); if (!m_DeviceInfo.soc.makeRequest(m_DeviceInfo.name.c_str(), SIOCGIFFLAGS, &req)) @@ -382,7 +402,9 @@ namespace pcpp { KniLinkState oldState = setKniDeviceLinkState(m_Device, m_DeviceInfo.name.c_str(), state); if (oldState != KniDevice::LINK_NOT_SUPPORTED && oldState != KniDevice::LINK_ERROR) + { m_DeviceInfo.link = state; + } return oldState; } @@ -394,7 +416,9 @@ namespace pcpp void KniDevice::KniRequests::cleanup() { if (thread) + { thread->cancel(); + } delete thread; thread = nullptr; sleepS = sleepNs = 0; @@ -522,7 +546,9 @@ namespace pcpp { struct rte_mbuf* mBuf = mBufArray[index]; if (rawPacketsArr[index] == nullptr) + { rawPacketsArr[index] = new MBufRawPacket(); + } rawPacketsArr[index]->setMBuf(mBuf, time); } @@ -562,7 +588,9 @@ namespace pcpp MBufRawPacket* newRawPacket = new MBufRawPacket(); newRawPacket->setMBuf(mBuf, time); if (packetsArr[index] == nullptr) + { packetsArr[index] = new Packet(); + } packetsArr[index]->setRawPacket(newRawPacket, true); } @@ -637,7 +665,9 @@ namespace pcpp error_out: for (uint16_t i = 0; i < allocated_count; ++i) + { delete allocated[i]; + } return packetsSent; } @@ -714,7 +744,9 @@ namespace pcpp error_out: for (uint16_t i = 0; i < allocatedCount; ++i) + { delete allocated[i]; + } return packetsSent; } @@ -751,7 +783,9 @@ namespace pcpp sent = rte_kni_tx_burst(m_Device, &mbuf, 1); mbufRawPacket->setFreeMbuf(!sent); if (wasAllocated) + { delete mbufRawPacket; + } return sent; } @@ -812,7 +846,9 @@ namespace pcpp } if (!callback(rawPackets, numOfPktsReceived, device, userCookie)) + { break; + } } if (stopThread) { @@ -824,7 +860,9 @@ namespace pcpp void KniDevice::KniCapturing::cleanup() { if (thread) + { thread->cancel(); + } delete thread; thread = nullptr; callback = nullptr; @@ -909,7 +947,9 @@ namespace pcpp } if (!m_Capturing.callback(rawPackets, numOfPktsReceived, this, m_Capturing.userCookie)) + { return 1; + } } } } @@ -936,7 +976,9 @@ namespace pcpp } if (!m_Capturing.callback(rawPackets, numOfPktsReceived, this, m_Capturing.userCookie)) + { return 1; + } } } } diff --git a/Pcap++/src/KniDeviceList.cpp b/Pcap++/src/KniDeviceList.cpp index 6b9f8420a9..26d8c3500f 100644 --- a/Pcap++/src/KniDeviceList.cpp +++ b/Pcap++/src/KniDeviceList.cpp @@ -76,7 +76,9 @@ namespace pcpp KniDevice* KniDeviceList::createDevice(const KniDevice::KniDeviceConfiguration& config, const size_t mempoolSize) { if (!isInitialized()) + { return nullptr; + } KniDevice* kniDevice = getDeviceByName(std::string(config.name)); if (kniDevice != nullptr) { @@ -110,7 +112,9 @@ namespace pcpp //? We assume that no one will create large count of devices or will rapidly search them. //? Same for function if (!isInitialized()) + { return nullptr; + } auto it = std::find_if(m_DeviceList.begin(), m_DeviceList.end(), [portId](KniDevice* device) { return device && device->m_DeviceInfo.portId == portId; }); @@ -121,7 +125,9 @@ namespace pcpp KniDevice* KniDeviceList::getDeviceByName(const std::string& name) { if (!isInitialized()) + { return nullptr; + } auto it = std::find_if(m_DeviceList.begin(), m_DeviceList.end(), [&name](KniDevice* device) { return device && device->m_DeviceInfo.name == name; }); diff --git a/Pcap++/src/MBufRawPacket.cpp b/Pcap++/src/MBufRawPacket.cpp index 51bc1199a0..ddf49ecebb 100644 --- a/Pcap++/src/MBufRawPacket.cpp +++ b/Pcap++/src/MBufRawPacket.cpp @@ -76,7 +76,9 @@ namespace pcpp bool MBufRawPacket::initFromRawPacket(const RawPacket* rawPacket, struct rte_mempool* mempool) { if (!init(mempool)) + { return false; + } m_RawPacketSet = false; @@ -288,7 +290,9 @@ namespace pcpp } if (!RawPacket::removeData(atIndex, numOfBytesToRemove)) + { return false; + } if (rte_pktmbuf_trim(m_MBuf, numOfBytesToRemove) != 0) { diff --git a/Pcap++/src/NetworkUtils.cpp b/Pcap++/src/NetworkUtils.cpp index e5672fd500..f510653061 100644 --- a/Pcap++/src/NetworkUtils.cpp +++ b/Pcap++/src/NetworkUtils.cpp @@ -49,21 +49,29 @@ namespace pcpp // verify that it's an ARP packet (although it must be because I set an ARP reply filter on the interface) if (!packet.isPacketOfType(ARP)) + { return; + } // extract the ARP layer from the packet ArpLayer* arpReplyLayer = packet.getLayerOfType(true); // lookup in reverse order if (arpReplyLayer == nullptr) + { return; + } // verify it's the right ARP response if (arpReplyLayer->getArpHeader()->hardwareType != htobe16(1) // Ethernet || arpReplyLayer->getArpHeader()->protocolType != htobe16(PCPP_ETHERTYPE_IP)) + { return; + } // verify the ARP response is the response for out request (and not some arbitrary ARP response) if (arpReplyLayer->getSenderIpAddr() != data->ipAddr) + { return; + } // measure response time auto duration = receiveTime - data->start; @@ -94,13 +102,19 @@ namespace pcpp } if (sourceMac == MacAddress::Zero) + { sourceMac = device->getMacAddress(); + } if (sourceIP == IPv4Address::Zero) + { sourceIP = device->getIPv4Address(); + } if (arpTimeout <= 0) + { arpTimeout = NetworkUtils::DefaultTimeout; + } // create an ARP request from sourceMac and sourceIP and ask for target IP @@ -170,9 +184,13 @@ namespace pcpp } if (closeDeviceAtTheEnd) + { device->close(); + } else + { device->clearFilter(); + } result = data.result; arpResponseTimeMS = data.arpResponseTime; @@ -205,12 +223,16 @@ namespace pcpp // verify that it's an DNS packet (although it must be because DNS port filter was set on the interface) if (!packet.isPacketOfType(DNS)) + { return; + } // extract the DNS layer from the packet DnsLayer* dnsResponseLayer = packet.getLayerOfType(true); // lookup in reverse order if (dnsResponseLayer == nullptr) + { return; + } // verify it's the right DNS response if (dnsResponseLayer->getDnsHeader()->queryOrResponse != 1 // DNS response @@ -322,7 +344,9 @@ namespace pcpp } if (dnsTimeout <= 0) + { dnsTimeout = NetworkUtils::DefaultTimeout; + } // validate DNS server IP. If it wasn't provided - set the system-configured DNS server if (dnsServerIP == IPv4Address::Zero && device->getDnsServers().size() > 0) @@ -415,9 +439,13 @@ namespace pcpp } if (closeDeviceAtTheEnd) + { device->close(); + } else + { device->clearFilter(); + } result = data.result; dnsResponseTimeMS = data.dnsResponseTime; diff --git a/Pcap++/src/PcapFileDevice.cpp b/Pcap++/src/PcapFileDevice.cpp index ee7cbd009e..8ef87d02a9 100644 --- a/Pcap++/src/PcapFileDevice.cpp +++ b/Pcap++/src/PcapFileDevice.cpp @@ -124,9 +124,13 @@ namespace pcpp const auto fileExtension = extensionPos != std::string::npos ? fileName.substr(extensionPos) : ""; if (fileExtension == ".pcapng" || fileExtension == ".zstd" || fileExtension == ".zst") + { return new PcapNgFileReaderDevice(fileName); + } else if (fileExtension == ".snoop") + { return new SnoopFileReaderDevice(fileName); + } return new PcapFileReaderDevice(fileName); } @@ -326,7 +330,9 @@ namespace pcpp pktHdr.ts = internal::toTimeval(packet_timestamp); #endif if (!m_AppendMode) + { pcap_dump(reinterpret_cast(m_PcapDumpHandler), &pktHdr, packet.getRawData()); + } else { // Below are actually the lines run by pcap_dump. The reason I had to put them instead pcap_dump is that on @@ -356,7 +362,9 @@ namespace pcpp for (auto packet : packets) { if (!writePacket(*packet)) + { return false; + } } return true; @@ -460,9 +468,13 @@ namespace pcpp if (amountRead != sizeof(pcap_file_header)) { if (ferror(m_File)) + { PCPP_LOG_ERROR("Cannot read pcap header from file '" << m_FileName << "', error was: " << errno); + } else + { PCPP_LOG_ERROR("Cannot read pcap header from file '" << m_FileName << "', unknown error"); + } closeFile(); return false; @@ -495,7 +507,9 @@ namespace pcpp void PcapFileWriterDevice::flush() { if (!m_DeviceOpened) + { return; + } if (!m_AppendMode && pcap_dump_flush(m_PcapDumpHandler) == -1) { @@ -511,7 +525,9 @@ namespace pcpp void PcapFileWriterDevice::close() { if (!m_DeviceOpened) + { return; + } flush(); @@ -632,7 +648,9 @@ namespace pcpp void PcapNgFileReaderDevice::close() { if (m_LightPcapNg == nullptr) + { return; + } light_pcapng_close(toLightPcapNgT(m_LightPcapNg)); m_LightPcapNg = nullptr; @@ -651,7 +669,9 @@ namespace pcpp light_pcapng_file_info* fileInfo = light_pcang_get_file_info(toLightPcapNgT(m_LightPcapNg)); if (fileInfo == nullptr || fileInfo->os_desc == nullptr || fileInfo->os_desc_size == 0) + { return {}; + } return std::string(fileInfo->os_desc, fileInfo->os_desc_size); } @@ -666,7 +686,9 @@ namespace pcpp light_pcapng_file_info* fileInfo = light_pcang_get_file_info(toLightPcapNgT(m_LightPcapNg)); if (fileInfo == nullptr || fileInfo->hardware_desc == nullptr || fileInfo->hardware_desc_size == 0) + { return {}; + } return std::string(fileInfo->hardware_desc, fileInfo->hardware_desc_size); } @@ -681,7 +703,9 @@ namespace pcpp light_pcapng_file_info* fileInfo = light_pcang_get_file_info(toLightPcapNgT(m_LightPcapNg)); if (fileInfo == nullptr || fileInfo->user_app_desc == nullptr || fileInfo->user_app_desc_size == 0) + { return {}; + } return std::string(fileInfo->user_app_desc, fileInfo->user_app_desc_size); } @@ -696,7 +720,9 @@ namespace pcpp light_pcapng_file_info* fileInfo = light_pcang_get_file_info(toLightPcapNgT(m_LightPcapNg)); if (fileInfo == nullptr || fileInfo->file_comment == nullptr || fileInfo->file_comment_size == 0) + { return {}; + } return std::string(fileInfo->file_comment, fileInfo->file_comment_size); } @@ -760,7 +786,9 @@ namespace pcpp for (RawPacketVector::ConstVectorIterator iter = packets.begin(); iter != packets.end(); iter++) { if (!writePacket(**iter)) + { return false; + } } return true; @@ -858,7 +886,9 @@ namespace pcpp void PcapNgFileWriterDevice::flush() { if (!m_DeviceOpened || m_LightPcapNg == nullptr) + { return; + } light_pcapng_flush(toLightPcapNgT(m_LightPcapNg)); PCPP_LOG_DEBUG("File writer flushed to file '" << m_FileName << "'"); @@ -867,7 +897,9 @@ namespace pcpp void PcapNgFileWriterDevice::close() { if (m_LightPcapNg == nullptr) + { return; + } light_pcapng_close(toLightPcapNgT(m_LightPcapNg)); m_LightPcapNg = nullptr; @@ -913,7 +945,9 @@ namespace pcpp if (be64toh(snoop_file_header.identification_pattern) != 0x736e6f6f70000000 && be32toh(snoop_file_header.version_number) == 2) + { return false; + } // From https://datatracker.ietf.org/doc/html/rfc1761 static const pcpp::LinkLayerType snoop_encap[] = { diff --git a/Pcap++/src/PcapFilter.cpp b/Pcap++/src/PcapFilter.cpp index 60b397a740..80c63d7ca0 100644 --- a/Pcap++/src/PcapFilter.cpp +++ b/Pcap++/src/PcapFilter.cpp @@ -97,7 +97,9 @@ namespace pcpp uint16_t linkType) const { if (m_FilterStr.empty()) + { return true; + } // Handle uncompiled program or link type mismatch if (m_CachedProgram == nullptr || linkType != static_cast(m_CachedProgramLinkType)) @@ -123,7 +125,9 @@ namespace pcpp BpfFilterWrapper::BpfProgramUPtr BpfFilterWrapper::compileFilter(std::string const& filter, LinkLayerType linkType) { if (filter.empty()) + { return nullptr; + } auto pcap = std::unique_ptr(pcap_open_dead(linkType, DEFAULT_SNAPLEN)); if (pcap == nullptr) @@ -296,7 +300,9 @@ namespace pcpp result = "ether " + dir + ' ' + m_MacAddress.toString(); } else + { result = "ether host " + m_MacAddress.toString(); + } } void EtherTypeFilter::parseToString(std::string& result) const @@ -402,23 +408,37 @@ namespace pcpp result = "tcp[tcpflags] & ("; if ((m_TcpFlagsBitMask & tcpFin) != 0) + { result += "tcp-fin|"; + } if ((m_TcpFlagsBitMask & tcpSyn) != 0) + { result += "tcp-syn|"; + } if ((m_TcpFlagsBitMask & tcpRst) != 0) + { result += "tcp-rst|"; + } if ((m_TcpFlagsBitMask & tcpPush) != 0) + { result += "tcp-push|"; + } if ((m_TcpFlagsBitMask & tcpAck) != 0) + { result += "tcp-ack|"; + } if ((m_TcpFlagsBitMask & tcpUrg) != 0) + { result += "tcp-urg|"; + } // replace the last '|' character result[result.size() - 1] = ')'; if (m_MatchOption == MatchOneAtLeast) + { result += " != 0"; + } else // m_MatchOption == MatchAll { std::ostringstream stream; diff --git a/Pcap++/src/PcapLiveDevice.cpp b/Pcap++/src/PcapLiveDevice.cpp index 42244a74cd..d94abde16e 100644 --- a/Pcap++/src/PcapLiveDevice.cpp +++ b/Pcap++/src/PcapLiveDevice.cpp @@ -212,7 +212,9 @@ namespace pcpp : name(pInterface->name), isLoopback(pInterface->flags & PCAP_IF_LOOPBACK) { if (pInterface->description != nullptr) + { description = pInterface->description; + } for (pcap_addr* current = pInterface->addresses; current != nullptr; current = current->next) { in_addr* ipv4Addr = internal::try_sockaddr2in_addr(current->addr); @@ -334,7 +336,9 @@ namespace pcpp RawPacket rawPacket(packet, pkthdr->caplen, pkthdr->ts, false, pThis->getLinkType()); if (pThis->m_cbOnPacketArrives != nullptr) + { pThis->m_cbOnPacketArrives(&rawPacket, pThis, pThis->m_cbOnPacketArrivesUserCookie); + } } void PcapLiveDevice::onPacketArrivesNoCallback(uint8_t* user, const struct pcap_pkthdr* pkthdr, @@ -366,9 +370,13 @@ namespace pcpp RawPacket rawPacket(packet, pkthdr->caplen, pkthdr->ts, false, pThis->getLinkType()); if (pThis->m_cbOnPacketArrivesBlockingMode != nullptr) + { if (pThis->m_cbOnPacketArrivesBlockingMode(&rawPacket, pThis, pThis->m_cbOnPacketArrivesBlockingModeUserCookie)) + { pThis->m_StopThread = true; + } + } } void PcapLiveDevice::captureThreadMain() @@ -858,7 +866,9 @@ namespace pcpp { // in blocking mode stop capture isn't relevant if (m_cbOnPacketArrivesBlockingMode != nullptr) + { return; + } if (m_CaptureThread.get_id() != std::thread::id{} && m_CaptureThread.get_id() == std::this_thread::get_id()) { @@ -1087,7 +1097,9 @@ namespace pcpp for (It iter = begin; iter != end; ++iter) { if (sendFunc(*iter)) + { packetsSent++; + } } PCPP_LOG_DEBUG(packetsSent << " packets sent successfully. " << totalPackets - packetsSent @@ -1356,12 +1368,16 @@ namespace pcpp std::string interfaceName; std::getline(lineStream, interfaceName, '\t'); if (interfaceName != m_InterfaceDetails.name) + { continue; + } std::string interfaceDest; std::getline(lineStream, interfaceDest, '\t'); if (interfaceDest != "00000000") + { continue; + } std::string interfaceGateway; std::getline(lineStream, interfaceGateway, '\t'); @@ -1468,7 +1484,9 @@ namespace pcpp // remove spaces while (ifaceInfo.at(0) == ' ') + { ifaceInfo.erase(0, 1); + } // erase string after gateway IP address ifaceInfo.resize(ifaceInfo.find(' ', 0)); diff --git a/Pcap++/src/PcapLiveDeviceList.cpp b/Pcap++/src/PcapLiveDeviceList.cpp index e8650bb3dd..8009396f05 100644 --- a/Pcap++/src/PcapLiveDeviceList.cpp +++ b/Pcap++/src/PcapLiveDeviceList.cpp @@ -95,7 +95,9 @@ namespace pcpp } if (dwRetVal != 0) + { PCPP_LOG_ERROR("Call to GetNetworkParams failed. Return Value: " << std::hex << dwRetVal); + } else { int dnsServerCounter = 0; @@ -145,9 +147,13 @@ namespace pcpp // build nmcli command according to its major version if (nmcliMajorVer == "0") + { command = "nmcli dev list | grep IP4.DNS"; + } else + { command = "nmcli dev show | grep IP4.DNS"; + } std::string dnsServersInfo = executeShellCommand(command); if (dnsServersInfo == "") @@ -217,7 +223,9 @@ namespace pcpp CFStringRef serverAddress = (CFStringRef)CFArrayGetValueAtIndex(serverAddresses, i); if (serverAddress == nullptr) + { continue; + } uint8_t buf[20]; char* serverAddressCString = (char*)buf; @@ -244,10 +252,14 @@ namespace pcpp { sockaddr* saddr = (sockaddr*)&_res.nsaddr_list[i]; if (saddr == nullptr) + { continue; + } in_addr* inaddr = internal::try_sockaddr2in_addr(saddr); if (inaddr == nullptr) + { continue; + } try { diff --git a/Pcap++/src/PfRingDevice.cpp b/Pcap++/src/PfRingDevice.cpp index 0638c40e71..61fcfe4be8 100644 --- a/Pcap++/src/PfRingDevice.cpp +++ b/Pcap++/src/PfRingDevice.cpp @@ -79,9 +79,13 @@ namespace pcpp return true; } else if (res == 1) + { PCPP_LOG_ERROR("Couldn't open a ring on device [" << m_DeviceName << "]"); + } else if (res == 2) + { PCPP_LOG_ERROR("Unable to enable ring for device [" << m_DeviceName << "]"); + } return false; } @@ -203,11 +207,15 @@ namespace pcpp continue; } else if (res == 1) + { PCPP_LOG_ERROR("Couldn't open a ring on channel [" << (int)channelId << "] for device [" << m_DeviceName << "]"); + } else if (res == 2) + { PCPP_LOG_ERROR("Unable to enable ring on channel [" << (int)channelId << "] for device [" << m_DeviceName << "]"); + } break; } @@ -254,7 +262,9 @@ namespace pcpp { // no more channels to open if (numOfRingsPerRxChannel == 0 && remainderRings == 0) + { break; + } std::ostringstream ringName; ringName << m_DeviceName << "@" << (int)channelId; @@ -309,8 +319,10 @@ namespace pcpp << "]"); } else + { PCPP_LOG_DEBUG("Opened " << (int)numOfRingsPerRxChannel << " rings on channel [" << (int)channelId << "]"); + } } if (m_PfRingDescriptors.size() < numOfRxChannelsToOpen) @@ -324,7 +336,9 @@ namespace pcpp for (pfring* rxChannel : m_PfRingDescriptors) { if (setPfRingDeviceClock(rxChannel)) + { PCPP_LOG_DEBUG("H/W clock set for device [" << m_DeviceName << "]"); + } } } @@ -380,10 +394,14 @@ namespace pcpp if (res < 0) { if (res == PF_RING_ERROR_NOT_SUPPORTED) + { PCPP_LOG_ERROR( "BPF filtering isn't supported on current PF_RING version. Please re-compile PF_RING with the --enable-bpf flag"); + } else + { PCPP_LOG_ERROR("Couldn't set filter '" << filterAsString << "'"); + } return false; } } @@ -397,7 +415,9 @@ namespace pcpp bool PfRingDevice::clearFilter() { if (!m_IsFilterCurrentlySet) + { return true; + } for (pfring* rxChannel : m_PfRingDescriptors) { @@ -466,7 +486,9 @@ namespace pcpp } if (!initCoreConfigurationByCoreMask(coreMask)) + { return false; + } if (m_PfRingDescriptors.size() != getCoresInUseCount()) { @@ -484,7 +506,9 @@ namespace pcpp for (int coreId = 0; coreId < MAX_NUM_OF_CORES; coreId++) { if (!m_CoreConfiguration[coreId].IsInUse) + { continue; + } m_ReentrantMode = true; @@ -512,7 +536,9 @@ namespace pcpp for (int coreId2 = coreId; coreId2 >= 0; coreId2--) { if (!m_CoreConfiguration[coreId2].IsInUse) + { continue; + } m_CoreConfiguration[coreId2].RxThread.join(); } @@ -596,7 +622,9 @@ namespace pcpp for (int coreId = 0; coreId < MAX_NUM_OF_CORES; coreId++) { if (!m_CoreConfiguration[coreId].IsInUse) + { continue; + } m_CoreConfiguration[coreId].RxThread.join(); PCPP_LOG_DEBUG("Thread on core [" << coreId << "] stopped"); } @@ -717,7 +745,9 @@ namespace pcpp for (int coreId = 0; coreId < MAX_NUM_OF_CORES; coreId++) { if (!m_CoreConfiguration[coreId].IsInUse) + { continue; + } PfRingStats tempStat = {}; getThreadStatistics(SystemCores::IdToSystemCore[coreId], tempStat); @@ -725,14 +755,18 @@ namespace pcpp stats.recv += tempStat.recv; if (!m_CoreConfiguration[coreId].IsAffinitySet) + { break; + } } } void PfRingDevice::clearCoreConfiguration() { for (auto& config : m_CoreConfiguration) + { config.clear(); + } } size_t PfRingDevice::getCoresInUseCount() const @@ -744,12 +778,16 @@ namespace pcpp void PfRingDevice::setPfRingDeviceAttributes() { if (m_InterfaceIndex > -1) + { return; + } pfring* ring = nullptr; bool closeRing = false; if (m_PfRingDescriptors.size() > 0) + { ring = m_PfRingDescriptors[0]; + } else { uint32_t flags = PF_RING_PROMISC | PF_RING_DNA_SYMMETRIC_RSS; @@ -768,13 +806,19 @@ namespace pcpp uint8_t macAddress[6]; if (pfring_get_bound_device_address(ring, macAddress) < 0) + { PCPP_LOG_ERROR("Unable to read the device MAC address for interface '" << m_DeviceName << "'"); + } else + { m_MacAddress = MacAddress(macAddress); + } // set interface ID if (pfring_get_bound_device_ifindex(ring, &m_InterfaceIndex) < 0) + { PCPP_LOG_ERROR("Unable to read interface index of device"); + } // try to set hardware device clock m_HwClockEnabled = setPfRingDeviceClock(ring); @@ -782,10 +826,14 @@ namespace pcpp // set interface MTU int mtu = pfring_get_mtu_size(ring); if (mtu < 0) + { // cppcheck-suppress shiftNegative PCPP_LOG_ERROR("Could not get MTU. pfring_get_mtu_size returned an error: " << mtu); + } else + { m_DeviceMTU = mtu + sizeof(ether_header) + sizeof(vlan_header); + } if (Logger::getInstance().isDebugEnabled(PcapLogModulePfRingDevice)) { @@ -796,7 +844,9 @@ namespace pcpp } if (closeRing) + { pfring_close(ring); + } } bool PfRingDevice::sendData(const uint8_t* packetData, int packetDataLength, bool flushTxQueues) @@ -816,7 +866,9 @@ namespace pcpp { // don't allow sending of data larger than the MTU, otherwise pfring_send will fail if (packetDataLength > m_DeviceMTU) + { packetDataLength = m_DeviceMTU; + } // if the device is opened, m_PfRingDescriptors[0] will always be set and enables res = pfring_send(m_PfRingDescriptors[0], (char*)packetData, packetDataLength, flushTxAsUint); @@ -834,7 +886,9 @@ namespace pcpp std::this_thread::sleep_for(std::chrono::microseconds(2000)); } else + { break; + } } if (tries >= MAX_TRIES) @@ -848,10 +902,14 @@ namespace pcpp // res == -1 means it's an error coming from "sendto" which is the Linux API PF_RING is using to send // packets if (res == -1) + { PCPP_LOG_ERROR("Error sending packet: Linux errno: " << strerror(errno) << " [" << errno << "]"); + } else + { PCPP_LOG_ERROR("Error sending packet: pfring_send returned an error: " << res << " , errno: " << strerror(errno) << " [" << errno << "]"); + } return false; } else if (res != packetDataLength) @@ -886,9 +944,13 @@ namespace pcpp for (int i = 0; i < arrLength; i++) { if (!sendData(rawPacketsArr[i].getRawData(), rawPacketsArr[i].getRawDataLen(), false)) + { break; + } else + { packetsSent++; + } } // In case of failure due to closed device, there are not handles to flush. @@ -910,9 +972,13 @@ namespace pcpp { if (!sendData(packetsArr[i]->getRawPacketReadOnly()->getRawData(), packetsArr[i]->getRawPacketReadOnly()->getRawDataLen(), false)) + { break; + } else + { packetsSent++; + } } // In case of failure due to closed device, there are not handles to flush. @@ -933,9 +999,13 @@ namespace pcpp for (RawPacketVector::ConstVectorIterator iter = rawPackets.begin(); iter != rawPackets.end(); iter++) { if (!sendData((*iter)->getRawData(), (*iter)->getRawDataLen(), false)) + { break; + } else + { packetsSent++; + } } // In case of failure due to closed device, there are not handles to flush. diff --git a/Pcap++/src/RawSocketDevice.cpp b/Pcap++/src/RawSocketDevice.cpp index 17b818790e..6301847311 100644 --- a/Pcap++/src/RawSocketDevice.cpp +++ b/Pcap++/src/RawSocketDevice.cpp @@ -38,7 +38,9 @@ namespace pcpp static void initialize() { if (m_IsInitialized) + { return; + } // Load Winsock WSADATA wsaData; @@ -110,7 +112,9 @@ namespace pcpp // value of 0 timeout means disabling timeout if (timeout < 0) + { timeout = 0; + } u_long blockingMode = (blocking ? 0 : 1); ioctlsocket(fd, FIONBIO, &blockingMode); @@ -127,7 +131,9 @@ namespace pcpp RecvPacketResult error = getError(errorCode); if (error == RecvError) + { PCPP_LOG_ERROR("Error reading from recvfrom. Error code is " << errorCode); + } return error; } @@ -158,7 +164,9 @@ namespace pcpp // value of 0 timeout means disabling timeout if (timeout < 0) + { timeout = 0; + } // set blocking or non-blocking flag int flags = fcntl(fd, F_GETFL, 0); @@ -190,7 +198,9 @@ namespace pcpp RecvPacketResult error = getError(errorCode); if (error == RecvError) + { PCPP_LOG_ERROR("Error reading from recvfrom. Error code is " << errorCode); + } return error; } @@ -380,8 +390,10 @@ namespace pcpp int error = WSAGetLastError(); std::string additionalMessage = ""; if (error == WSAEACCES) + { additionalMessage = ", you may not be running with administrative privileges which is required for opening raw sockets on Windows"; + } PCPP_LOG_ERROR("Failed to create raw socket. Error code was " << error << " " << additionalMessage); return false; } @@ -558,14 +570,20 @@ namespace pcpp #if defined(_WIN32) errorCode = WSAGetLastError(); if (errorCode == WSAEWOULDBLOCK) + { return RecvWouldBlock; + } if (errorCode == WSAETIMEDOUT) + { return RecvTimeout; + } return RecvError; #elif defined(__linux__) if ((errorCode == EAGAIN) || (errorCode == EWOULDBLOCK)) + { return RecvWouldBlock; + } return RecvError; #else diff --git a/Pcap++/src/WinPcapLiveDevice.cpp b/Pcap++/src/WinPcapLiveDevice.cpp index c8b62f6cef..6b218ca412 100644 --- a/Pcap++/src/WinPcapLiveDevice.cpp +++ b/Pcap++/src/WinPcapLiveDevice.cpp @@ -29,7 +29,9 @@ namespace pcpp int dataSize = 0; int packetsSent = 0; for (int i = 0; i < arrLength; i++) + { dataSize += rawPacketsArr[i].getRawDataLen(); + } struct PcapSendQueueDeleter { diff --git a/Tests/Fuzzers/FuzzTarget.cpp b/Tests/Fuzzers/FuzzTarget.cpp index c81ab1d91a..44c18da4a5 100644 --- a/Tests/Fuzzers/FuzzTarget.cpp +++ b/Tests/Fuzzers/FuzzTarget.cpp @@ -1,6 +1,6 @@ -#include -#include -#include +#include "PcapFileDevice.h" +#include "Packet.h" +#include "Logger.h" #include "DumpToFile.h" #include "ReadParsedPacket.h" @@ -10,10 +10,14 @@ static std::string tmpFile; extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { if (tmpName.empty()) + { tmpName = tmpnam(nullptr); + } if (tmpFile.empty()) + { tmpFile = tmpName + FILE_EXT; + } if (dumpDataToPcapFile(data, size, tmpFile.c_str()) != 0) { diff --git a/Tests/Fuzzers/FuzzWriter.cpp b/Tests/Fuzzers/FuzzWriter.cpp index 588040d421..9519ab4dd5 100644 --- a/Tests/Fuzzers/FuzzWriter.cpp +++ b/Tests/Fuzzers/FuzzWriter.cpp @@ -13,10 +13,14 @@ static int writes = 0; extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { if (tmpName.empty()) + { tmpName = tmpnam(nullptr); + } if (tmpFile.empty()) + { tmpFile = tmpName + FILE_EXT; + } if (dumpDataToPcapFile(data, size, tmpFile.c_str()) != 0) { diff --git a/Tests/Fuzzers/ReadParsedPacket.h b/Tests/Fuzzers/ReadParsedPacket.h index ad17867c86..e0d3291aad 100644 --- a/Tests/Fuzzers/ReadParsedPacket.h +++ b/Tests/Fuzzers/ReadParsedPacket.h @@ -68,7 +68,9 @@ static void readParsedPacket(pcpp::Packet parsedPacket, pcpp::Layer* layer) { auto opts = someipLayer->getOptionsFromEntry(0); for (auto opt : opts) + { delete opt; + } } for (auto entry : entries) @@ -246,9 +248,13 @@ static void readParsedPacket(pcpp::Packet parsedPacket, pcpp::Layer* layer) clientHelloMessage->getCipherSuiteID(i, valid); } if (auto ext = clientHelloMessage->getExtensionOfType()) + { ext->getHostName(); + } if (auto ext = clientHelloMessage->getExtensionOfType()) + { ext->getSupportedVersions(); + } clientHelloMessage->getExtensionOfType(pcpp::SSL_EXT_SERVER_NAME); clientHelloMessage->getExtensionOfType((uint16_t)0); diff --git a/Tests/Packet++Test/Tests/IPv4Tests.cpp b/Tests/Packet++Test/Tests/IPv4Tests.cpp index 0eca1553f5..c6baddfb53 100644 --- a/Tests/Packet++Test/Tests/IPv4Tests.cpp +++ b/Tests/Packet++Test/Tests/IPv4Tests.cpp @@ -391,7 +391,9 @@ PTF_TEST_CASE(IPv4OptionsEditTest) ipListValue.push_back(pcpp::IPv4Address("10.0.0.138")); ipListValue.push_back(pcpp::IPv4Address("10.0.0.138")); for (int i = 0; i < 6; i++) + { ipListValue.push_back(pcpp::IPv4Address::Zero); + } PTF_ASSERT_FALSE(ipLayer->addOption(pcpp::IPv4OptionBuilder(pcpp::IPV4OPT_RecordRoute, ipListValue)).isNull()); PTF_ASSERT_FALSE(ipLayer->addOption(pcpp::IPv4OptionBuilder(pcpp::IPV4OPT_EndOfOptionsList, nullptr, 0)).isNull()); ipOpt4.computeCalculateFields(); diff --git a/Tests/Packet++Test/Utils/TestUtils.cpp b/Tests/Packet++Test/Utils/TestUtils.cpp index 80f07f6884..7960f18106 100644 --- a/Tests/Packet++Test/Utils/TestUtils.cpp +++ b/Tests/Packet++Test/Utils/TestUtils.cpp @@ -12,7 +12,9 @@ namespace pcpp_tests { std::ifstream infile(filename, std::ifstream::binary); if (!infile) + { return -1; + } infile.seekg(0, infile.end); int length = infile.tellg(); infile.close(); @@ -24,11 +26,17 @@ namespace pcpp_tests std::uint8_t hexCharToDigit(char c) { if (c >= '0' && c <= '9') + { return c - '0'; + } if (c >= 'a' && c <= 'f') + { return c - 'a' + 10; + } if (c >= 'A' && c <= 'F') + { return c - 'A' + 10; + } throw std::invalid_argument("Invalid hex character"); } @@ -42,11 +50,15 @@ namespace pcpp_tests { int fileLength = getFileLength(filename); if (fileLength == -1) + { throw std::runtime_error(std::string("Failed to open file: ") + filename); + } std::ifstream infile(filename); if (!infile) + { throw std::runtime_error(std::string("Failed to open file: ") + filename); + } std::vector buffer; char hexPair[2]; // 0 - high, 1 - low @@ -61,11 +73,15 @@ namespace pcpp_tests { int fileLength = getFileLength(filename); if (fileLength == -1) + { return nullptr; + } std::ifstream infile(filename); if (!infile) + { return nullptr; + } bufferLength = fileLength / 2 + 2; uint8_t* result = new uint8_t[bufferLength]; diff --git a/Tests/Packet++Test/main.cpp b/Tests/Packet++Test/main.cpp index 5a6fd6cf1e..5eaad91e77 100644 --- a/Tests/Packet++Test/main.cpp +++ b/Tests/Packet++Test/main.cpp @@ -99,7 +99,9 @@ int main(int argc, char* argv[]) if (skipMemLeakCheck) { if (configTags != "") + { configTags += ";"; + } configTags += "skip_mem_leak_check"; std::cout << "Skipping memory leak check for all test cases" << std::endl; @@ -108,7 +110,9 @@ int main(int argc, char* argv[]) if (memVerbose) { if (configTags != "") + { configTags += ";"; + } configTags += "mem_leak_check_verbose"; std::cout << "Turning on verbose information on memory allocations" << std::endl; diff --git a/Tests/Pcap++Test/Common/TestUtils.cpp b/Tests/Pcap++Test/Common/TestUtils.cpp index 14fd12a841..ba39cbfa29 100644 --- a/Tests/Pcap++Test/Common/TestUtils.cpp +++ b/Tests/Pcap++Test/Common/TestUtils.cpp @@ -52,7 +52,9 @@ int getFileLength(const std::string& filename) { std::ifstream infile(filename.c_str(), std::ifstream::binary); if (!infile) + { return -1; + } infile.seekg(0, infile.end); int length = infile.tellg(); infile.close(); @@ -63,11 +65,15 @@ uint8_t* readFileIntoBuffer(const std::string& filename, int& bufferLength) { int fileLength = getFileLength(filename); if (fileLength == -1) + { return nullptr; + } std::ifstream infile(filename.c_str()); if (!infile) + { return nullptr; + } bufferLength = fileLength / 2 + 2; uint8_t* result = new uint8_t[bufferLength]; diff --git a/Tests/Pcap++Test/Common/TestUtils.h b/Tests/Pcap++Test/Common/TestUtils.h index 9178697604..f68e58544d 100644 --- a/Tests/Pcap++Test/Common/TestUtils.h +++ b/Tests/Pcap++Test/Common/TestUtils.h @@ -55,9 +55,13 @@ void intersectMaps(const std::unordered_map& left, while (il != left.end() && ir != right.end()) { if (il->first < ir->first) + { ++il; + } else if (ir->first < il->first) + { ++ir; + } else { result.insert(std::make_pair(il->first, std::make_pair(il->second, ir->second))); diff --git a/Tests/Pcap++Test/Tests/DpdkTests.cpp b/Tests/Pcap++Test/Tests/DpdkTests.cpp index fe68284c8d..d47cbe8118 100644 --- a/Tests/Pcap++Test/Tests/DpdkTests.cpp +++ b/Tests/Pcap++Test/Tests/DpdkTests.cpp @@ -61,7 +61,9 @@ int incSleep(int maxSleepTime, int minPacketCount, const DpdkPacketData& packetD std::this_thread::sleep_for(std::chrono::seconds(1)); totalSleepTime += 1; if (packetData.PacketCount > minPacketCount) + { break; + } } return totalSleepTime; @@ -80,14 +82,20 @@ int incSleepMultiThread(int maxSleepTime, DpdkPacketData packetData[], int total for (int i = 0; i < totalNumOfCores; i++) { if ((pcpp::SystemCores::IdToSystemCore[i].Mask & coreMask) == 0) + { continue; + } if (packetData[i].PacketCount > 0) + { coresWithPacketCountNotZero++; + } } if (coresWithPacketCountNotZero >= numOfCoresInUse) + { break; + } } return totalSleepTime; @@ -105,19 +113,33 @@ void dpdkPacketsArrive(pcpp::MBufRawPacket* packets, uint32_t numOfPackets, uint { pcpp::Packet packet(&packets[i]); if (packet.isPacketOfType(pcpp::Ethernet)) + { data->EthCount++; + } if (packet.isPacketOfType(pcpp::ARP)) + { data->ArpCount++; + } if (packet.isPacketOfType(pcpp::IPv4)) + { data->Ip4Count++; + } if (packet.isPacketOfType(pcpp::IPv6)) + { data->Ip6Count++; + } if (packet.isPacketOfType(pcpp::TCP)) + { data->TcpCount++; + } if (packet.isPacketOfType(pcpp::UDP)) + { data->UdpCount++; + } if (packet.isPacketOfType(pcpp::HTTP)) + { data->HttpCount++; + } } } @@ -133,13 +155,21 @@ void dpdkPacketsArriveMultiThread(pcpp::MBufRawPacket* packets, uint32_t numOfPa { pcpp::Packet packet(&packets[i]); if (packet.isPacketOfType(pcpp::Ethernet)) + { data[threadId].EthCount++; + } if (packet.isPacketOfType(pcpp::ARP)) + { data[threadId].ArpCount++; + } if (packet.isPacketOfType(pcpp::IPv4)) + { data[threadId].Ip4Count++; + } if (packet.isPacketOfType(pcpp::IPv6)) + { data[threadId].Ip6Count++; + } if (packet.isPacketOfType(pcpp::TCP)) { data[threadId].TcpCount++; @@ -159,7 +189,9 @@ void dpdkPacketsArriveMultiThread(pcpp::MBufRawPacket* packets, uint32_t numOfPa } } if (packet.isPacketOfType(pcpp::HTTP)) + { data[threadId].HttpCount++; + } } } @@ -230,7 +262,9 @@ class DpdkTestWorkerThread : public pcpp::DpdkWorkerThread for (int i = 0; i < 32; i++) { if (mBufArr[i] != nullptr) + { delete mBufArr[i]; + } } m_RanAndStopped = true; @@ -389,7 +423,9 @@ PTF_TEST_CASE(TestDpdkMultiThread) int numOfRxQueuesToOpen = pcpp::getNumOfCores() - 1; // using num of cores minus one since 1 core is the master core and cannot be used if (dev->getTotalNumOfRxQueues() < numOfRxQueuesToOpen) + { numOfRxQueuesToOpen = dev->getTotalNumOfRxQueues(); + } // verify num of RX queues is power of 2 due to DPDK limitation bool isRxQueuePowerOfTwo = !(numOfRxQueuesToOpen == 0) && !(numOfRxQueuesToOpen & (numOfRxQueuesToOpen - 1)); @@ -431,7 +467,9 @@ PTF_TEST_CASE(TestDpdkMultiThread) for (int coreId = 0; coreId < pcpp::getNumOfCores(); coreId++) { if (numOfCoresInUse == numOfRxQueuesToOpen) + { break; + } if (coreId != masterCore.Id) { @@ -450,7 +488,9 @@ PTF_TEST_CASE(TestDpdkMultiThread) for (int i = 0; i < pcpp::getNumOfCores(); i++) { if ((pcpp::SystemCores::IdToSystemCore[i].Mask & coreMask) == 0) + { continue; + } PTF_PRINT_VERBOSE("Thread ID: " << packetDataMultiThread[i].ThreadId); PTF_PRINT_VERBOSE("Total packets captured: " << packetDataMultiThread[i].PacketCount); @@ -482,12 +522,16 @@ PTF_TEST_CASE(TestDpdkMultiThread) for (int firstCoreId = 0; firstCoreId < pcpp::getNumOfCores(); firstCoreId++) { if ((pcpp::SystemCores::IdToSystemCore[firstCoreId].Mask & coreMask) == 0) + { continue; + } for (int secondCoreId = firstCoreId + 1; secondCoreId < pcpp::getNumOfCores(); secondCoreId++) { if ((pcpp::SystemCores::IdToSystemCore[secondCoreId].Mask & coreMask) == 0) + { continue; + } std::unordered_map> res; intersectMaps( @@ -569,7 +613,9 @@ PTF_TEST_CASE(TestDpdkDeviceSendPackets) while (fileReaderDev.getNextPacket(rawPacket)) { if (packetsRead == 100) + { break; + } pcpp::RawPacket* newRawPacket = new pcpp::RawPacket(rawPacket); rawPacketVec.pushBack(newRawPacket); @@ -672,7 +718,9 @@ PTF_TEST_CASE(TestDpdkDeviceWorkerThreads) ++rxQueueId; } if (isPacketRecvd) + { break; + } numOfAttempts++; } @@ -700,7 +748,9 @@ PTF_TEST_CASE(TestDpdkDeviceWorkerThreads) ++rxQueueId; } if (isPacketRecvd) + { break; + } numOfAttempts++; } @@ -711,7 +761,9 @@ PTF_TEST_CASE(TestDpdkDeviceWorkerThreads) for (int i = 0; i < 32; i++) { if (mBufRawPacketArr[i] != nullptr) + { delete mBufRawPacketArr[i]; + } } // receive packets to packet array @@ -733,7 +785,9 @@ PTF_TEST_CASE(TestDpdkDeviceWorkerThreads) ++rxQueueId; } if (isPacketRecvd) + { break; + } numOfAttempts++; } @@ -743,7 +797,9 @@ PTF_TEST_CASE(TestDpdkDeviceWorkerThreads) for (int i = 0; i < 32; i++) { if (packetArr[i] != nullptr) + { delete packetArr[i]; + } } // test worker threads @@ -756,7 +812,9 @@ PTF_TEST_CASE(TestDpdkDeviceWorkerThreads) { pcpp::SystemCore core = pcpp::SystemCores::IdToSystemCore[i]; if (core == pcpp::DpdkDeviceList::getInstance().getDpdkMasterCore()) + { continue; + } DpdkTestWorkerThread* newWorkerThread = new DpdkTestWorkerThread(); int queueId = core.Id % numOfRxQueues; PTF_PRINT_VERBOSE("Assigning queue #" << queueId << " to core " << core.Id); @@ -798,7 +856,9 @@ PTF_TEST_CASE(TestDpdkDeviceWorkerThreads) std::this_thread::sleep_for(std::chrono::seconds(1)); if (stats.aggregatedRxStats.packets > curPackets) + { break; + } numOfAttempts++; } @@ -860,19 +920,29 @@ PTF_TEST_CASE(TestDpdkMbufRawPacket) pcpp::MBufRawPacket mBufRawPacket; PTF_ASSERT_TRUE(mBufRawPacket.init(dev)); if (!(reader.getNextPacket(mBufRawPacket))) + { break; + } numOfPackets++; pcpp::Packet packet(&mBufRawPacket); if (packet.isPacketOfType(pcpp::TCP)) + { tcpCount++; + } if (packet.isPacketOfType(pcpp::UDP)) + { udpCount++; + } if (packet.isPacketOfType(pcpp::IPv6)) + { ip6Count++; + } if (packet.isPacketOfType(pcpp::VLAN)) + { vlanCount++; + } if (numOfPackets < 100) { @@ -913,7 +983,9 @@ PTF_TEST_CASE(TestDpdkMbufRawPacket) } if (foundTcpOrUdpPacket) + { break; + } numOfAttempts++; } @@ -1000,11 +1072,17 @@ PTF_TEST_CASE(TestDpdkMbufRawPacket) { int randomChar = rand() % (26 + 26 + 10); if (randomChar < 26) + { name[j] = 'a' + randomChar; + } else if (randomChar < 26 + 26) + { name[j] = 'A' + randomChar - 26; + } else + { name[j] = '0' + randomChar - 26 - 26; + } } name[nameLength] = 0; diff --git a/Tests/Pcap++Test/Tests/FileTests.cpp b/Tests/Pcap++Test/Tests/FileTests.cpp index 2d631d3ef6..400ef5ae8e 100644 --- a/Tests/Pcap++Test/Tests/FileTests.cpp +++ b/Tests/Pcap++Test/Tests/FileTests.cpp @@ -49,15 +49,25 @@ PTF_TEST_CASE(TestPcapFileReadWrite) packetCount++; pcpp::Packet packet(&rawPacket); if (packet.isPacketOfType(pcpp::Ethernet)) + { ethCount++; + } if (packet.isPacketOfType(pcpp::SLL)) + { sllCount++; + } if (packet.isPacketOfType(pcpp::IPv4)) + { ipCount++; + } if (packet.isPacketOfType(pcpp::TCP)) + { tcpCount++; + } if (packet.isPacketOfType(pcpp::UDP)) + { udpCount++; + } PTF_ASSERT_TRUE(writerDev.writePacket(rawPacket)); } @@ -239,15 +249,25 @@ PTF_TEST_CASE(TestPcapSllFileReadWrite) packetCount++; pcpp::Packet packet(&rawPacket); if (packet.isPacketOfType(pcpp::Ethernet)) + { ethCount++; + } if (packet.isPacketOfType(pcpp::SLL)) + { sllCount++; + } if (packet.isPacketOfType(pcpp::IPv4)) + { ipCount++; + } if (packet.isPacketOfType(pcpp::TCP)) + { tcpCount++; + } if (packet.isPacketOfType(pcpp::UDP)) + { udpCount++; + } PTF_ASSERT_TRUE(writerDev.writePacket(rawPacket)); } @@ -291,9 +311,13 @@ PTF_TEST_CASE(TestPcapSll2FileReadWrite) packetCount++; pcpp::Packet packet(&rawPacket); if (packet.isPacketOfType(pcpp::SLL2)) + { sll2Count++; + } if (packet.isPacketOfType(pcpp::IP)) + { ipCount++; + } if (canOpenWriterDevice) { @@ -347,15 +371,25 @@ PTF_TEST_CASE(TestPcapRawIPFileReadWrite) packetCount++; pcpp::Packet packet(&rawPacket); if (packet.isPacketOfType(pcpp::Ethernet)) + { ethCount++; + } if (packet.isPacketOfType(pcpp::IPv4)) + { ipv4Count++; + } if (packet.isPacketOfType(pcpp::IPv6)) + { ipv6Count++; + } if (packet.isPacketOfType(pcpp::TCP)) + { tcpCount++; + } if (packet.isPacketOfType(pcpp::UDP)) + { udpCount++; + } writerDev.writePacket(rawPacket); writerNgDev.writePacket(rawPacket); @@ -418,7 +452,9 @@ PTF_TEST_CASE(TestPcapFileAppend) int counter = 0; pcpp::RawPacket rawPacket; while (readerDev.getNextPacket(rawPacket)) + { counter++; + } PTF_ASSERT_EQUAL(counter, (4631 * 5)); @@ -461,23 +497,39 @@ PTF_TEST_CASE(TestPcapNgFileReadWrite) pcpp::LinkLayerType linkType = rawPacket.getLinkLayerType(); if (linkType == pcpp::LINKTYPE_ETHERNET) + { ethLinkLayerCount++; + } else if (linkType == pcpp::LINKTYPE_NULL) + { nullLinkLayerCount++; + } else + { otherLinkLayerCount++; + } pcpp::Packet packet(&rawPacket); if (packet.isPacketOfType(pcpp::Ethernet)) + { ethCount++; + } if (packet.isPacketOfType(pcpp::NULL_LOOPBACK)) + { nullLoopbackCount++; + } if (packet.isPacketOfType(pcpp::IPv4)) + { ipCount++; + } if (packet.isPacketOfType(pcpp::TCP)) + { tcpCount++; + } if (packet.isPacketOfType(pcpp::UDP)) + { udpCount++; + } PTF_ASSERT_TRUE(writerDev.writePacket(rawPacket)); PTF_ASSERT_TRUE(writerCompressDev.writePacket(rawPacket)); @@ -565,23 +617,39 @@ PTF_TEST_CASE(TestPcapNgFileReadWriteAdv) packetCount++; if (rawPacket.getRawDataLen() != rawPacket.getFrameLength()) + { capLenNotMatchOrigLen++; + } pcpp::Packet packet(&rawPacket); if (packet.isPacketOfType(pcpp::Ethernet)) + { ethCount++; + } if (packet.isPacketOfType(pcpp::SLL)) + { sllCount++; + } if (packet.isPacketOfType(pcpp::IPv4)) + { ip4Count++; + } if (packet.isPacketOfType(pcpp::IPv6)) + { ip6Count++; + } if (packet.isPacketOfType(pcpp::TCP)) + { tcpCount++; + } if (packet.isPacketOfType(pcpp::UDP)) + { udpCount++; + } if (packet.isPacketOfType(pcpp::HTTP)) + { httpCount++; + } if (pktComment != "") { @@ -657,19 +725,33 @@ PTF_TEST_CASE(TestPcapNgFileReadWriteAdv) packetCount++; pcpp::Packet packet(&rawPacket); if (packet.isPacketOfType(pcpp::Ethernet)) + { ethCount++; + } if (packet.isPacketOfType(pcpp::SLL)) + { sllCount++; + } if (packet.isPacketOfType(pcpp::IPv4)) + { ip4Count++; + } if (packet.isPacketOfType(pcpp::IPv6)) + { ip6Count++; + } if (packet.isPacketOfType(pcpp::TCP)) + { tcpCount++; + } if (packet.isPacketOfType(pcpp::UDP)) + { udpCount++; + } if (packet.isPacketOfType(pcpp::HTTP)) + { httpCount++; + } if (pktComment != "") { @@ -826,9 +908,13 @@ PTF_TEST_CASE(TestPcapNgFileReadWriteAdv) { filteredReadPacketCount++; if (writerDev2.writePacket(rawPacket)) + { filteredWritePacketCount++; + } if (writerCompressDev2.writePacket(rawPacket)) + { filteredCompressWritePacketCount++; + } } PTF_ASSERT_EQUAL(filteredReadPacketCount, 14); @@ -877,13 +963,21 @@ PTF_TEST_CASE(TestPcapFileReadLinkTypeIPv6) packetCount++; pcpp::Packet packet(&rawPacket); if (packet.isPacketOfType(pcpp::Ethernet)) + { ethCount++; + } if (packet.isPacketOfType(pcpp::IPv6)) + { ipCount++; + } if (packet.isPacketOfType(pcpp::TCP)) + { tcpCount++; + } if (packet.isPacketOfType(pcpp::UDP)) + { udpCount++; + } } pcpp::IPcapDevice::PcapStats readerStatistics; @@ -920,13 +1014,21 @@ PTF_TEST_CASE(TestPcapFileReadLinkTypeIPv4) packetCount++; pcpp::Packet packet(&rawPacket); if (packet.isPacketOfType(pcpp::Ethernet)) + { ethCount++; + } if (packet.isPacketOfType(pcpp::IPv4)) + { ipCount++; + } if (packet.isPacketOfType(pcpp::TCP)) + { tcpCount++; + } if (packet.isPacketOfType(pcpp::UDP)) + { udpCount++; + } } pcpp::IPcapDevice::PcapStats readerStatistics; @@ -963,15 +1065,25 @@ PTF_TEST_CASE(TestSolarisSnoopFileRead) packetCount++; pcpp::Packet packet(&rawPacket); if (packet.isPacketOfType(pcpp::Ethernet)) + { ethCount++; + } if (packet.isPacketOfType(pcpp::EthernetDot3)) + { ethDot3Count++; + } if (packet.isPacketOfType(pcpp::IPv4)) + { ipCount++; + } if (packet.isPacketOfType(pcpp::TCP)) + { tcpCount++; + } if (packet.isPacketOfType(pcpp::UDP)) + { udpCount++; + } timeStamps.push_back(rawPacket.getPacketTimeStamp()); } diff --git a/Tests/Pcap++Test/Tests/IpMacTests.cpp b/Tests/Pcap++Test/Tests/IpMacTests.cpp index f460a8960e..6b0c27ffd9 100644 --- a/Tests/Pcap++Test/Tests/IpMacTests.cpp +++ b/Tests/Pcap++Test/Tests/IpMacTests.cpp @@ -481,7 +481,9 @@ PTF_TEST_CASE(TestGetMacAddress) } if (ipAddr == liveDev->getIPv4Address()) + { continue; + } foundValidIpAddr = true; pcpp::Logger::getInstance().suppressLogs(); @@ -490,12 +492,16 @@ PTF_TEST_CASE(TestGetMacAddress) { result = pcpp::NetworkUtils::getInstance().getMacAddress(ipAddr, liveDev, time); if (result != pcpp::MacAddress::Zero) + { break; + } } pcpp::Logger::getInstance().enableLogs(); if (result != pcpp::MacAddress::Zero) + { break; + } } if (foundValidIpAddr) diff --git a/Tests/Pcap++Test/Tests/KniTests.cpp b/Tests/Pcap++Test/Tests/KniTests.cpp index ae0f9e3288..a25013b399 100644 --- a/Tests/Pcap++Test/Tests/KniTests.cpp +++ b/Tests/Pcap++Test/Tests/KniTests.cpp @@ -173,7 +173,9 @@ PTF_TEST_CASE(TestKniDevice) pcpp::KniDevice::KniLinkState linkState = device->getLinkState(pcpp::KniDevice::INFO_RENEW); PTF_ASSERT_TRUE(linkState == pcpp::KniDevice::LINK_DOWN || linkState == pcpp::KniDevice::LINK_UP); if (linkState == pcpp::KniDevice::LINK_DOWN) + { isLinkUp = false; + } } { pcpp::MacAddress mac = device->getMacAddress(); @@ -449,7 +451,9 @@ PTF_TEST_CASE(TestKniDeviceSendReceive) while (fileReaderDev.getNextPacket(rawPacket)) { if (packetsRead == 100) + { break; + } pcpp::RawPacket* newRawPacket = new pcpp::RawPacket(rawPacket); sendRawPacketVec.pushBack(newRawPacket); pcpp::Packet* newPacket = new pcpp::Packet(newRawPacket, false); diff --git a/Tests/Pcap++Test/Tests/LiveDeviceTests.cpp b/Tests/Pcap++Test/Tests/LiveDeviceTests.cpp index ee3b961f2e..5134e40a8e 100644 --- a/Tests/Pcap++Test/Tests/LiveDeviceTests.cpp +++ b/Tests/Pcap++Test/Tests/LiveDeviceTests.cpp @@ -44,7 +44,9 @@ static bool packetArrivesBlockingModeNoTimeout(pcpp::RawPacket* rawPacket, pcpp: { int* packetCount = static_cast(userCookie); if ((*packetCount) == 5) + { return true; + } (*packetCount)++; return false; @@ -55,17 +57,23 @@ static bool packetArrivesBlockingModeStartCapture(pcpp::RawPacket* rawPacket, pc { pcpp::Logger::getInstance().suppressLogs(); if (dev->startCaptureBlockingMode(packetArrivesBlockingModeTimeout, nullptr, 5) != 0) + { return false; + } int temp = 0; if (dev->startCapture(packetArrives, &temp) != 0) + { return false; + } pcpp::Logger::getInstance().enableLogs(); int* packetCount = static_cast(userCookie); if ((*packetCount) == 5) + { return true; + } (*packetCount)++; return false; @@ -79,7 +87,9 @@ static bool packetArrivesBlockingModeStopCapture(pcpp::RawPacket* rawPacket, pcp int* packetCount = static_cast(userCookie); if ((*packetCount) == 5) + { return true; + } (*packetCount)++; return false; @@ -129,7 +139,9 @@ class RpcapdServerInitializer : m_ProcessHandle(nullptr), m_JobHandle(nullptr) { if (!activateRemoteDevice) + { return; + } std::string cmd = "rpcapd\\rpcapd.exe"; std::array args; @@ -234,7 +246,9 @@ PTF_TEST_CASE(TestPcapLiveDeviceList) { PTF_ASSERT_FALSE(iter->getName().empty()); if (defaultGateway == pcpp::IPv4Address::Zero) + { defaultGateway = iter->getDefaultGateway(); + } } PTF_ASSERT_NOT_EQUAL(defaultGateway, pcpp::IPv4Address::Zero); @@ -318,7 +332,9 @@ PTF_TEST_CASE(TestPcapLiveDevice) std::this_thread::sleep_for(std::chrono::seconds(2)); totalSleepTime += 2; if (packetCount > 0) + { break; + } } PTF_PRINT_VERBOSE("Total sleep time: " << totalSleepTime << " secs"); @@ -379,7 +395,9 @@ PTF_TEST_CASE(TestPcapLiveDeviceClone) std::this_thread::sleep_for(std::chrono::seconds(2)); totalSleepTime += 2; if (packetCount > 0) + { break; + } } PTF_PRINT_VERBOSE("Total sleep time: " << totalSleepTime << " secs"); @@ -451,7 +469,9 @@ PTF_TEST_CASE(TestPcapLiveDeviceStatsMode) pcpp::IPcapDevice::PcapStats statistics; liveDev->getStatistics(statistics); if (statistics.packetsRecv > 2) + { break; + } } PTF_PRINT_VERBOSE("Total sleep time: " << totalSleepTime << " secs"); @@ -517,7 +537,9 @@ PTF_TEST_CASE(TestPcapLiveDeviceBlockingMode) std::this_thread::sleep_for(std::chrono::seconds(1)); totalSleepTime += 1; if (packetCount > 0) + { break; + } } liveDev->stopCapture(); @@ -556,7 +578,9 @@ PTF_TEST_CASE(TestPcapLiveDeviceBlockingMode) std::this_thread::sleep_for(std::chrono::seconds(1)); totalSleepTime += 1; if (packetCount > 0) + { break; + } } PTF_PRINT_VERBOSE("Total sleep time: " << totalSleepTime << " secs"); @@ -601,7 +625,9 @@ PTF_TEST_CASE(TestPcapLiveDeviceWithLambda) std::this_thread::sleep_for(std::chrono::seconds(2)); totalSleepTime += 2; if (packetCount > 0) + { break; + } } PTF_PRINT_VERBOSE("Total sleep time: " << totalSleepTime << " secs"); @@ -617,7 +643,9 @@ PTF_TEST_CASE(TestPcapLiveDeviceBlockingModeWithLambda) void* userCookie) { int* packetCount = static_cast(userCookie); if ((*packetCount) == 5) + { return true; + } (*packetCount)++; return false; @@ -974,7 +1002,9 @@ PTF_TEST_CASE(TestRemoteCapture) PTF_ASSERT_TRUE(remoteDevice->startCapture(capturedPackets)); if (!useRemoteDevicesFromArgs) + { PTF_ASSERT_TRUE(sendURLRequest("www.yahoo.com")); + } int totalSleepTime = 0; while (totalSleepTime < 10) @@ -1009,7 +1039,9 @@ PTF_TEST_CASE(TestRemoteCapture) packetsToSend.pushBack(capturedPackets.getAndDetach(iter)); } else + { ++iter; + } } int packetsSent = remoteDevice->sendPackets(packetsToSend); PTF_ASSERT_EQUAL(packetsSent, static_cast(packetsToSend.size())); diff --git a/Tests/Pcap++Test/Tests/PacketParsingTests.cpp b/Tests/Pcap++Test/Tests/PacketParsingTests.cpp index a22fbb9437..c3f41f5a6b 100644 --- a/Tests/Pcap++Test/Tests/PacketParsingTests.cpp +++ b/Tests/Pcap++Test/Tests/PacketParsingTests.cpp @@ -38,9 +38,13 @@ PTF_TEST_CASE(TestHttpRequestParsing) packetCount++; pcpp::Packet packet(&rawPacket); if (packet.isPacketOfType(pcpp::HTTPRequest)) + { httpPackets++; + } else + { continue; + } pcpp::HttpRequestLayer* httpReqLayer = packet.getLayerOfType(); PTF_ASSERT_NOT_NULL(httpReqLayer->getFirstLine()); @@ -68,33 +72,51 @@ PTF_TEST_CASE(TestHttpRequestParsing) } if (httpReqLayer->getFirstLine()->getUri().find(".swf") != std::string::npos) + { swfReqs++; + } else if (httpReqLayer->getFirstLine()->getUri().find("home") != std::string::npos) + { homeReqs++; + } pcpp::HeaderField* hostField = httpReqLayer->getFieldByName("Host"); if (hostField != nullptr) { std::string host = hostField->getFieldValue(); if (host == "www.winwin.co.il") + { winwinReqs++; + } else if (host == "www.yad2.co.il") + { yad2Reqs++; + } else if (host == "www.google.com") + { googleReqs++; + } } pcpp::HeaderField* userAgentField = httpReqLayer->getFieldByName("User-Agent"); if (userAgentField == nullptr) + { continue; + } std::string userAgent = userAgentField->getFieldValue(); if (userAgent.find("Trident/7.0") != std::string::npos) + { ieReqs++; + } else if (userAgent.find("Firefox/33.0") != std::string::npos) + { ffReqs++; + } else if (userAgent.find("Chrome/38.0") != std::string::npos) + { chromeReqs++; + } } readerDev.close(); @@ -165,9 +187,13 @@ PTF_TEST_CASE(TestHttpResponseParsing) packetCount++; pcpp::Packet packet(&rawPacket); if (packet.isPacketOfType(pcpp::HTTPResponse)) + { httpResponsePackets++; + } else + { continue; + } pcpp::HttpResponseLayer* httpResLayer = packet.getLayerOfType(); PTF_ASSERT_NOT_NULL(httpResLayer->getFirstLine()); @@ -190,18 +216,26 @@ PTF_TEST_CASE(TestHttpResponseParsing) { std::string contentType = contentTypeField->getFieldValue(); if (contentType.find("image/") != std::string::npos) + { imageCount++; + } else if (contentType == "text/html") + { textHtmlCount++; + } } pcpp::HeaderField* contentEncodingField = httpResLayer->getFieldByName(PCPP_HTTP_CONTENT_ENCODING_FIELD); if (contentEncodingField != nullptr && contentEncodingField->getFieldValue() == "gzip") + { gzipCount++; + } pcpp::HeaderField* transferEncodingField = httpResLayer->getFieldByName(PCPP_HTTP_TRANSFER_ENCODING_FIELD); if (transferEncodingField != nullptr && transferEncodingField->getFieldValue() == "chunked") + { chunkedCount++; + } pcpp::HeaderField* contentLengthField = httpResLayer->getFieldByName(PCPP_HTTP_CONTENT_LENGTH_FIELD); if (contentLengthField != nullptr) @@ -209,7 +243,9 @@ PTF_TEST_CASE(TestHttpResponseParsing) std::string lengthAsString = contentLengthField->getFieldValue(); int length = atoi(lengthAsString.c_str()); if (length > 100000) + { bigResponses++; + } } } @@ -276,7 +312,9 @@ PTF_TEST_CASE(TestPrintPacketAndLayers) { index = referenceBufferAsString.find("\r\n", index); if (index == std::string::npos) + { break; + } referenceBufferAsString.replace(index, 2, "\n"); index += 1; } @@ -328,9 +366,13 @@ PTF_TEST_CASE(TestDnsParsing) packetsContainingDnsQuery++; if (dnsLayer->getQuery("aus3.mozilla.org", true) != nullptr) + { queriesWithNameMozillaOrg++; + } if (dnsLayer->getQuery("www.google.com", true) != nullptr) + { queriesWithNameGoogle++; + } bool isTypeA = false; bool isClassIN = false; @@ -339,17 +381,27 @@ PTF_TEST_CASE(TestDnsParsing) query = dnsLayer->getNextQuery(query)) { if (query->getDnsType() == pcpp::DNS_TYPE_A) + { isTypeA = true; + } if (query->getDnsClass() == pcpp::DNS_CLASS_IN || query->getDnsClass() == pcpp::DNS_CLASS_IN_QU) + { isClassIN = true; + } } if (isTypeA) + { queriesWithTypeA++; + } else + { queriesWithTypeNotA++; + } if (isClassIN) + { queriesWithClassIN++; + } } if (dnsLayer->getAnswerCount() > 0) @@ -357,7 +409,9 @@ PTF_TEST_CASE(TestDnsParsing) packetsContainingDnsAnswer++; if (dnsLayer->getAnswer("www.google-analytics.com", true) != nullptr) + { answersWithNameGoogleAnalytics++; + } bool isTypeCNAME = false; bool isTypePTR = false; @@ -367,21 +421,35 @@ PTF_TEST_CASE(TestDnsParsing) answer = dnsLayer->getNextAnswer(answer)) { if (answer->getTTL() < 30) + { isTtlLessThan30 = true; + } if (answer->getDnsType() == pcpp::DNS_TYPE_CNAME) + { isTypeCNAME = true; + } if (answer->getDnsType() == pcpp::DNS_TYPE_PTR) + { isTypePTR = true; + } if (answer->getData()->toString() == "fe80::5a1f:aaff:fe4f:3f9d") + { answersWithDataCertainIPv6++; + } } if (isTypeCNAME) + { answersWithTypeCNAME++; + } if (isTypePTR) + { answersWithTypePTR++; + } if (isTtlLessThan30) + { answersWithTtlLessThan30++; + } } if (dnsLayer->getAuthorityCount() > 0) @@ -389,7 +457,9 @@ PTF_TEST_CASE(TestDnsParsing) packetsContainingDnsAuthority++; if (dnsLayer->getAuthority("Yaels-iPhone.local", true) != nullptr) + { authoritiesWithNameYaelPhone++; + } for (pcpp::DnsResource* auth = dnsLayer->getFirstAuthority(); auth != nullptr; auth = dnsLayer->getNextAuthority(auth)) @@ -407,11 +477,15 @@ PTF_TEST_CASE(TestDnsParsing) packetsContainingDnsAdditional++; if (dnsLayer->getAdditionalRecord("", true) != nullptr) + { additionalWithEmptyName++; + } if (dnsLayer->getAdditionalRecord( "D.9.F.3.F.4.E.F.F.F.A.A.F.1.A.5.0.0.0.0.0.0.0.0.0.0.0.0.0.8.E.F.ip6.arpa", true) != nullptr) + { additionalWithLongUglyName++; + } bool isTypeNSEC = false; @@ -419,11 +493,15 @@ PTF_TEST_CASE(TestDnsParsing) add = dnsLayer->getNextAdditionalRecord(add)) { if (add->getDnsType() == pcpp::DNS_TYPE_NSEC) + { isTypeNSEC = true; + } } if (isTypeNSEC) + { additionalWithTypeNSEC++; + } } } diff --git a/Tests/Pcap++Test/Tests/PfRingTests.cpp b/Tests/Pcap++Test/Tests/PfRingTests.cpp index 85828849e8..61527d7220 100644 --- a/Tests/Pcap++Test/Tests/PfRingTests.cpp +++ b/Tests/Pcap++Test/Tests/PfRingTests.cpp @@ -60,13 +60,21 @@ static void pfRingPacketsArrive(pcpp::RawPacket* packets, uint32_t numOfPackets, { pcpp::Packet packet(&packets[i]); if (packet.isPacketOfType(pcpp::Ethernet)) + { data->EthCount++; + } if (packet.isPacketOfType(pcpp::IPv4)) + { data->IpCount++; + } if (packet.isPacketOfType(pcpp::TCP)) + { data->TcpCount++; + } if (packet.isPacketOfType(pcpp::UDP)) + { data->UdpCount++; + } } } @@ -82,9 +90,13 @@ static void pfRingPacketsArriveMultiThread(pcpp::RawPacket* packets, uint32_t nu { pcpp::Packet packet(&packets[i]); if (packet.isPacketOfType(pcpp::Ethernet)) + { data[threadId].EthCount++; + } if (packet.isPacketOfType(pcpp::IPv4)) + { data[threadId].IpCount++; + } if (packet.isPacketOfType(pcpp::TCP)) { data[threadId].TcpCount++; @@ -95,7 +107,9 @@ static void pfRingPacketsArriveMultiThread(pcpp::RawPacket* packets, uint32_t nu } } if (packet.isPacketOfType(pcpp::UDP)) + { data[threadId].UdpCount++; + } } } @@ -145,7 +159,9 @@ int incSleep(int maxSleepTime, const PfRingPacketData& packetData) std::this_thread::sleep_for(std::chrono::seconds(1)); totalSleepTime += 1; if (packetData.PacketCount > 0) + { break; + } } return totalSleepTime; @@ -164,14 +180,20 @@ int incSleepMultiThread(int maxSleepTime, PfRingPacketData packetData[], int tot for (int i = 0; i < totalNumOfCores; i++) { if ((pcpp::SystemCores::IdToSystemCore[i].Mask & coreMask) == 0) + { continue; + } if (packetData[i].PacketCount > 0) + { coresWithPacketCountNotZero++; + } } if (coresWithPacketCountNotZero >= numOfCoresInUse) + { break; + } } return totalSleepTime; @@ -185,7 +207,9 @@ int incSleepSetFilter(int maxSleepTime, const SetFilterInstruction& packetData) std::this_thread::sleep_for(std::chrono::seconds(1)); totalSleepTime += 1; if (packetData.PacketCount > 0) + { break; + } } return totalSleepTime; @@ -310,10 +334,14 @@ PTF_TEST_CASE(TestPfRingDeviceMultiThread) for (int i = 0; i < totalnumOfCores; ++i) { if (!tempCoreMask) + { break; + } if (tempCoreMask & 1) + { ++numOfCoresInUse; + } tempCoreMask = tempCoreMask >> 1; } @@ -333,7 +361,9 @@ PTF_TEST_CASE(TestPfRingDeviceMultiThread) for (int i = 0; i < totalnumOfCores; i++) { if ((pcpp::SystemCores::IdToSystemCore[i].Mask & TestPfRingMultiThreadCoreMask) == 0) + { continue; + } dev->getThreadStatistics(pcpp::SystemCores::IdToSystemCore[i], stats); aggrStats.recv += stats.recv; @@ -414,7 +444,9 @@ PTF_TEST_CASE(TestPfRingMultiThreadSomeCores) for (int i = 0; i < numOfCores; i++) { if (i % 2 != 0) + { continue; + } cores << i << ","; coreMask |= pcpp::SystemCores::IdToSystemCore[i].Mask; diff --git a/Tests/Pcap++Test/Tests/TcpReassemblyTests.cpp b/Tests/Pcap++Test/Tests/TcpReassemblyTests.cpp index 2fefcb5897..72f5e90c92 100644 --- a/Tests/Pcap++Test/Tests/TcpReassemblyTests.cpp +++ b/Tests/Pcap++Test/Tests/TcpReassemblyTests.cpp @@ -94,11 +94,15 @@ static size_t getPayloadLen(pcpp::RawPacket& rawPacket) pcpp::TcpLayer* tcpLayer = packet.getLayerOfType(); if (tcpLayer == nullptr) + { throw std::runtime_error("TCP Layer not found"); + } pcpp::IPv4Layer* ipLayer = packet.getLayerOfType(); if (ipLayer == nullptr) + { throw std::runtime_error("IPv4 Layer not found"); + } return be16toh(ipLayer->getIPv4Header()->totalLength) - ipLayer->getHeaderLen() - tcpLayer->getHeaderLen(); } @@ -186,7 +190,9 @@ static void tcpReassemblyConnectionStartCallback(const pcpp::ConnectionData& con TcpReassemblyMultipleConnStats::FlowKeysList& flowKeys = ((TcpReassemblyMultipleConnStats*)userCookie)->flowKeysList; if (std::find(flowKeys.begin(), flowKeys.end(), connectionData.flowKey) == flowKeys.end()) + { flowKeys.push_back(connectionData.flowKey); + } iter->second.connectionsStarted = true; iter->second.connData = connectionData; @@ -211,12 +217,18 @@ static void tcpReassemblyConnectionEndCallback(const pcpp::ConnectionData& conne TcpReassemblyMultipleConnStats::FlowKeysList& flowKeys = ((TcpReassemblyMultipleConnStats*)userCookie)->flowKeysList; if (std::find(flowKeys.begin(), flowKeys.end(), connectionData.flowKey) == flowKeys.end()) + { flowKeys.push_back(connectionData.flowKey); + } if (reason == pcpp::TcpReassembly::TcpReassemblyConnectionClosedManually) + { iter->second.connectionsEndedManually = true; + } else + { iter->second.connectionsEnded = true; + } iter->second.connData = connectionData; } @@ -230,11 +242,15 @@ static bool tcpReassemblyTest(const std::vector& packetStream, pcpp::TcpReassembly* tcpReassembly = nullptr; if (monitorOpenCloseConns) + { tcpReassembly = new pcpp::TcpReassembly(tcpReassemblyMsgReadyCallback, &results, tcpReassemblyConnectionStartCallback, tcpReassemblyConnectionEndCallback); + } else + { tcpReassembly = new pcpp::TcpReassembly(tcpReassemblyMsgReadyCallback, &results); + } for (auto iter : packetStream) { @@ -257,7 +273,9 @@ static bool tcpReassemblyTest(const std::vector& packetStream, // } if (closeConnsManually) + { tcpReassembly->closeAllConnections(); + } delete tcpReassembly; @@ -298,17 +316,23 @@ static pcpp::RawPacket tcpReassemblyAddRetransmissions(pcpp::RawPacket rawPacket pcpp::TcpLayer* tcpLayer = packet.getLayerOfType(); if (tcpLayer == nullptr) + { throw std::runtime_error("TCP Layer not found"); + } pcpp::IPv4Layer* ipLayer = packet.getLayerOfType(); if (ipLayer == nullptr) + { throw std::runtime_error("IPv4 Layer not found"); + } int tcpPayloadSize = be16toh(ipLayer->getIPv4Header()->totalLength) - ipLayer->getHeaderLen() - tcpLayer->getHeaderLen(); if (numOfBytes <= 0) + { numOfBytes = tcpPayloadSize - beginning; + } uint8_t* newPayload = new uint8_t[numOfBytes]; @@ -328,7 +352,9 @@ static pcpp::RawPacket tcpReassemblyAddRetransmissions(pcpp::RawPacket rawPacket pcpp::Layer* layerToRemove = tcpLayer->getNextLayer(); if (layerToRemove != nullptr) + { packet.removeLayer(layerToRemove->getProtocol()); + } tcpLayer->getTcpHeader()->sequenceNumber = htobe32(be32toh(tcpLayer->getTcpHeader()->sequenceNumber) + beginning); diff --git a/Tests/Pcap++Test/main.cpp b/Tests/Pcap++Test/main.cpp index 25ee1eba7b..8dfe0a95b1 100644 --- a/Tests/Pcap++Test/main.cpp +++ b/Tests/Pcap++Test/main.cpp @@ -123,7 +123,9 @@ int main(int argc, char* argv[]) if (!runWithNetworking) { if (userTagsInclude != "") + { userTagsInclude += ";"; + } userTagsInclude += "no_network"; std::cout << "Running only tests that don't require network connection" << std::endl; @@ -151,7 +153,9 @@ int main(int argc, char* argv[]) if (skipMemLeakCheck) { if (configTags != "") + { configTags += ";"; + } configTags += "skip_mem_leak_check"; std::cout << "Skipping memory leak check for all test cases" << std::endl; @@ -160,7 +164,9 @@ int main(int argc, char* argv[]) if (memVerbose) { if (configTags != "") + { configTags += ";"; + } configTags += "mem_leak_check_verbose"; std::cout << "Turning on verbose information on memory allocations" << std::endl; @@ -191,9 +197,13 @@ int main(int argc, char* argv[]) { std::cout << "Using DPDK port: " << PcapTestGlobalArgs.dpdkPort << std::endl; if (PcapTestGlobalArgs.kniIp == "") + { std::cout << "DPDK KNI tests: skipped" << std::endl; + } else + { std::cout << "Using IP address for KNI: " << PcapTestGlobalArgs.kniIp << std::endl; + } } #endif