]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
fixing warnings. Possible IP length change fixed
authorJosh <jrosenba@cisco.com>
Thu, 1 May 2014 21:44:17 +0000 (17:44 -0400)
committerJosh <jrosenba@cisco.com>
Thu, 1 May 2014 21:44:17 +0000 (17:44 -0400)
src/codecs/basic/cd_ipv4.cc
src/codecs/basic/cd_ipv6.cc
src/codecs/plugins/cd_pgm.cc
src/managers/packet_manager.cc
src/protocols/packet.cc
src/protocols/packet.h

index fd6548abc04541c5c08206f06a259455815be966..476798984e3914351c39839fc1647aebd1ab66f7 100644 (file)
@@ -68,13 +68,9 @@ private:
     
 };
 
-
 uint16_t const IP_ID_COUNT = 8192;
 THREAD_LOCAL rand_t* s_rand = 0;
 
-#if 0
-THREAD_LOCAL uint16_t s_id_index = 0;
-#endif
 
 // this should be changed to type array
 THREAD_LOCAL uint16_t s_id_pool[IP_ID_COUNT] = {};
@@ -82,13 +78,8 @@ THREAD_LOCAL uint16_t s_id_pool[IP_ID_COUNT] = {};
 }  // namespace
 
 
-static inline void CheckPGMVuln(Packet *);
-static inline void CheckIGMPVuln(Packet *);
-static inline int pgm_nak_detect (uint8_t *, uint16_t );
 static inline void IP4AddrTests (Packet* );
 static inline void IPMiscTests(Packet *);
-static inline unsigned short in_chksum_ip( unsigned short *, int);
-
 static void DecodeIPOptions(const uint8_t *start, uint32_t o_len, Packet *p);
 
 
@@ -308,6 +299,7 @@ bool Ipv4Codec::decode(const uint8_t *raw_packet, const uint32_t len,
 
     /* set the real IP length for logging */
     p->actual_ip_len = (uint16_t) ip_len;
+    p->packet_flags |= PKT_NEW_IP_LEN;
 
     /* set the remaining packet length */
     ip_len -= hlen;
index 2c26e6f5031827f826b9245a703549d5e5e8b8e1..3e1fc8c0216c034b6a6a5060bffdfe5227a0bb30 100644 (file)
@@ -169,6 +169,7 @@ bool Ipv6Codec::decode(const uint8_t *raw_pkt, const uint32_t len,
     p->actual_ip_len = ntohs(p->ip6h->len);
     p->ip_data = raw_pkt + ipv6::hdr_len();
     p->ip_dsize = ntohs(p->ip6h->len);
+    p->packet_flags |= PKT_NEW_IP_LEN;
 
 
     lyr_len = sizeof(*hdr);
index 85bd8ad70983fde56425430dd1b362739186b415..b89cd92a0b5351934b568d677d42b8e44b1a9c05 100644 (file)
@@ -143,7 +143,7 @@ bool PgmCodec::decode(const uint8_t *raw_pkt, const uint32_t len,
 {
     if ( pgm_nak_detect((uint8_t *)p->data, p->dsize) == PGM_NAK_VULN )
         codec_events::decoder_event(p, DECODE_PGM_NAK_OVERFLOW);
-
+    return true;
 }
 
 void PgmCodec::get_protocol_ids(std::vector<uint16_t>& v)
index 2c0408581840d24857a881fd4519b82d5401e3da..6d0778add5a8c77301c50bfdfddc75c36e24cf96 100644 (file)
@@ -330,7 +330,15 @@ void PacketManager::decode(
     // loop until the protocol id is no longer valid
     while(s_protocols[mapped_prot]->decode(pkt, len, p, lyr_len, prot_id))
     {
-        PacketClass::PushLayer(p, s_protocols[mapped_prot], pkt, lyr_len);
+        PacketClass::push_layer(p, s_protocols[mapped_prot], pkt, lyr_len);
+
+        // since the IP length and the packet length may not be equal.
+        if (p->packet_flags & PKT_NEW_IP_LEN)
+        {
+            len = p->actual_ip_len;
+            p->packet_flags &= ~PKT_NEW_IP_LEN;
+        }
+
         s_stats[mapped_prot + stat_offset]++;
         mapped_prot = s_proto_map[prot_id];
         prev_prot_id = prot_id; // used for 'other_codecs' statistics
index afdacf148b8e4396e788a621f629507a9f27c3f8..8b8316b39d12d1c5416e5dd190831893a31655dd 100644 (file)
@@ -22,7 +22,7 @@
 #include "codecs/sf_protocols.h"
 #include "log/messages.h"
 
-void PacketClass::PushLayer(Packet *p, Codec* const cd, const uint8_t *hdr_start, uint32_t len)
+void PacketClass::push_layer(Packet *p, Codec* const cd, const uint8_t *hdr_start, uint32_t len)
 {
     if ( p->next_layer < LAYER_MAX )
     {
@@ -39,3 +39,58 @@ void PacketClass::PushLayer(Packet *p, Codec* const cd, const uint8_t *hdr_start
     }
 }
 
+// credit belong to dnet.h.  copied directrly from their source code
+// src/ip-util.cc
+uint16_t ip_cksum_add(const void *buf, size_t len, int cksum = 0)
+{
+    uint16_t *sp = (uint16_t *)buf;
+    int n, sn;
+
+    sn = len / 2;
+    n = (sn + 15) / 16;
+
+    /* XXX - unroll loop using Duff's device. */
+    switch (sn % 16) {
+    case 0: do {
+        cksum += *sp++;
+    case 15:
+        cksum += *sp++;
+    case 14:
+        cksum += *sp++;
+    case 13:
+        cksum += *sp++;
+    case 12:
+        cksum += *sp++;
+    case 11:
+        cksum += *sp++;
+    case 10:
+        cksum += *sp++;
+    case 9:
+        cksum += *sp++;
+    case 8:
+        cksum += *sp++;
+    case 7:
+        cksum += *sp++;
+    case 6:
+        cksum += *sp++;
+    case 5:
+        cksum += *sp++;
+    case 4:
+        cksum += *sp++;
+    case 3:
+        cksum += *sp++;
+    case 2:
+        cksum += *sp++;
+    case 1:
+        cksum += *sp++;
+        } while (--n > 0);
+    }
+    if (len & 1)
+        cksum += (*(unsigned char*)sp << 8);
+
+    cksum  = (cksum >> 16) + (cksum & 0x0000ffff);
+    cksum += (cksum >> 16);
+
+    return (uint16_t)(~cksum);
+}
+
index 163547144920ead6ba358dc0a0e72789fe01e4b1..1f89e977f142b28ff7bac1c82902e1e4b0ee8ec7 100644 (file)
@@ -111,6 +111,7 @@ extern "C" {
 #define PKT_IPREP_SOURCE_TRIGGERED  0x08000000
 #define PKT_IPREP_DATA_SET          0x10000000
 #define PKT_FILE_EVENT_SET          0x20000000
+#define PKT_NEW_IP_LEN              0X40000000 /* For Codecs to tell PacketManger a new length should be set */
 // 0x40000000 are available
 
 #define PKT_PDU_FULL (PKT_PDU_HEAD | PKT_PDU_TAIL)
@@ -861,7 +862,7 @@ typedef struct
 class PacketClass{
 
 public:
-    static void PushLayer(Packet *p, Codec* const cd, const uint8_t *hdr_start, uint32_t len);
+    static void push_layer(Packet *p, Codec* const cd, const uint8_t *hdr_start, uint32_t len);
 
 
 private: