@@ -605,6 +605,12 @@ namespace pcpp
605
605
bool passedExtendedLayer = false ;
606
606
for (Layer* curLayer = m_FirstLayer; curLayer != nullptr ; curLayer = curLayer->getNextLayer ())
607
607
{
608
+ if (dataPtr > m_RawPacket->getRawData () + m_RawPacket->getRawDataLen ())
609
+ {
610
+ PCPP_LOG_ERROR (" Layer data pointer exceeds packet's boundary" );
611
+ return false ;
612
+ }
613
+
608
614
// set the data ptr
609
615
curLayer->m_Data = const_cast <uint8_t *>(dataPtr);
610
616
@@ -656,23 +662,30 @@ namespace pcpp
656
662
bool passedExtendedLayer = false ;
657
663
while (curLayer != nullptr )
658
664
{
665
+ if (dataPtr > m_RawPacket->getRawData () + m_RawPacket->getRawDataLen ())
666
+ {
667
+ PCPP_LOG_ERROR (" Layer data pointer exceeds packet's boundary" );
668
+ return false ;
669
+ }
670
+
659
671
// set the data ptr
660
672
curLayer->m_Data = const_cast <uint8_t *>(dataPtr);
661
673
662
674
// set a flag if arrived to the layer being shortened
663
675
if (curLayer->getPrevLayer () == layer)
664
676
passedExtendedLayer = true ;
665
677
678
+ size_t headerLen = curLayer->getHeaderLen ();
679
+
666
680
// change the data length only for layers who come before the shortened layer. For layers who come after,
667
681
// data length isn't changed
668
682
if (!passedExtendedLayer)
669
683
curLayer->m_DataLen -= numOfBytesToShorten;
670
684
671
685
// assuming header length of the layer that requested to be extended hasn't been enlarged yet
672
- size_t headerLen = curLayer->getHeaderLen () - (curLayer == layer ? numOfBytesToShorten : 0 );
686
+ // size_t headerLen = curLayer->getHeaderLen() - (curLayer == layer ? numOfBytesToShorten : 0);
687
+ headerLen -= (curLayer == layer ? numOfBytesToShorten : 0 );
673
688
dataPtr += headerLen;
674
- if (dataPtr > m_RawPacket->getRawData () + m_RawPacket->getRawDataLen ())
675
- break ;
676
689
curLayer = curLayer->getNextLayer ();
677
690
}
678
691
0 commit comments