* \brief Function to decode ERSPAN packets
*/
-int DecodeERSPAN(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint16_t len, PacketQueue *pq)
+int DecodeERSPAN(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint32_t len, PacketQueue *pq)
{
StatsIncr(tv, dtv->counter_erspan);
#include "util-debug.h"
int DecodeEthernet(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p,
- uint8_t *pkt, uint16_t len, PacketQueue *pq)
+ uint8_t *pkt, uint32_t len, PacketQueue *pq)
{
StatsIncr(tv, dtv->counter_eth);
return TM_ECODE_FAILED;
}
+ if (unlikely(len > ETHERNET_HEADER_LEN + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
+
p->ethh = (EthernetHdr *)pkt;
if (unlikely(p->ethh == NULL))
return TM_ECODE_FAILED;
* \brief Function to decode GRE packets
*/
-int DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint16_t len, PacketQueue *pq)
+int DecodeGRE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint32_t len, PacketQueue *pq)
{
- uint16_t header_len = GRE_HDR_LEN;
+ uint32_t header_len = GRE_HDR_LEN;
GRESreHdr *gsre = NULL;
StatsIncr(tv, dtv->counter_gre);
/** DecodeICMPV4
* \brief Main ICMPv4 decoding function
*/
-int DecodeICMPV4(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint16_t len, PacketQueue *pq)
+int DecodeICMPV4(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint32_t len, PacketQueue *pq)
{
StatsIncr(tv, dtv->counter_icmpv4);
ENGINE_SET_EVENT(p,ICMPV4_UNKNOWN_CODE);
} else {
// parse IP header plus 64 bytes
- if (len >= ICMPV4_HEADER_PKT_OFFSET)
+ if (len >= ICMPV4_HEADER_PKT_OFFSET) {
+ if (unlikely(len > ICMPV4_HEADER_PKT_OFFSET + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
DecodePartialIPV4( p, (uint8_t*) (pkt + ICMPV4_HEADER_PKT_OFFSET), len - ICMPV4_HEADER_PKT_OFFSET );
+ }
}
break;
ENGINE_SET_EVENT(p,ICMPV4_UNKNOWN_CODE);
} else {
// parse IP header plus 64 bytes
- if (len > ICMPV4_HEADER_PKT_OFFSET)
+ if (len > ICMPV4_HEADER_PKT_OFFSET) {
+ if (unlikely(len > ICMPV4_HEADER_PKT_OFFSET + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
DecodePartialIPV4( p, (uint8_t*) (pkt + ICMPV4_HEADER_PKT_OFFSET), len - ICMPV4_HEADER_PKT_OFFSET );
+ }
}
break;
ENGINE_SET_EVENT(p,ICMPV4_UNKNOWN_CODE);
} else {
// parse IP header plus 64 bytes
- if (len > ICMPV4_HEADER_PKT_OFFSET)
+ if (len > ICMPV4_HEADER_PKT_OFFSET) {
+ if (unlikely(len > ICMPV4_HEADER_PKT_OFFSET + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
DecodePartialIPV4( p, (uint8_t*) (pkt + ICMPV4_HEADER_PKT_OFFSET), len - ICMPV4_HEADER_PKT_OFFSET );
+ }
}
break;
ENGINE_SET_EVENT(p,ICMPV4_UNKNOWN_CODE);
} else {
// parse IP header plus 64 bytes
- if (len > ICMPV4_HEADER_PKT_OFFSET)
+ if (len > ICMPV4_HEADER_PKT_OFFSET) {
+ if (unlikely(len > ICMPV4_HEADER_PKT_OFFSET + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
DecodePartialIPV4( p, (uint8_t*) (pkt + ICMPV4_HEADER_PKT_OFFSET), len - ICMPV4_HEADER_PKT_OFFSET );
+ }
}
break;
* \retval void No return value
*/
int DecodeICMPV6(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p,
- uint8_t *pkt, uint16_t len, PacketQueue *pq)
+ uint8_t *pkt, uint32_t len, PacketQueue *pq)
{
int full_hdr = 0;
StatsIncr(tv, dtv->counter_icmpv6);
if (ICMPV6_GET_CODE(p) > ICMP6_DST_UNREACH_REJECTROUTE) {
ENGINE_SET_EVENT(p, ICMPV6_UNKNOWN_CODE);
} else {
+ if (unlikely(len > ICMPV6_HEADER_LEN + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
DecodePartialIPV6(p, (uint8_t*) (pkt + ICMPV6_HEADER_LEN),
len - ICMPV6_HEADER_LEN );
full_hdr = 1;
if (ICMPV6_GET_CODE(p) != 0) {
ENGINE_SET_EVENT(p, ICMPV6_UNKNOWN_CODE);
} else {
+ if (unlikely(len > ICMPV6_HEADER_LEN + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
p->icmpv6vars.mtu = ICMPV6_GET_MTU(p);
DecodePartialIPV6(p, (uint8_t*) (pkt + ICMPV6_HEADER_LEN),
len - ICMPV6_HEADER_LEN );
if (ICMPV6_GET_CODE(p) > ICMP6_TIME_EXCEED_REASSEMBLY) {
ENGINE_SET_EVENT(p, ICMPV6_UNKNOWN_CODE);
} else {
+ if (unlikely(len > ICMPV6_HEADER_LEN + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
DecodePartialIPV6(p, (uint8_t*) (pkt + ICMPV6_HEADER_LEN),
len - ICMPV6_HEADER_LEN );
full_hdr = 1;
if (ICMPV6_GET_CODE(p) > ICMP6_PARAMPROB_OPTION) {
ENGINE_SET_EVENT(p, ICMPV6_UNKNOWN_CODE);
} else {
+ if (unlikely(len > ICMPV6_HEADER_LEN + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
p->icmpv6vars.error_ptr= ICMPV6_GET_ERROR_PTR(p);
DecodePartialIPV6(p, (uint8_t*) (pkt + ICMPV6_HEADER_LEN),
len - ICMPV6_HEADER_LEN );
#define MPLS_PROTO_IPV6 6
int DecodeMPLS(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt,
- uint16_t len, PacketQueue *pq)
+ uint32_t len, PacketQueue *pq)
{
uint32_t shim;
int label;
label = MPLS_LABEL(shim);
if (label == MPLS_LABEL_IPV4) {
+ if (len > USHRT_MAX) {
+ return TM_ECODE_FAILED;
+ }
return DecodeIPV4(tv, dtv, p, pkt, len, pq);
}
else if (label == MPLS_LABEL_ROUTER_ALERT) {
event = MPLS_BAD_LABEL_ROUTER_ALERT;
}
else if (label == MPLS_LABEL_IPV6) {
+ if (len > USHRT_MAX) {
+ return TM_ECODE_FAILED;
+ }
return DecodeIPV6(tv, dtv, p, pkt, len, pq);
}
else if (label == MPLS_LABEL_NULL) {
/* Best guess at inner packet. */
switch (pkt[0] >> 4) {
case MPLS_PROTO_IPV4:
+ if (len > USHRT_MAX) {
+ return TM_ECODE_FAILED;
+ }
DecodeIPV4(tv, dtv, p, pkt, len, pq);
break;
case MPLS_PROTO_IPV6:
+ if (len > USHRT_MAX) {
+ return TM_ECODE_FAILED;
+ }
DecodeIPV6(tv, dtv, p, pkt, len, pq);
break;
case MPLS_PROTO_ETHERNET_PW:
#define HDR_SIZE 4
-int DecodeNull(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint16_t len, PacketQueue *pq)
+int DecodeNull(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint32_t len, PacketQueue *pq)
{
StatsIncr(tv, dtv->counter_null);
return TM_ECODE_FAILED;
}
+ if (unlikely(GET_PKT_LEN(p) > HDR_SIZE + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
+
uint32_t type = *((uint32_t *)pkt);
switch(type) {
case AF_INET:
#include "util-unittest.h"
#include "util-debug.h"
-int DecodePPP(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint16_t len, PacketQueue *pq)
+int DecodePPP(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint32_t len, PacketQueue *pq)
{
StatsIncr(tv, dtv->counter_ppp);
if (unlikely(p->ppph == NULL))
return TM_ECODE_FAILED;
- SCLogDebug("p %p pkt %p PPP protocol %04x Len: %" PRId32 "",
+ SCLogDebug("p %p pkt %p PPP protocol %04x Len: %" PRIu32 "",
p, pkt, SCNtohs(p->ppph->protocol), len);
switch (SCNtohs(p->ppph->protocol))
return TM_ECODE_FAILED;
}
+ if (unlikely(len > PPP_HEADER_LEN + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
+
if (likely(IPV4_GET_RAW_VER((IPV4Hdr *)(pkt + PPP_HEADER_LEN)) == 4)) {
return DecodeIPV4(tv, dtv, p, pkt + PPP_HEADER_LEN, len - PPP_HEADER_LEN, pq);
} else
p->ppph = NULL;
return TM_ECODE_FAILED;
}
+ if (unlikely(len > PPP_HEADER_LEN + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
return DecodeIPV4(tv, dtv, p, pkt + PPP_HEADER_LEN, len - PPP_HEADER_LEN, pq);
p->ppph = NULL;
return TM_ECODE_FAILED;
}
+ if (unlikely(len > PPP_HEADER_LEN + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
return DecodeIPV6(tv, dtv, p, pkt + PPP_HEADER_LEN, len - PPP_HEADER_LEN, pq);
/**
* \brief Main decoding function for PPPOE Discovery packets
*/
-int DecodePPPOEDiscovery(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint16_t len, PacketQueue *pq)
+int DecodePPPOEDiscovery(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint32_t len, PacketQueue *pq)
{
StatsIncr(tv, dtv->counter_pppoe);
/* parse any tags we have in the packet */
- uint16_t tag_length = 0;
+ uint32_t tag_length = 0;
PPPOEDiscoveryTag* pppoedt = (PPPOEDiscoveryTag*) (p->pppoedh + PPPOE_DISCOVERY_HEADER_MIN_LEN);
- uint16_t pppoe_length = SCNtohs(p->pppoedh->pppoe_length);
- uint16_t packet_length = len - PPPOE_DISCOVERY_HEADER_MIN_LEN ;
+ uint32_t pppoe_length = SCNtohs(p->pppoedh->pppoe_length);
+ uint32_t packet_length = len - PPPOE_DISCOVERY_HEADER_MIN_LEN ;
- SCLogDebug("pppoe_length %"PRIu16", packet_length %"PRIu16"",
+ SCLogDebug("pppoe_length %"PRIu32", packet_length %"PRIu32"",
pppoe_length, packet_length);
if (pppoe_length > packet_length) {
#endif
tag_length = SCNtohs(pppoedt->pppoe_tag_length);
- SCLogDebug ("PPPoE Tag type %x, length %u", tag_type, tag_length);
+ SCLogDebug ("PPPoE Tag type %x, length %"PRIu32, tag_type, tag_length);
if (pppoe_length >= (4 + tag_length)) {
pppoe_length -= (4 + tag_length);
/**
* \brief Main decoding function for PPPOE Session packets
*/
-int DecodePPPOESession(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint16_t len, PacketQueue *pq)
+int DecodePPPOESession(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint32_t len, PacketQueue *pq)
{
StatsIncr(tv, dtv->counter_pppoe);
ENGINE_SET_INVALID_EVENT(p, PPPVJU_PKT_TOO_SMALL);
return TM_ECODE_OK;
}
+ if (unlikely(len > PPPOE_SESSION_HEADER_LEN + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
if(IPV4_GET_RAW_VER((IPV4Hdr *)(pkt + PPPOE_SESSION_HEADER_LEN)) == 4) {
DecodeIPV4(tv, dtv, p, pkt + PPPOE_SESSION_HEADER_LEN, len - PPPOE_SESSION_HEADER_LEN, pq );
ENGINE_SET_INVALID_EVENT(p, PPPIPV4_PKT_TOO_SMALL);
return TM_ECODE_OK;
}
+ if (unlikely(len > PPPOE_SESSION_HEADER_LEN + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
DecodeIPV4(tv, dtv, p, pkt + PPPOE_SESSION_HEADER_LEN, len - PPPOE_SESSION_HEADER_LEN, pq );
break;
ENGINE_SET_INVALID_EVENT(p, PPPIPV6_PKT_TOO_SMALL);
return TM_ECODE_OK;
}
+ if (unlikely(len > PPPOE_SESSION_HEADER_LEN + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
DecodeIPV6(tv, dtv, p, pkt + PPPOE_SESSION_HEADER_LEN, len - PPPOE_SESSION_HEADER_LEN, pq );
break;
#include "host.h"
-int DecodeRaw(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint16_t len, PacketQueue *pq)
+int DecodeRaw(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint32_t len, PacketQueue *pq)
{
StatsIncr(tv, dtv->counter_raw);
return TM_ECODE_FAILED;
}
+
+
if (IP_GET_RAW_VER(pkt) == 4) {
+ if (unlikely(GET_PKT_LEN(p) > USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
SCLogDebug("IPV4 Packet");
DecodeIPV4(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq);
} else if (IP_GET_RAW_VER(pkt) == 6) {
+ if (unlikely(GET_PKT_LEN(p) > USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
SCLogDebug("IPV6 Packet");
DecodeIPV6(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq);
} else {
#include "decode-events.h"
#include "util-debug.h"
-int DecodeSll(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint16_t len, PacketQueue *pq)
+int DecodeSll(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint32_t len, PacketQueue *pq)
{
StatsIncr(tv, dtv->counter_sll);
switch (SCNtohs(sllh->sll_protocol)) {
case ETHERNET_TYPE_IP:
+ if (unlikely(len > SLL_HEADER_LEN + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
DecodeIPV4(tv, dtv, p, pkt + SLL_HEADER_LEN,
len - SLL_HEADER_LEN, pq);
break;
case ETHERNET_TYPE_IPV6:
+ if (unlikely(len > SLL_HEADER_LEN + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
DecodeIPV6(tv, dtv, p, pkt + SLL_HEADER_LEN,
len - SLL_HEADER_LEN, pq);
break;
*/
int DecodeTEMPLATE(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p,
- const uint8_t *pkt, uint16_t len, PacketQueue *pq)
+ const uint8_t *pkt, uint32_t len, PacketQueue *pq)
{
/* TODO add counter for your type of packet to DecodeThreadVars,
* and register it in DecodeRegisterPerfCounters */
* \param pq pointer to the packet queue
*
*/
-int DecodeVLAN(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint16_t len, PacketQueue *pq)
+int DecodeVLAN(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint32_t len, PacketQueue *pq)
{
uint32_t proto;
proto = GET_VLAN_PROTO(p->vlanh[p->vlan_idx]);
- SCLogDebug("p %p pkt %p VLAN protocol %04x VLAN PRI %d VLAN CFI %d VLAN ID %d Len: %" PRId32 "",
+ SCLogDebug("p %p pkt %p VLAN protocol %04x VLAN PRI %d VLAN CFI %d VLAN ID %d Len: %" PRIu32 "",
p, pkt, proto, GET_VLAN_PRIORITY(p->vlanh[p->vlan_idx]),
GET_VLAN_CFI(p->vlanh[p->vlan_idx]), GET_VLAN_ID(p->vlanh[p->vlan_idx]), len);
switch (proto) {
case ETHERNET_TYPE_IP:
+ if (unlikely(len > VLAN_HEADER_LEN + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
+
DecodeIPV4(tv, dtv, p, pkt + VLAN_HEADER_LEN,
len - VLAN_HEADER_LEN, pq);
break;
case ETHERNET_TYPE_IPV6:
+ if (unlikely(len > VLAN_HEADER_LEN + USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
DecodeIPV6(tv, dtv, p, pkt + VLAN_HEADER_LEN,
len - VLAN_HEADER_LEN, pq);
break;
#include "output-flow.h"
int DecodeTunnel(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p,
- uint8_t *pkt, uint16_t len, PacketQueue *pq, enum DecodeTunnelProto proto)
+ uint8_t *pkt, uint32_t len, PacketQueue *pq, enum DecodeTunnelProto proto)
{
switch (proto) {
case DECODE_TUNNEL_PPP:
* \param Pointer to the data to copy
* \param Length of the data to copy
*/
-inline int PacketCopyDataOffset(Packet *p, int offset, uint8_t *data, int datalen)
+inline int PacketCopyDataOffset(Packet *p, uint32_t offset, uint8_t *data, uint32_t datalen)
{
if (unlikely(offset + datalen > MAX_PAYLOAD_SIZE)) {
/* too big */
/* Do we have already an packet with allocated data */
if (! p->ext_pkt) {
- if (offset + datalen <= (int)default_packet_size) {
+ uint32_t newsize = offset + datalen;
+ // check overflow
+ if (newsize < offset)
+ return -1;
+ if (newsize <= default_packet_size) {
/* data will fit in memory allocated with packet */
memcpy(GET_PKT_DIRECT_DATA(p) + offset, data, datalen);
} else {
* \param Pointer to the data to copy
* \param Length of the data to copy
*/
-inline int PacketCopyData(Packet *p, uint8_t *pktdata, int pktlen)
+inline int PacketCopyData(Packet *p, uint8_t *pktdata, uint32_t pktlen)
{
SET_PKT_LEN(p, (size_t)pktlen);
return PacketCopyDataOffset(p, 0, pktdata, pktlen);
* \retval p the pseudo packet or NULL if out of memory
*/
Packet *PacketTunnelPktSetup(ThreadVars *tv, DecodeThreadVars *dtv, Packet *parent,
- uint8_t *pkt, uint16_t len, enum DecodeTunnelProto proto,
+ uint8_t *pkt, uint32_t len, enum DecodeTunnelProto proto,
PacketQueue *pq)
{
int ret;
*
* \retval p the pseudo packet or NULL if out of memory
*/
-Packet *PacketDefragPktSetup(Packet *parent, uint8_t *pkt, uint16_t len, uint8_t proto)
+Packet *PacketDefragPktSetup(Packet *parent, uint8_t *pkt, uint32_t len, uint8_t proto)
{
SCEnter();
* \param Pointer to the data
* \param Length of the data
*/
-inline int PacketSetData(Packet *p, uint8_t *pktdata, int pktlen)
+inline int PacketSetData(Packet *p, uint8_t *pktdata, uint32_t pktlen)
{
SET_PKT_LEN(p, (size_t)pktlen);
if (unlikely(!pktdata)) {
};
Packet *PacketTunnelPktSetup(ThreadVars *tv, DecodeThreadVars *dtv, Packet *parent,
- uint8_t *pkt, uint16_t len, enum DecodeTunnelProto proto, PacketQueue *pq);
-Packet *PacketDefragPktSetup(Packet *parent, uint8_t *pkt, uint16_t len, uint8_t proto);
+ uint8_t *pkt, uint32_t len, enum DecodeTunnelProto proto, PacketQueue *pq);
+Packet *PacketDefragPktSetup(Packet *parent, uint8_t *pkt, uint32_t len, uint8_t proto);
void PacketDefragPktSetupParent(Packet *parent);
void DecodeRegisterPerfCounters(DecodeThreadVars *, ThreadVars *);
Packet *PacketGetFromQueueOrAlloc(void);
void PacketFree(Packet *p);
void PacketFreeOrRelease(Packet *p);
int PacketCallocExtPkt(Packet *p, int datalen);
-int PacketCopyData(Packet *p, uint8_t *pktdata, int pktlen);
-int PacketSetData(Packet *p, uint8_t *pktdata, int pktlen);
-int PacketCopyDataOffset(Packet *p, int offset, uint8_t *data, int datalen);
+int PacketCopyData(Packet *p, uint8_t *pktdata, uint32_t pktlen);
+int PacketSetData(Packet *p, uint8_t *pktdata, uint32_t pktlen);
+int PacketCopyDataOffset(Packet *p, uint32_t offset, uint8_t *data, uint32_t datalen);
const char *PktSrcToString(enum PktSrcEnum pkt_src);
void PacketBypassCallback(Packet *p);
const DecodeThreadVars *dtv, const Packet *p);
/* decoder functions */
-int DecodeEthernet(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
-int DecodeSll(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
-int DecodePPP(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
-int DecodePPPOESession(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
-int DecodePPPOEDiscovery(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
-int DecodeTunnel(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *, enum DecodeTunnelProto) __attribute__ ((warn_unused_result));
-int DecodeNull(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
-int DecodeRaw(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
+int DecodeEthernet(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint32_t, PacketQueue *);
+int DecodeSll(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint32_t, PacketQueue *);
+int DecodePPP(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint32_t, PacketQueue *);
+int DecodePPPOESession(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint32_t, PacketQueue *);
+int DecodePPPOEDiscovery(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint32_t, PacketQueue *);
+int DecodeTunnel(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint32_t, PacketQueue *, enum DecodeTunnelProto) __attribute__ ((warn_unused_result));
+int DecodeNull(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint32_t, PacketQueue *);
+int DecodeRaw(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint32_t, PacketQueue *);
int DecodeIPV4(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
int DecodeIPV6(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
-int DecodeICMPV4(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
-int DecodeICMPV6(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
+int DecodeICMPV4(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint32_t, PacketQueue *);
+int DecodeICMPV6(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint32_t, PacketQueue *);
int DecodeTCP(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
int DecodeUDP(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
int DecodeSCTP(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
-int DecodeGRE(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
-int DecodeVLAN(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
-int DecodeMPLS(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
-int DecodeERSPAN(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
-int DecodeTEMPLATE(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint16_t, PacketQueue *);
+int DecodeGRE(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint32_t, PacketQueue *);
+int DecodeVLAN(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint32_t, PacketQueue *);
+int DecodeMPLS(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint32_t, PacketQueue *);
+int DecodeERSPAN(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint32_t, PacketQueue *);
+int DecodeTEMPLATE(ThreadVars *, DecodeThreadVars *, Packet *, const uint8_t *, uint32_t, PacketQueue *);
#ifdef UNITTESTS
void DecodeIPV6FragHeader(Packet *p, uint8_t *pkt,
#ifdef AFLFUZZ_DECODER
typedef int (*DecoderFunc)(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p,
- uint8_t *pkt, uint16_t len, PacketQueue *pq);
+ uint8_t *pkt, uint32_t len, PacketQueue *pq);
int DecoderParseDataFromFile(char *filename, DecoderFunc Decoder);
int DecoderParseDataFromFileSerie(char *fileprefix, DecoderFunc Decoder);
/* Process IP packets */
if (IPV4_GET_RAW_VER(ip4h) == 4) {
+ if (unlikely(GET_PKT_LEN(p) > USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
SCLogDebug("DecodeIPFW ip4 processing");
DecodeIPV4(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq);
} else if(IPV6_GET_RAW_VER(ip6h) == 6) {
+ if (unlikely(GET_PKT_LEN(p) > USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
SCLogDebug("DecodeIPFW ip6 processing");
DecodeIPV6(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq);
DecodeUpdatePacketCounters(tv, dtv, p);
if (IPV4_GET_RAW_VER(ip4h) == 4) {
+ if (unlikely(GET_PKT_LEN(p) > USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
SCLogDebug("IPv4 packet");
DecodeIPV4(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq);
} else if(IPV6_GET_RAW_VER(ip6h) == 6) {
+ if (unlikely(GET_PKT_LEN(p) > USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
SCLogDebug("IPv6 packet");
DecodeIPV6(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq);
} else {
DecodeUpdatePacketCounters(tv, dtv, p);
if (IPV4_GET_RAW_VER(ip4h) == 4) {
+ if (unlikely(GET_PKT_LEN(p) > USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
SCLogDebug("IPv4 packet");
DecodeIPV4(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq);
} else if(IPV6_GET_RAW_VER(ip6h) == 6) {
+ if (unlikely(GET_PKT_LEN(p) > USHRT_MAX)) {
+ return TM_ECODE_FAILED;
+ }
SCLogDebug("IPv6 packet");
DecodeIPV6(tv, dtv, p, GET_PKT_DATA(p), GET_PKT_LEN(p), pq);
} else {
PcapFileSharedVars *shared;
} PcapFileFileVars;
-typedef int (*Decoder)(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint16_t, PacketQueue *);
+typedef int (*Decoder)(ThreadVars *, DecodeThreadVars *, Packet *, uint8_t *, uint32_t, PacketQueue *);
/**
* Dispatch a file for processing, where the information necessary to process that