Skip to content

Commit 3b57224

Browse files
authored
Fix crash with parseuntil when top layer is more than the chosen parseuntil OSI layer. (#1580)
* Fix crash with parseuntil when top layer is more than the chosen parseuntil OSI layer. * fix format
1 parent 1debe6b commit 3b57224

File tree

4 files changed

+27
-3
lines changed

4 files changed

+27
-3
lines changed

Packet++/src/Packet.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,17 @@ namespace pcpp
8484

8585
if (curLayer != nullptr && curLayer->getOsiModelLayer() > parseUntilLayer)
8686
{
87-
m_LastLayer = curLayer->getPrevLayer();
88-
delete curLayer;
89-
m_LastLayer->m_NextLayer = nullptr;
87+
// don't delete the first layer. If already past the target layer, treat the same as if the layer was found.
88+
if (curLayer == m_FirstLayer)
89+
{
90+
curLayer->m_IsAllocatedInPacket = true;
91+
}
92+
else
93+
{
94+
m_LastLayer = curLayer->getPrevLayer();
95+
delete curLayer;
96+
m_LastLayer->m_NextLayer = nullptr;
97+
}
9098
}
9199

92100
if (m_LastLayer != nullptr && parseUntil == UnknownProtocol && parseUntilLayer == OsiModelLayerUnknown)

Tests/Packet++Test/TestDefinition.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ PTF_TEST_CASE(PacketTrailerTest);
5858
PTF_TEST_CASE(ResizeLayerTest);
5959
PTF_TEST_CASE(PrintPacketAndLayersTest);
6060
PTF_TEST_CASE(ProtocolFamilyMembershipTest);
61+
PTF_TEST_CASE(PacketParseLayerLimitTest);
6162

6263
// Implemented in HttpTests.cpp
6364
PTF_TEST_CASE(HttpRequestParseMethodTest);

Tests/Packet++Test/Tests/PacketTests.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,3 +1068,17 @@ PTF_TEST_CASE(ProtocolFamilyMembershipTest)
10681068
PTF_ASSERT_FALSE(httpLayer->isMemberOfProtocolFamily(pcpp::HTTPResponse));
10691069
PTF_ASSERT_FALSE(httpLayer->isMemberOfProtocolFamily(pcpp::IP));
10701070
}
1071+
1072+
PTF_TEST_CASE(PacketParseLayerLimitTest)
1073+
{
1074+
timeval time;
1075+
gettimeofday(&time, nullptr);
1076+
1077+
READ_FILE_AND_CREATE_PACKET(0, "PacketExamples/TcpPacketWithOptions3.dat");
1078+
pcpp::Packet packet0(&rawPacket0, pcpp::OsiModelPhysicalLayer);
1079+
PTF_ASSERT_EQUAL(packet0.getLastLayer(), packet0.getFirstLayer());
1080+
1081+
READ_FILE_AND_CREATE_PACKET(1, "PacketExamples/TcpPacketWithOptions3.dat");
1082+
pcpp::Packet packet1(&rawPacket1, pcpp::OsiModelTransportLayer);
1083+
PTF_ASSERT_EQUAL(packet1.getLastLayer()->getOsiModelLayer(), pcpp::OsiModelTransportLayer);
1084+
}

Tests/Packet++Test/main.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ int main(int argc, char* argv[])
161161
PTF_RUN_TEST(ResizeLayerTest, "packet;resize");
162162
PTF_RUN_TEST(PrintPacketAndLayersTest, "packet;print");
163163
PTF_RUN_TEST(ProtocolFamilyMembershipTest, "packet");
164+
PTF_RUN_TEST(PacketParseLayerLimitTest, "packet");
164165

165166
PTF_RUN_TEST(HttpRequestParseMethodTest, "http");
166167
PTF_RUN_TEST(HttpRequestLayerParsingTest, "http");

0 commit comments

Comments
 (0)