From 021cde5b233250ba9651486da2f12ea19560cc88 Mon Sep 17 00:00:00 2001
From: g0dil <g0dil@wiback.org>
Date: Tue, 25 Mar 2008 15:40:12 +0000
Subject: [PATCH] Packets: Fix PacketTypeMixin::nextPacketRange size check

---
 Packets/PacketType.ct | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/Packets/PacketType.ct b/Packets/PacketType.ct
index bdd2e88f5..8e5d4a6d9 100644
--- a/Packets/PacketType.ct
+++ b/Packets/PacketType.ct
@@ -37,15 +37,17 @@ template <class Self>
 prefix_ senf::PacketInterpreterBase::optional_range
 senf::PacketTypeMixin<Self,void>::nextPacketRange(Packet p)
 {
-    if (p.data().size() < Self::initSize())
-        return PacketTypeBase::no_range();
     typename Self::size_type sz (Self::initHeadSize());
     ///\idea This if condition could be replaced with a compile time switch by checking, wether
     /// (the function address) Self::initHeadSize is different from PacketTypeBase::initHeadSize
-    if (sz == PacketTypeBase::size_type(-1))
-        return PacketTypeBase::range(boost::next(p.data().begin(),
-                                                 bytes(p.as< ConcretePacket<Self> >().parser())),
-                                     p.data().end());
+    if (sz == PacketTypeBase::size_type(-1)) {
+        typename Self::size_type headsz (bytes(p.as< ConcretePacket<Self> >().parser()));
+        return p.data().size() < headsz ? 
+            PacketTypeBase::no_range() : 
+            PacketInterpreterBase::optional_range(
+                PacketTypeBase::range(boost::next(p.data().begin(), headsz),
+                                      p.data().end()));
+    }
     else
         // If we have a trailer, we do *not* use the 'bytes' value but initSize/initHeadSize, this
         // is much safer since the bytes() value will probably not be very correct anyways (what
@@ -53,8 +55,11 @@ senf::PacketTypeMixin<Self,void>::nextPacketRange(Packet p)
         // or the size of the packet from header to trailer including payload?).
         //
         // So, the helper only works with fixed-size parsers if the packet has a trailer.
-        return PacketTypeBase::range(boost::next(p.data().begin(),sz),
-                                     boost::prior(p.data().end(),Self::initSize()-sz));
+        return p.data().size() < Self::initSize() ?
+            PacketTypeBase::no_range() : 
+            PacketInterpreterBase::optional_range(
+                PacketTypeBase::range(boost::next(p.data().begin(),sz),
+                                      boost::prior(p.data().end(),Self::initSize()-sz)));
 }
 
 ///////////////////////////////ct.e////////////////////////////////////////
-- 
GitLab