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;
UtRegisterTest("SCRadixTestIPV6Removal08", SCRadixTestIPV6Removal08);
UtRegisterTest("SCRadixTestIPV4NetblockInsertion09",
SCRadixTestIPV4NetblockInsertion09);
+ UtRegisterTest("SCRadixTestIPV4Bug5066", SCRadixTestIPV4Bug5066);
+ UtRegisterTest("SCRadixTestIPV4Bug5066v2", SCRadixTestIPV4Bug5066v2);
+ UtRegisterTest("SCRadixTestIPV6Bug5066", SCRadixTestIPV6Bug5066);
UtRegisterTest("SCRadixTestIPV4NetblockInsertion10",
SCRadixTestIPV4NetblockInsertion10);
UtRegisterTest("SCRadixTestIPV4NetblockInsertion11",