static void test_zonecut_params(void **state) { /* NULL args */ struct kr_zonecut cut; assert_int_not_equal(kr_zonecut_init(NULL, NULL, NULL), 0); assert_int_not_equal(kr_zonecut_init(&cut, NULL, NULL), 0); kr_zonecut_deinit(NULL); kr_zonecut_set(NULL, NULL); kr_zonecut_set(&cut, NULL); assert_int_not_equal(kr_zonecut_add(NULL, NULL, NULL), 0); assert_null((void *)kr_zonecut_find(NULL, NULL)); assert_null((void *)kr_zonecut_find(&cut, NULL)); assert_int_not_equal(kr_zonecut_set_sbelt(NULL, NULL), 0); assert_int_not_equal(kr_zonecut_find_cached(NULL, NULL, NULL, NULL, 0), 0); }
static void test_zonecut_filter(void **state) { struct kr_zonecut cut; kr_zonecut_init(&cut, (const uint8_t *)"", NULL); /* IPv4 */ uint32_t ip4 = 0; /* 0.0.0.0 */ TEST_IP(cut, ip4, kr_error(EILSEQ)); ip4 = htonl(0x7f000002); /* 127.0.0.2 */ TEST_IP(cut, ip4, kr_error(EILSEQ)); ip4 = htonl(0x7fffffff); /* 127.255.255.255 */ TEST_IP(cut, ip4, kr_error(EILSEQ)); ip4 = htonl(0xff000001); /* 255.0.0.1 */ TEST_IP(cut, ip4, 0); /* IPv6 */ struct in6_addr ip6; memset(&ip6, 0, sizeof(ip6)); /* :: */ TEST_IP(cut, ip6.s6_addr, kr_error(EILSEQ)); ip6.s6_addr[15] = 0x01; /* ::1 */ TEST_IP(cut, ip6.s6_addr, kr_error(EILSEQ)); ip6.s6_addr[15] = 0x02; /* ::2 */ TEST_IP(cut, ip6.s6_addr, 0); kr_zonecut_deinit(&cut); }
static int load(struct kr_module *module, const char *path) { auto_fclose FILE *fp = fopen(path, "r"); if (fp == NULL) { DEBUG_MSG(NULL, "reading '%s' failed: %s\n", path, strerror(errno)); return kr_error(errno); } else { DEBUG_MSG(NULL, "reading '%s'\n", path); } /* Create pool and copy itself */ mm_ctx_t _pool = { .ctx = mp_new(4096), .alloc = (mm_alloc_t) mp_alloc }; mm_ctx_t *pool = mm_alloc(&_pool, sizeof(*pool)); if (!pool) { return kr_error(ENOMEM); } memcpy(pool, &_pool, sizeof(*pool)); /* Load file to map */ struct kr_zonecut *hints = mm_alloc(pool, sizeof(*hints)); kr_zonecut_init(hints, (const uint8_t *)(""), pool); module->data = hints; return load_map(hints, fp); }
static void test_zonecut_copy(void **state) { const knot_dname_t *root = (const uint8_t *)""; struct kr_zonecut cut1, cut2; kr_zonecut_init(&cut1, root, NULL); kr_zonecut_init(&cut2, root, NULL); /* Insert some values */ assert_int_equal(kr_zonecut_add(&cut1, (const uint8_t *)"dead", NULL), 0); assert_int_equal(kr_zonecut_add(&cut1, (const uint8_t *)"beef", NULL), 0); /* Copy */ assert_int_equal(kr_zonecut_copy(&cut2, &cut1), 0); /* Check if exist */ assert_non_null(kr_zonecut_find(&cut2, (const uint8_t *)"dead")); assert_non_null(kr_zonecut_find(&cut2, (const uint8_t *)"beef")); assert_null(kr_zonecut_find(&cut2, (const uint8_t *)"corn")); kr_zonecut_deinit(&cut1); kr_zonecut_deinit(&cut2); }
static int init_resolver(struct engine *engine) { /* Open resolution context */ engine->resolver.trust_anchors = map_make(); engine->resolver.negative_anchors = map_make(); engine->resolver.pool = engine->pool; engine->resolver.modules = &engine->modules; /* Create OPT RR */ engine->resolver.opt_rr = mm_alloc(engine->pool, sizeof(knot_rrset_t)); if (!engine->resolver.opt_rr) { return kr_error(ENOMEM); } knot_edns_init(engine->resolver.opt_rr, KR_EDNS_PAYLOAD, 0, KR_EDNS_VERSION, engine->pool); /* Set default root hints */ kr_zonecut_init(&engine->resolver.root_hints, (const uint8_t *)"", engine->pool); kr_zonecut_set_sbelt(&engine->resolver, &engine->resolver.root_hints); /* Open NS rtt + reputation cache */ engine->resolver.cache_rtt = mm_alloc(engine->pool, lru_size(kr_nsrep_lru_t, LRU_RTT_SIZE)); if (engine->resolver.cache_rtt) { lru_init(engine->resolver.cache_rtt, LRU_RTT_SIZE); } engine->resolver.cache_rep = mm_alloc(engine->pool, lru_size(kr_nsrep_lru_t, LRU_REP_SIZE)); if (engine->resolver.cache_rep) { lru_init(engine->resolver.cache_rep, LRU_REP_SIZE); } /* Load basic modules */ engine_register(engine, "iterate", NULL, NULL); engine_register(engine, "validate", NULL, NULL); engine_register(engine, "rrcache", NULL, NULL); engine_register(engine, "pktcache", NULL, NULL); /* Initialize storage backends */ struct storage_api lmdb = { "lmdb://", knot_db_lmdb_api, knot_db_lmdb_mkopts }; return array_push(engine->storage_registry, lmdb); }