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
// 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////////////////////////////////////////