From 787430613efcdf499330ca89d7d7ece0ccb6311f Mon Sep 17 00:00:00 2001 From: Tommaso Pecorella Date: Wed, 28 Sep 2016 02:13:32 +0200 Subject: [PATCH] network: (workaround for #2505) Printing a packet can raise an assert --- src/internet/model/icmpv4.cc | 16 +++++++++------- src/internet/model/icmpv6-header.cc | 8 ++++---- src/internet/model/rip-header.cc | 2 +- src/internet/model/ripng-header.cc | 2 +- src/network/model/buffer.cc | 7 +++++++ src/network/model/buffer.h | 5 +++++ 6 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/internet/model/icmpv4.cc b/src/internet/model/icmpv4.cc index 565723975..9e8e1eeaa 100644 --- a/src/internet/model/icmpv4.cc +++ b/src/internet/model/icmpv4.cc @@ -247,24 +247,26 @@ uint32_t Icmpv4Echo::Deserialize (Buffer::Iterator start) { NS_LOG_FUNCTION (this << &start); + + uint32_t optionalPayloadSize = start.GetRemainingSize () -4; + NS_ASSERT (start.GetRemainingSize () >= 4); + m_identifier = start.ReadNtohU16 (); m_sequence = start.ReadNtohU16 (); - NS_ASSERT (start.GetSize () >= 4); - uint32_t size = start.GetSize () - 4; - if (size != m_dataSize) + if (optionalPayloadSize != m_dataSize) { delete [] m_data; - m_data = new uint8_t[size]; - m_dataSize = size; + m_dataSize = optionalPayloadSize; + m_data = new uint8_t[m_dataSize]; } start.Read (m_data, m_dataSize); - return m_dataSize; + return m_dataSize+4; } void Icmpv4Echo::Print (std::ostream &os) const { NS_LOG_FUNCTION (this << &os); - os << "identifier=" << m_identifier << ", sequence=" << m_sequence; + os << "identifier=" << m_identifier << ", sequence=" << m_sequence << ", data size=" << m_dataSize; } diff --git a/src/internet/model/icmpv6-header.cc b/src/internet/model/icmpv6-header.cc index ba7ad7f74..84e2d8d4f 100644 --- a/src/internet/model/icmpv6-header.cc +++ b/src/internet/model/icmpv6-header.cc @@ -1123,7 +1123,7 @@ void Icmpv6DestinationUnreachable::Serialize (Buffer::Iterator start) const uint32_t Icmpv6DestinationUnreachable::Deserialize (Buffer::Iterator start) { NS_LOG_FUNCTION (this << &start); - uint16_t length = start.GetSize () - 8; + uint16_t length = start.GetRemainingSize () - 8; uint8_t* data = new uint8_t[length]; Buffer::Iterator i = start; @@ -1234,7 +1234,7 @@ void Icmpv6TooBig::Serialize (Buffer::Iterator start) const uint32_t Icmpv6TooBig::Deserialize (Buffer::Iterator start) { NS_LOG_FUNCTION (this << &start); - uint16_t length = start.GetSize () - 8; + uint16_t length = start.GetRemainingSize () - 8; uint8_t* data = new uint8_t[length]; Buffer::Iterator i = start; @@ -1334,7 +1334,7 @@ uint32_t Icmpv6TimeExceeded::Deserialize (Buffer::Iterator start) { NS_LOG_FUNCTION (this << &start); - uint16_t length = start.GetSize () - 8; + uint16_t length = start.GetRemainingSize () - 8; uint8_t* data = new uint8_t[length]; Buffer::Iterator i = start; @@ -1445,7 +1445,7 @@ void Icmpv6ParameterError::Serialize (Buffer::Iterator start) const uint32_t Icmpv6ParameterError::Deserialize (Buffer::Iterator start) { NS_LOG_FUNCTION (this << &start); - uint16_t length = start.GetSize () - 8; + uint16_t length = start.GetRemainingSize () - 8; uint8_t* data = new uint8_t[length]; Buffer::Iterator i = start; diff --git a/src/internet/model/rip-header.cc b/src/internet/model/rip-header.cc index 5631f0b68..763029717 100644 --- a/src/internet/model/rip-header.cc +++ b/src/internet/model/rip-header.cc @@ -225,7 +225,7 @@ uint32_t RipHeader::Deserialize (Buffer::Iterator start) uint16_t temp16 = i.ReadU16 (); NS_ASSERT_MSG (temp16 == 0, "RIP received a message with invalid filled flags, aborting."); - uint8_t rteNumber = (i.GetSize () - 4)/20; + uint8_t rteNumber = i.GetRemainingSize ()/20; for (uint8_t n=0; n