From: g0dil Date: Tue, 25 Mar 2008 15:40:12 +0000 (+0000) Subject: Packets: Fix PacketTypeMixin::nextPacketRange size check X-Git-Url: http://g0dil.de/git?a=commitdiff_plain;h=63f71e1d977cc48b2b62bf77612457e9add6b55f;hp=c0b5c560da72983939b286632ac481e076649ddb;p=senf.git Packets: Fix PacketTypeMixin::nextPacketRange size check git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@763 270642c3-0616-0410-b53a-bc976706d245 --- diff --git a/Packets/PacketType.ct b/Packets/PacketType.ct index bdd2e88..8e5d4a6 100644 --- a/Packets/PacketType.ct +++ b/Packets/PacketType.ct @@ -37,15 +37,17 @@ template prefix_ senf::PacketInterpreterBase::optional_range senf::PacketTypeMixin::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 >().parser())), - p.data().end()); + if (sz == PacketTypeBase::size_type(-1)) { + typename Self::size_type headsz (bytes(p.as< ConcretePacket >().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::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////////////////////////////////////////