]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
ipv6: fix routing header parsing leading to rejection of valid packets.
authorVictor Julien <victor@inliniac.net>
Fri, 30 Mar 2012 11:07:00 +0000 (13:07 +0200)
committerVictor Julien <victor@inliniac.net>
Fri, 30 Mar 2012 11:07:00 +0000 (13:07 +0200)
src/decode-ipv6.c

index a3c04d0f9d0adb4d6ffcf78af141067e99a485b6..3adf86006a5bb5e649c9ddd6152f74990ab61308 100644 (file)
@@ -89,8 +89,7 @@ DecodeIPV6ExtHdrs(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt
                 SCReturn;
 
             case IPPROTO_ROUTING:
-                hdrextlen = sizeof(IPV6RouteHdr);
-                hdrextlen += (*(pkt+1) * 8);  /* 8 octet units */
+                hdrextlen = 8 + (*(pkt+1) * 8);  /* 8 bytes + length in 8 octet units */
 
                 SCLogDebug("hdrextlen %"PRIu8, hdrextlen);
 
@@ -690,6 +689,63 @@ end:
     return result;
 }
 
+/**
+ * \test routing header decode
+ */
+static int DecodeIPV6RouteTest01 (void)   {
+
+    uint8_t raw_pkt1[] = {
+        0x60, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x2b, 0x40,
+        0x20, 0x01, 0xaa, 0xaa, 0x00, 0x01, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
+        0x20, 0x01, 0xaa, 0xaa, 0x00, 0x01, 0x00, 0x00,
+        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+        0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+        0xb2, 0xed, 0x00, 0x50, 0x1b, 0xc7, 0x6a, 0xdf,
+        0x00, 0x00, 0x00, 0x00, 0x50, 0x02, 0x20, 0x00,
+        0xfa, 0x87, 0x00, 0x00,
+    };
+    Packet *p1 = SCMalloc(SIZE_OF_PACKET);
+    if (p1 == NULL)
+        return 0;
+    ThreadVars tv;
+    DecodeThreadVars dtv;
+    int result = 0;
+    PacketQueue pq;
+
+    FlowInitConfig(FLOW_QUIET);
+
+    memset(&pq, 0, sizeof(PacketQueue));
+    memset(&tv, 0, sizeof(ThreadVars));
+    memset(p1, 0, SIZE_OF_PACKET);
+    p1->pkt = (uint8_t *)(p1 + 1);
+    memset(&dtv, 0, sizeof(DecodeThreadVars));
+
+    PACKET_INITIALIZE(p1);
+
+    PacketCopyData(p1, raw_pkt1, sizeof(raw_pkt1));
+
+    DecodeIPV6(&tv, &dtv, p1, GET_PKT_DATA(p1), GET_PKT_LEN(p1), &pq);
+
+    if (!(IPV6_EXTHDR_ISSET_RH(p1))) {
+        printf("ipv6 routing header not detected: ");
+        goto end;
+    }
+
+    if (p1->ip6eh.ip6_exthdrs[0].len != 8) {
+        printf("ipv6 routing length incorrect: ");
+        goto end;
+    }
+
+    result = 1;
+end:
+    PACKET_CLEANUP(p1);
+    SCFree(p1);
+    FlowShutdown();
+    return result;
+}
+
 #endif /* UNITTESTS */
 
 /**
@@ -699,6 +755,7 @@ end:
 void DecodeIPV6RegisterTests(void) {
 #ifdef UNITTESTS
     UtRegisterTest("DecodeIPV6FragTest01", DecodeIPV6FragTest01, 1);
+    UtRegisterTest("DecodeIPV6RouteTest01", DecodeIPV6RouteTest01, 1);
 #endif /* UNITTESTS */
 }