From cf212e904c99c3b46cb8b26a18153775facc19f2 Mon Sep 17 00:00:00 2001 From: tho <tho@wiback.org> Date: Mon, 13 Jul 2009 14:37:38 +0000 Subject: [PATCH] Packets/80221Bundle: one more fix for DynamicTLVLengthParser Packets/VectorParser: set length field before adding new values to the vector --- Packets/80221Bundle/MIHPacket.cc | 4 ++-- Packets/80221Bundle/TLVPacket.cc | 26 +++++++++++++++++++++++--- Packets/80221Bundle/TLVPacket.hh | 9 +++++---- Packets/VectorParser.ct | 2 +- Packets/VectorParser.cti | 2 +- 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/Packets/80221Bundle/MIHPacket.cc b/Packets/80221Bundle/MIHPacket.cc index d4e2e6197..a81d0fa20 100644 --- a/Packets/80221Bundle/MIHPacket.cc +++ b/Packets/80221Bundle/MIHPacket.cc @@ -123,8 +123,8 @@ prefix_ void senf::MIHPacketType::dump(packet p, std::ostream &os) prefix_ void senf::MIHPacketType::finalize(packet p) { - p->src_mihfId().shrinkLength(); - p->dst_mihfId().shrinkLength(); + p->src_mihfId().finalizeLength(); + p->dst_mihfId().finalizeLength(); p->payloadLength_() << p.size() - 8; p->messageId() << key(p.next(nothrow)); } diff --git a/Packets/80221Bundle/TLVPacket.cc b/Packets/80221Bundle/TLVPacket.cc index 5a17ac7e5..3c28c5b1b 100644 --- a/Packets/80221Bundle/TLVPacket.cc +++ b/Packets/80221Bundle/TLVPacket.cc @@ -92,7 +92,27 @@ prefix_ void senf::DynamicTLVLengthParser::value(value_type const & v) default: throw( TLVLengthException()); }; - underflow_flag() = v < 128; + underflow_flag() = (v <= 128); +} + + +prefix_ senf::DynamicTLVLengthParser::value_type senf::DynamicTLVLengthParser::maxValue() + const +{ + switch (bytes() ) { + case 1: + return 128; + case 2: + return UInt8Parser::max_value + 128; + case 3: + return UInt16Parser::max_value + 128; + case 4: + return UInt24Parser::max_value + 128; + case 5: + return UInt32Parser::max_value; + default: + throw( TLVLengthException()); + }; } @@ -110,7 +130,7 @@ prefix_ void senf::DynamicTLVLengthParser::init() const } -prefix_ void senf::DynamicTLVLengthParser::shrink() +prefix_ void senf::DynamicTLVLengthParser::finalize() { value_type v = value(); size_type b = bytes(); @@ -199,7 +219,7 @@ prefix_ void senf::GenericTLVPacketType::dump(packet p, std::ostream & os) prefix_ void senf::GenericTLVPacketType::finalize(packet p) { - p->shrinkLength(); + p->finalizeLength(); } diff --git a/Packets/80221Bundle/TLVPacket.hh b/Packets/80221Bundle/TLVPacket.hh index ac2ece4c0..2151e7f4f 100644 --- a/Packets/80221Bundle/TLVPacket.hh +++ b/Packets/80221Bundle/TLVPacket.hh @@ -68,8 +68,9 @@ namespace senf { SENF_PARSER_PRIVATE_BITFIELD ( underflow_flag, 1, bool ); SENF_PARSER_PRIVATE_BITFIELD ( fixed_length_field, 6, unsigned ); - void shrink(); - void maxValue(DynamicTLVLengthParser::value_type v); + void finalize(); + void maxValue(value_type v); + value_type maxValue() const; private: void resize(size_type size); }; @@ -131,8 +132,8 @@ namespace senf { The size of the length field will be decreased to minimum necessary to hold the current length value. */ - void shrinkLength() { - length_().shrink(); + void finalizeLength() { + length_().finalize(); }; protected: diff --git a/Packets/VectorParser.ct b/Packets/VectorParser.ct index 2b519fed7..e98d027bc 100644 --- a/Packets/VectorParser.ct +++ b/Packets/VectorParser.ct @@ -64,8 +64,8 @@ prefix_ typename senf::VectorParser_Container<ElementParser,AuxPolicy>::iterator senf::VectorParser_Container<ElementParser,AuxPolicy>::shift(iterator pos, size_type n) { size_type ix (std::distance(data().begin(),pos.raw())); - data().insert(pos.raw(),n*ElementParser::fixed_bytes,0); setSize(size()+n); + data().insert(pos.raw(),n*ElementParser::fixed_bytes,0); return iterator(boost::next(data().begin(),ix),state()); } diff --git a/Packets/VectorParser.cti b/Packets/VectorParser.cti index adcaec1a0..60a79241a 100644 --- a/Packets/VectorParser.cti +++ b/Packets/VectorParser.cti @@ -247,8 +247,8 @@ prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::insert(itera template <class ElementParser, class AuxPolicy> prefix_ void senf::VectorParser_Container<ElementParser,AuxPolicy>::erase(iterator pos, size_type n) { - data().erase(pos.raw(),boost::next(pos.raw(),n*ElementParser::fixed_bytes)); setSize(size()-n); + data().erase(pos.raw(),boost::next(pos.raw(),n*ElementParser::fixed_bytes)); } template <class ElementParser, class AuxPolicy> -- GitLab