diff --git a/elements/ip/ipreassembler.cc b/elements/ip/ipreassembler.cc index 008c24df09..607102821b 100644 --- a/elements/ip/ipreassembler.cc +++ b/elements/ip/ipreassembler.cc @@ -318,7 +318,7 @@ IPReassembler::simple_action(Packet *p) q->set_anno_u16(_mtu_anno, p->network_length()); // extend the packet if necessary - if (p_lastoff > q->transport_length()) { + if (p_lastoff + 8 > q->transport_length()) { // error if packet already completed if (!(q->ip_header()->ip_off & htons(IP_MF))) { p->kill(); @@ -375,7 +375,7 @@ IPReassembler::simple_action(Packet *p) // copy p's annotations and IP header if it is the first packet if (p_off == 0) { uint16_t old_ip_off = q->ip_header()->ip_off; - int header_delta = p->ip_header_offset() - q->ip_header_offset(); + int header_delta = p->ip_header_offset() - q->ip_header_offset() + p->ip_header_length() - q->ip_header_length(); if (header_delta > 0) q = q->push(header_delta); else if (header_delta < 0) diff --git a/elements/ip/ipreassembler.hh b/elements/ip/ipreassembler.hh index 5c4062727d..92cb7a6e56 100644 --- a/elements/ip/ipreassembler.hh +++ b/elements/ip/ipreassembler.hh @@ -84,7 +84,7 @@ class IPReassembler : public Element { public: struct ChunkLink { uint16_t off; uint16_t lastoff; - }; + } __attribute__((packed)); private: diff --git a/lib/ip6address.cc b/lib/ip6address.cc index 15c838ca7a..ebea17d4a8 100644 --- a/lib/ip6address.cc +++ b/lib/ip6address.cc @@ -332,7 +332,7 @@ IP6AddressArg::basic_parse(const String &str, IP6Address &result, const ArgConte int d = 0, p = 0, coloncolon = -1; const char *begin = str.begin(), *end = str.end(), *s; - for (s = begin; s != end; ++s) { + for (s = begin; s != end && d < 8; ++s) { int digit; if (*s >= '0' && *s <= '9') digit = *s - '0'; diff --git a/lib/lexer.cc b/lib/lexer.cc index 83f0039af7..9d3a9465e4 100644 --- a/lib/lexer.cc +++ b/lib/lexer.cc @@ -416,7 +416,7 @@ Lexer::Compound::expand_into(Lexer *lexer, int which, VariableEnvironment &ve) // now copy hookups for (const Connection *cp = _conn.begin(); cp != _conn.end(); ++cp) - if (eidx_map[(*cp)[0].idx] >= 0 && eidx_map[(*cp)[0].idx] >= 0) + if (eidx_map[(*cp)[0].idx] >= 0 && eidx_map[(*cp)[1].idx] >= 0) lexer->_c->connect(eidx_map[(*cp)[1].idx], (*cp)[1].port, eidx_map[(*cp)[0].idx], (*cp)[0].port);