diff -r a1e00acc5986 src/internet-stack/icmpv6-header.cc --- a/src/internet-stack/icmpv6-header.cc Thu May 27 08:34:16 2010 +0200 +++ b/src/internet-stack/icmpv6-header.cc Fri May 28 15:12:33 2010 +1000 @@ -983,10 +983,12 @@ void Icmpv6DestinationUnreachable::Serialize (Buffer::Iterator start) const { - const uint8_t *packet = m_packet->PeekData (); + uint8_t *packet = new uint8_t[m_packet->GetSize ()]; uint16_t checksum = 0; Buffer::Iterator i = start; + m_packet->CopyData (packet, m_packet->GetSize ()); + i.WriteU8 (GetType ()); i.WriteU8 (GetCode ()); i.WriteHtonU16 (0); @@ -1000,6 +1002,8 @@ i = start; i.Next (2); i.WriteU16 (checksum); + + delete[] packet; } uint32_t Icmpv6DestinationUnreachable::Deserialize (Buffer::Iterator start) @@ -1078,10 +1082,12 @@ void Icmpv6TooBig::Serialize (Buffer::Iterator start) const { - const uint8_t *packet = m_packet->PeekData (); + uint8_t *packet = new uint8_t[m_packet->GetSize ()]; uint16_t checksum = 0; Buffer::Iterator i = start; + m_packet->CopyData (packet, m_packet->GetSize ()); + i.WriteU8 (GetType ()); i.WriteU8 (GetCode ()); i.WriteHtonU16 (0); @@ -1095,6 +1101,8 @@ i = start; i.Next (2); i.WriteU16 (checksum); + + delete[] packet; } uint32_t Icmpv6TooBig::Deserialize (Buffer::Iterator start) @@ -1162,10 +1170,12 @@ void Icmpv6TimeExceeded::Serialize (Buffer::Iterator start) const { - const uint8_t *packet = m_packet->PeekData (); + uint8_t *packet = new uint8_t[m_packet->GetSize ()]; uint16_t checksum = 0; Buffer::Iterator i = start; + m_packet->CopyData (packet, m_packet->GetSize ()); + i.WriteU8 (GetType ()); i.WriteU8 (GetCode ()); i.WriteHtonU16 (0); @@ -1179,6 +1189,8 @@ i = start; i.Next (2); i.WriteU16 (checksum); + + delete[] packet; } uint32_t Icmpv6TimeExceeded::Deserialize (Buffer::Iterator start) @@ -1257,10 +1269,12 @@ void Icmpv6ParameterError::Serialize (Buffer::Iterator start) const { - const uint8_t *packet = m_packet->PeekData (); + uint8_t *packet = new uint8_t[m_packet->GetSize ()]; uint16_t checksum = 0; Buffer::Iterator i = start; + m_packet->CopyData (packet, m_packet->GetSize ()); + i.WriteU8 (GetType ()); i.WriteU8 (GetCode ()); i.WriteHtonU16 (0); @@ -1274,6 +1288,8 @@ i = start; i.Next (2); i.WriteU16 (checksum); + + delete[] packet; } uint32_t Icmpv6ParameterError::Deserialize (Buffer::Iterator start) @@ -1749,7 +1765,11 @@ i.WriteU16 (0); i.WriteU32 (0); - i.Write (m_packet->PeekData (), m_packet->GetSize ()); + uint32_t size = m_packet->GetSize (); + uint8_t *packet = new uint8_t[size]; + m_packet->CopyData (packet, size); + i.Write (packet, size); + delete[] packet; } uint32_t Icmpv6OptionRedirected::Deserialize (Buffer::Iterator start) diff -r a1e00acc5986 src/internet-stack/ipv6-extension.cc --- a/src/internet-stack/ipv6-extension.cc Thu May 27 08:34:16 2010 +0200 +++ b/src/internet-stack/ipv6-extension.cc Fri May 28 15:12:33 2010 +1000 @@ -97,10 +97,12 @@ Ptr ipv6Option; uint8_t processedSize = 0; - const uint8_t *data = p->PeekData (); + uint8_t *data = new uint8_t[p->GetSize ()]; uint8_t optionType = 0; uint8_t optionLength = 0; + p->CopyData (data, p->GetSize ()); + while (length > processedSize && !isDropped) { optionType = *(data + processedSize); @@ -161,6 +163,8 @@ p->RemoveAtStart (optionLength); } + delete[] data; + return processedSize; } @@ -377,10 +381,12 @@ uint8_t nextHeader = ipv6Header.GetNextHeader (); uint8_t ipv6HeaderSize = ipv6Header.GetSerializedSize (); + uint8_t firstOctet = 0x0; + p->CopyData (&firstOctet, 1); bool moreHeader = true; if (!(nextHeader == Ipv6Header::IPV6_EXT_HOP_BY_HOP || nextHeader == Ipv6Header::IPV6_EXT_ROUTING - || (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION && *p->PeekData () == Ipv6Header::IPV6_EXT_ROUTING))) + || (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION && firstOctet == Ipv6Header::IPV6_EXT_ROUTING))) { moreHeader = false; ipv6Header.SetNextHeader (Ipv6Header::IPV6_EXT_FRAGMENTATION); @@ -403,8 +409,12 @@ nextHeader = hopbyhopHeader->GetNextHeader (); extensionHeaderLength = hopbyhopHeader->GetLength (); + // XXX: could the value of *p->PeekData() have changed since the last CopyData()? + // I'm doing another CopyData just in case. + p->CopyData (&firstOctet, 1); + if (!(nextHeader == Ipv6Header::IPV6_EXT_HOP_BY_HOP || nextHeader == Ipv6Header::IPV6_EXT_ROUTING - || (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION && *p->PeekData () == Ipv6Header::IPV6_EXT_ROUTING))) + || (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION && firstOctet == Ipv6Header::IPV6_EXT_ROUTING))) { moreHeader = false; hopbyhopHeader->SetNextHeader (Ipv6Header::IPV6_EXT_FRAGMENTATION); @@ -415,7 +425,14 @@ } else if (nextHeader == Ipv6Header::IPV6_EXT_ROUTING) { - uint8_t numberAddress = (*(p->PeekData () + 1)) / 2; +/// uint8_t numberAddress = (*(p->PeekData () + 1)) / 2; + uint8_t numberAddress = 0; + { + uint8_t firstTwo[2]; + p->CopyData (firstTwo, 2); + numberAddress = firstTwo[1] / 2; + } + Ipv6ExtensionLooseRoutingHeader *routingHeader = new Ipv6ExtensionLooseRoutingHeader (); routingHeader->SetNumberAddress (numberAddress); p->RemoveHeader (*routingHeader); @@ -423,8 +440,12 @@ nextHeader = routingHeader->GetNextHeader (); extensionHeaderLength = routingHeader->GetLength (); + // XXX: could the value of *p->PeekData() have changed since the first CopyData()? + // I'm doing another CopyData just in case. + p->CopyData (&firstOctet, 1); + if (!(nextHeader == Ipv6Header::IPV6_EXT_HOP_BY_HOP || nextHeader == Ipv6Header::IPV6_EXT_ROUTING - || (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION && *p->PeekData () == Ipv6Header::IPV6_EXT_ROUTING))) + || (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION && firstOctet == Ipv6Header::IPV6_EXT_ROUTING))) { moreHeader = false; routingHeader->SetNextHeader (Ipv6Header::IPV6_EXT_FRAGMENTATION); @@ -441,8 +462,12 @@ nextHeader = destinationHeader->GetNextHeader (); extensionHeaderLength = destinationHeader->GetLength (); + // XXX: could the value of *p->PeekData() have changed since the first CopyData()? + // I'm doing another CopyData just in case. + p->CopyData (&firstOctet, 1); + if (!(nextHeader == Ipv6Header::IPV6_EXT_HOP_BY_HOP || nextHeader == Ipv6Header::IPV6_EXT_ROUTING - || (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION && *p->PeekData () == Ipv6Header::IPV6_EXT_ROUTING))) + || (nextHeader == Ipv6Header::IPV6_EXT_DESTINATION && firstOctet == Ipv6Header::IPV6_EXT_ROUTING))) { moreHeader = false; destinationHeader->SetNextHeader (Ipv6Header::IPV6_EXT_FRAGMENTATION); @@ -637,7 +662,8 @@ Ptr p = packet->Copy (); p->RemoveAtStart (offset); - const uint8_t *buff = packet->PeekData (); + uint8_t *buff = new uint8_t[packet->GetSize ()]; + packet->CopyData (buff, packet->GetSize ()); uint8_t routingNextHeader = *buff; uint8_t routingLength = *(buff + 1); @@ -669,10 +695,14 @@ isDropped = true; } + delete[] buff; return routingLength; } - return ipv6ExtensionRouting->Process (packet, offset, ipv6Header, dst, (uint8_t *)0, isDropped); + uint8_t res = ipv6ExtensionRouting->Process (packet, offset, ipv6Header, dst, (uint8_t *)0, isDropped); + delete[] buff; + + return res; } @@ -786,7 +816,14 @@ ipv6header.Deserialize (it); // Get the number of routers' address field - uint8_t numberAddress = (*(p->PeekData () + 1)) / 2; +/// uint8_t numberAddress = (*(p->PeekData () + 1)) / 2; + uint8_t numberAddress = 0; + { + uint8_t firstTwo[2]; + p->CopyData (firstTwo, 2); + numberAddress = firstTwo[1] / 2; + } + Ipv6ExtensionLooseRoutingHeader routingHeader; routingHeader.SetNumberAddress (numberAddress); p->RemoveHeader (routingHeader); diff -r a1e00acc5986 src/internet-stack/ipv6-l3-protocol.cc --- a/src/internet-stack/ipv6-l3-protocol.cc Thu May 27 08:34:16 2010 +0200 +++ b/src/internet-stack/ipv6-l3-protocol.cc Fri May 28 15:12:33 2010 +1000 @@ -954,10 +954,12 @@ /* process hop-by-hop extension first if exists */ if (nextHeader == Ipv6Header::IPV6_EXT_HOP_BY_HOP) { - const uint8_t *buff = p->PeekData (); + uint8_t *buff = new uint8_t[p->GetSize ()]; + p->CopyData (buff, p->GetSize ()); nextHeader = *buff; nextHeaderPosition = *(buff + 1); + delete[] buff; } /* process all the extensions found and the layer 4 protocol */ diff -r a1e00acc5986 src/internet-stack/ipv6-raw-socket-impl.cc --- a/src/internet-stack/ipv6-raw-socket-impl.cc Thu May 27 08:34:16 2010 +0200 +++ b/src/internet-stack/ipv6-raw-socket-impl.cc Fri May 28 15:12:33 2010 +1000 @@ -222,7 +222,9 @@ /* calculate checksum here for ICMPv6 echo request (sent by ping6) * as we cannot determine source IPv6 address at application level */ - if (*p->PeekData () == Icmpv6Header::ICMPV6_ECHO_REQUEST) + uint8_t firstOctet = 0x0; + p->CopyData (&firstOctet, 1); + if (firstOctet == Icmpv6Header::ICMPV6_ECHO_REQUEST) { Icmpv6Echo hdr (1); p->RemoveHeader (hdr);