diff --git a/src/util-radix-tree.c b/src/util-radix-tree.c index f595c0a340..c8c3e9e715 100644 --- a/src/util-radix-tree.c +++ b/src/util-radix-tree.c @@ -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",