Packets: Fix PacketTypeMixin::nextPacketRange size check
g0dil [Tue, 25 Mar 2008 15:40:12 +0000 (15:40 +0000)]
git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@763 270642c3-0616-0410-b53a-bc976706d245

Packets/PacketType.ct

index bdd2e88..8e5d4a6 100644 (file)
@@ -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////////////////////////////////////////