]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
radix: add tests for Bug #5066
authorVictor Julien <vjulien@oisf.net>
Fri, 11 Feb 2022 14:52:51 +0000 (15:52 +0100)
committerVictor Julien <vjulien@oisf.net>
Thu, 17 Feb 2022 15:58:59 +0000 (16:58 +0100)
Bug: #5066.

src/util-radix-tree.c

index f595c0a340e0bdddd04821aa23b6329f5fe51e3b..c8c3e9e7154650ddaa4eef8644645fbced735519 100644 (file)
@@ -2220,6 +2220,197 @@ static int SCRadixTestIPV6Removal08(void)
     return result;
 }
 
+/** Bug #5066
+ *
+ *  insert:
+ *      - 100.117.241.0/25:  100.117.241.0  - 100.117.241.127
+ *      - 100.117.241.0/26:  100.117.241.0  - 100.117.241.63
+ *
+ *  check:
+ *      - 100.117.241.64/26: 100.117.241.64 - 100.117.241.127
+ */
+
+static int SCRadixTestIPV4Bug5066(void)
+{
+    struct sockaddr_in servaddr;
+    SCRadixNode *node = NULL;
+
+    SCLogDebug("setup tree");
+    SCRadixTree *tree = SCRadixCreateRadixTree(free, NULL);
+
+    memset(&servaddr, 0, sizeof(servaddr));
+    FAIL_IF(inet_pton(AF_INET, "100.117.241.0", &servaddr.sin_addr) <= 0);
+    SCLogDebug("add 100.117.241.0/25");
+    SCRadixAddKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, strdup("1"), 25);
+    SCRadixPrintTree(tree);
+    SCLogDebug("find 100.117.241.0/25");
+    char *r = NULL;
+    node = SCRadixFindKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, 25, (void **)&r);
+    FAIL_IF_NULL(node);
+    SCRadixPrintNodeInfo(node, 0, NULL);
+
+    SCLogDebug("add 100.117.241.0/26");
+    FAIL_IF(inet_pton(AF_INET, "100.117.241.0", &servaddr.sin_addr) <= 0);
+    SCRadixAddKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, strdup("2"), 26);
+    SCRadixPrintTree(tree);
+    SCLogDebug("find 100.117.241.0/26");
+    node = SCRadixFindKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, 26, NULL);
+    FAIL_IF_NULL(node);
+    SCRadixPrintNodeInfo(node, 0, NULL);
+
+    SCLogDebug("find 100.117.241.64/26 (should fail)");
+    FAIL_IF(inet_pton(AF_INET, "100.117.241.64", &servaddr.sin_addr) <= 0);
+    node = SCRadixFindKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, 26, NULL);
+    FAIL_IF_NOT_NULL(node);
+    SCRadixPrintNodeInfo(node, 0, NULL);
+
+    SCLogDebug("add 100.117.241.64/26");
+    SCRadixAddKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, strdup("3"), 26);
+    SCLogDebug("find 100.117.241.64/26 (should succeed)");
+    node = SCRadixFindKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, 26, NULL);
+    FAIL_IF_NULL(node);
+    SCRadixPrintNodeInfo(node, 0, NULL);
+
+    SCRadixPrintTree(tree);
+
+    SCRadixReleaseRadixTree(tree);
+    PASS;
+}
+
+static void SCRadixTestIPV4Bug5066v2PrintData(void *d)
+{
+    const char *s = d;
+    printf("%s", s);
+}
+
+static int SCRadixTestIPV4Bug5066v2(void)
+{
+    struct sockaddr_in servaddr;
+    SCRadixNode *node = NULL;
+
+    SCLogDebug("setup tree");
+    SCRadixTree *tree = SCRadixCreateRadixTree(free, SCRadixTestIPV4Bug5066v2PrintData);
+
+    memset(&servaddr, 0, sizeof(servaddr));
+    FAIL_IF(inet_pton(AF_INET, "1.2.3.0", &servaddr.sin_addr) <= 0);
+    SCRadixAddKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, strdup("1.2.3.0/24"), 24);
+    SCRadixPrintTree(tree);
+    char *r = NULL;
+    node = SCRadixFindKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, 24, (void **)&r);
+    SCRadixPrintTree(tree);
+    FAIL_IF_NULL(node);
+    SCRadixPrintNodeInfo(node, 0, NULL);
+    FAIL_IF_NOT(strcmp(r, "1.2.3.0/24") == 0);
+
+    memset(&servaddr, 0, sizeof(servaddr));
+    FAIL_IF(inet_pton(AF_INET, "1.2.3.0", &servaddr.sin_addr) <= 0);
+    SCRadixAddKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, strdup("1.2.3.0/25"), 25);
+    SCRadixPrintTree(tree);
+    r = NULL;
+    node = SCRadixFindKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, 25, (void **)&r);
+    SCRadixPrintTree(tree);
+    FAIL_IF_NULL(node);
+    SCRadixPrintNodeInfo(node, 0, NULL);
+    FAIL_IF_NOT(strcmp(r, "1.2.3.0/25") == 0);
+
+    memset(&servaddr, 0, sizeof(servaddr));
+    FAIL_IF(inet_pton(AF_INET, "1.2.3.0", &servaddr.sin_addr) <= 0);
+    SCRadixAddKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, strdup("1.2.3.0/26"), 26);
+    SCRadixPrintTree(tree);
+    r = NULL;
+    node = SCRadixFindKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, 26, (void **)&r);
+    SCRadixPrintTree(tree);
+    FAIL_IF_NULL(node);
+    SCRadixPrintNodeInfo(node, 0, NULL);
+    FAIL_IF_NOT(strcmp(r, "1.2.3.0/26") == 0);
+
+    memset(&servaddr, 0, sizeof(servaddr));
+    FAIL_IF(inet_pton(AF_INET, "1.2.3.64", &servaddr.sin_addr) <= 0);
+    SCRadixAddKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, strdup("1.2.3.64/26"), 26);
+    SCRadixPrintTree(tree);
+    r = NULL;
+    node = SCRadixFindKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, 26, (void **)&r);
+    SCRadixPrintTree(tree);
+    FAIL_IF_NULL(node);
+    SCRadixPrintNodeInfo(node, 0, NULL);
+    FAIL_IF_NOT(strcmp(r, "1.2.3.64/26") == 0);
+
+    memset(&servaddr, 0, sizeof(servaddr));
+    FAIL_IF(inet_pton(AF_INET, "1.2.3.64", &servaddr.sin_addr) <= 0);
+    SCRadixAddKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, strdup("1.2.3.64/27"), 27);
+    SCRadixPrintTree(tree);
+    r = NULL;
+    node = SCRadixFindKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, 27, (void **)&r);
+    SCRadixPrintTree(tree);
+    FAIL_IF_NULL(node);
+    SCRadixPrintNodeInfo(node, 0, NULL);
+    FAIL_IF_NOT(strcmp(r, "1.2.3.64/27") == 0);
+
+    memset(&servaddr, 0, sizeof(servaddr));
+    FAIL_IF(inet_pton(AF_INET, "1.2.3.96", &servaddr.sin_addr) <= 0);
+    SCRadixAddKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, strdup("1.2.3.96/27"), 27);
+    SCRadixPrintTree(tree);
+    r = NULL;
+    node = SCRadixFindKeyIPV4Netblock((uint8_t *)&servaddr.sin_addr, tree, 27, (void **)&r);
+    SCRadixPrintTree(tree);
+    FAIL_IF_NULL(node);
+    SCLogNotice("node:");
+    SCRadixPrintNodeInfo(node, 0, NULL);
+    FAIL_IF_NOT(strcmp(r, "1.2.3.96/27") == 0);
+
+    SCRadixReleaseRadixTree(tree);
+    PASS;
+}
+
+/** Bug #5066
+ */
+static int SCRadixTestIPV6Bug5066(void)
+{
+    struct sockaddr_in6 servaddr;
+    SCRadixNode *node = NULL;
+
+    SCLogDebug("setup tree");
+    SCRadixTree *tree = SCRadixCreateRadixTree(free, NULL);
+
+    memset(&servaddr, 0, sizeof(servaddr));
+    FAIL_IF(inet_pton(AF_INET6, "2000::1:0", &servaddr.sin6_addr) <= 0);
+    SCLogDebug("add 2000::1:0/121");
+    SCRadixAddKeyIPV6Netblock((uint8_t *)&servaddr.sin6_addr, tree, strdup("1"), 121);
+    SCRadixPrintTree(tree);
+    SCLogDebug("find 2000::1:0/121");
+    char *r = NULL;
+    node = SCRadixFindKeyIPV6Netblock((uint8_t *)&servaddr.sin6_addr, tree, 121, (void **)&r);
+    FAIL_IF_NULL(node);
+    SCRadixPrintNodeInfo(node, 0, NULL);
+
+    SCLogDebug("add 2000::1:0/122");
+    FAIL_IF(inet_pton(AF_INET6, "2000::1:0", &servaddr.sin6_addr) <= 0);
+    SCRadixAddKeyIPV6Netblock((uint8_t *)&servaddr.sin6_addr, tree, strdup("2"), 122);
+    SCRadixPrintTree(tree);
+    SCLogDebug("find 2000::1:0/122");
+    node = SCRadixFindKeyIPV6Netblock((uint8_t *)&servaddr.sin6_addr, tree, 122, NULL);
+    FAIL_IF_NULL(node);
+    SCRadixPrintNodeInfo(node, 0, NULL);
+
+    SCLogDebug("find 2000::1:64/122 (should fail)");
+    FAIL_IF(inet_pton(AF_INET6, "2000::1:64", &servaddr.sin6_addr) <= 0);
+    node = SCRadixFindKeyIPV6Netblock((uint8_t *)&servaddr.sin6_addr, tree, 122, NULL);
+    FAIL_IF_NOT_NULL(node);
+    SCRadixPrintNodeInfo(node, 0, NULL);
+
+    SCLogDebug("add 2000::1:64/122");
+    SCRadixAddKeyIPV6Netblock((uint8_t *)&servaddr.sin6_addr, tree, strdup("3"), 122);
+    SCLogDebug("find 2000::1:64/122 (should succeed)");
+    node = SCRadixFindKeyIPV6Netblock((uint8_t *)&servaddr.sin6_addr, tree, 122, NULL);
+    FAIL_IF_NULL(node);
+    SCRadixPrintNodeInfo(node, 0, NULL);
+
+    SCRadixPrintTree(tree);
+
+    SCRadixReleaseRadixTree(tree);
+    PASS;
+}
+
 static int SCRadixTestIPV4NetblockInsertion09(void)
 {
     SCRadixTree *tree = NULL;
@@ -4035,6 +4226,9 @@ void SCRadixRegisterTests(void)
     UtRegisterTest("SCRadixTestIPV6Removal08", SCRadixTestIPV6Removal08);
     UtRegisterTest("SCRadixTestIPV4NetblockInsertion09",
                    SCRadixTestIPV4NetblockInsertion09);
+    UtRegisterTest("SCRadixTestIPV4Bug5066", SCRadixTestIPV4Bug5066);
+    UtRegisterTest("SCRadixTestIPV4Bug5066v2", SCRadixTestIPV4Bug5066v2);
+    UtRegisterTest("SCRadixTestIPV6Bug5066", SCRadixTestIPV6Bug5066);
     UtRegisterTest("SCRadixTestIPV4NetblockInsertion10",
                    SCRadixTestIPV4NetblockInsertion10);
     UtRegisterTest("SCRadixTestIPV4NetblockInsertion11",