diff --git a/Pcap++/src/DpdkDevice.cpp b/Pcap++/src/DpdkDevice.cpp index 005f7ac749..46053be32f 100644 --- a/Pcap++/src/DpdkDevice.cpp +++ b/Pcap++/src/DpdkDevice.cpp @@ -19,6 +19,7 @@ #include "rte_malloc.h" #include "rte_cycles.h" #include +#include #include #include #include @@ -1169,26 +1170,28 @@ namespace pcpp for (size_t i = 0; i < arrLength; i++) { - MBufRawPacket* rawPacket = nullptr; + MBufRawPacket* mBufRawPacket = nullptr; uint8_t rawPacketType = packetsArr[i]->getRawPacketReadOnly()->getObjectType(); if (rawPacketType != MBUFRAWPACKET_OBJECT_TYPE) { - rawPacket = new MBufRawPacket(); - if (unlikely(!rawPacket->initFromRawPacket(packetsArr[i]->getRawPacketReadOnly(), this))) + auto mBufRawPacketTemp = std::make_unique(); + if (unlikely(!mBufRawPacketTemp->initFromRawPacket(packetsArr[i]->getRawPacketReadOnly(), this))) { - delete rawPacket; return 0; } - mBufVec.pushBack(rawPacket); + // Set the packet pointer to the newly created MBufRawPacket and add it register it to lifetime + // management + mBufRawPacket = mBufRawPacketTemp.get(); + mBufVec.pushBack(std::move(mBufRawPacketTemp)); } else { - rawPacket = (MBufRawPacket*)packetsArr[i]->getRawPacketReadOnly(); + mBufRawPacket = static_cast(packetsArr[i]->getRawPacket()); } - mBufArr[i] = rawPacket->getMBuf(); - mBufRawPacketArr[i] = rawPacket; + mBufArr[i] = mBufRawPacket->getMBuf(); + mBufRawPacketArr[i] = mBufRawPacket; } uint16_t packetsSent = @@ -1209,28 +1212,31 @@ namespace pcpp MBufRawPacketVector mBufVec; int mBufIndex = 0; - for (RawPacketVector::ConstVectorIterator iter = rawPacketsVec.begin(); iter != rawPacketsVec.end(); iter++) + for (auto* rawPacket : rawPacketsVec) { - MBufRawPacket* rawPacket = nullptr; - uint8_t rawPacketType = (*iter)->getObjectType(); + MBufRawPacket* mBufRawPacket = nullptr; + uint8_t rawPacketType = rawPacket->getObjectType(); if (rawPacketType != MBUFRAWPACKET_OBJECT_TYPE) { - rawPacket = new MBufRawPacket(); - if (unlikely(!rawPacket->initFromRawPacket(*iter, this))) + // Copy the raw packet into a MBufRawPacket + auto mbufRawPacketTemp = std::make_unique(); + if (unlikely(!mbufRawPacketTemp->initFromRawPacket(rawPacket, this))) { - delete rawPacket; return 0; } - mBufVec.pushBack(rawPacket); + // Set the packet pointer to the newly created MBufRawPacket and add it to lifetime management + mBufRawPacket = mbufRawPacketTemp.get(); + mBufVec.pushBack(std::move(mbufRawPacketTemp)); } else { - rawPacket = (MBufRawPacket*)(*iter); + // If the raw packet is already a MBufRawPacket, use it directly + mBufRawPacket = static_cast(rawPacket); } - mBufRawPacketArr[mBufIndex] = rawPacket; - mBufArr[mBufIndex++] = rawPacket->getMBuf(); + mBufRawPacketArr[mBufIndex] = mBufRawPacket; + mBufArr[mBufIndex++] = mBufRawPacket->getMBuf(); } uint16_t packetsSent = diff --git a/Pcap++/src/KniDevice.cpp b/Pcap++/src/KniDevice.cpp index 5dc3e6ee8a..24f430d9b6 100644 --- a/Pcap++/src/KniDevice.cpp +++ b/Pcap++/src/KniDevice.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -727,31 +728,30 @@ namespace pcpp } struct rte_mbuf* mbuf; + std::unique_ptr mbufRawPacketTemp; MBufRawPacket* mbufRawPacket = nullptr; bool sent = false; - bool wasAllocated = false; if (rawPacket.getObjectType() != MBUFRAWPACKET_OBJECT_TYPE) { - mbufRawPacket = new MBufRawPacket(); - if (unlikely(!mbufRawPacket->initFromRawPacket(&rawPacket, this))) + mbufRawPacketTemp = std::make_unique(); + if (unlikely(!mbufRawPacketTemp->initFromRawPacket(&rawPacket, this))) { - delete mbufRawPacket; return sent; } - mbuf = mbufRawPacket->getMBuf(); - wasAllocated = true; + + // Sets the mbuf pointer from the temporary object + mbufRawPacket = mbufRawPacketTemp.get(); } else { - mbufRawPacket = (MBufRawPacket*)(&rawPacket); - mbuf = mbufRawPacket->getMBuf(); + // Casts the raw packet to MBufRawPacket + mbufRawPacket = static_cast(&rawPacket); } + mbuf = mbufRawPacket->getMBuf(); sent = rte_kni_tx_burst(m_Device, &mbuf, 1); mbufRawPacket->setFreeMbuf(!sent); - if (wasAllocated) - delete mbufRawPacket; return sent; }