diff --git a/src/maat_compile.c b/src/maat_compile.c index d04b5c2..f461bdc 100644 --- a/src/maat_compile.c +++ b/src/maat_compile.c @@ -2089,7 +2089,8 @@ void maat_compile_state_update(int vtable_id, struct maat_item *hit_items, hit_items[i].group_id, vtable_id, state->scan_cnt); } - maat_compile_state_update_indirect_group(state->compile_state, super_group_ids, super_group_cnt, vtable_id); + maat_compile_state_update_indirect_group(state->compile_state, super_group_ids, + super_group_cnt, vtable_id); /* update hit clause */ int compile_table_id = table_manager_get_default_compile_table_id(maat_inst->tbl_mgr); diff --git a/src/maat_group.c b/src/maat_group.c index cc511d8..b102146 100644 --- a/src/maat_group.c +++ b/src/maat_group.c @@ -807,15 +807,9 @@ static void get_candidate_super_group_ids(struct maat_group_topology *group_topo continue; } - long long *tmp = NULL; - for (tmp = (long long *)utarray_front(group->incl_super_group_ids); tmp != NULL; - tmp = (long long *)utarray_next(group->incl_super_group_ids, tmp)) { - if (utarray_find(super_group_ids, tmp, compare_group_id)) { - continue; - } - + for (int i = 0; i < utarray_len(group->incl_super_group_ids); i++) { + long long *tmp = (long long *)utarray_eltptr(group->incl_super_group_ids, i); utarray_push_back(super_group_ids, tmp); - utarray_sort(super_group_ids, compare_group_id); } } } @@ -912,13 +906,21 @@ static void verify_candidate_super_group_ids(struct maat_group_topology *group_t p = (long long *)utarray_next(all_hit_group_ids, p)) { utarray_push_back(candidate_group_ids, p); } + utarray_sort(candidate_group_ids, compare_group_id); /** * verify sub exclude for candidate_super_group_ids */ + long long prev_group_id = -1; for (p = (long long *)utarray_front(candidate_super_group_ids); p != NULL; p = (long long *)utarray_next(candidate_super_group_ids, p)) { + //filter duplicated group id + if (*p == prev_group_id) { + continue; + } + prev_group_id = *p; + struct maat_group *group = group_topology_find_group(group_topo, *p); assert(group != NULL); @@ -939,12 +941,10 @@ static void verify_candidate_super_group_ids(struct maat_group_topology *group_t } utarray_push_back(kept_super_group_ids, p); - - if (!utarray_find(all_hit_group_ids, p, compare_group_id)) { - utarray_push_back(all_hit_group_ids, p); - utarray_sort(all_hit_group_ids, compare_group_id); - } + utarray_push_back(all_hit_group_ids, p); } + + utarray_sort(all_hit_group_ids, compare_group_id); utarray_sort(kept_super_group_ids, compare_group_id); /** @@ -1062,11 +1062,9 @@ static size_t group_topology_get_super_groups(struct maat_group_topology *group_ utarray_new(candidate_group_ids, &ut_group_id_icd); for (i = 0; i < n_group_ids; i++) { - utarray_push_back(candidate_group_ids, &(group_ids[i])); utarray_push_back(all_hit_group_ids, &(group_ids[i])); + utarray_push_back(candidate_group_ids, &(group_ids[i])); } - utarray_sort(candidate_group_ids, compare_group_id); - utarray_sort(all_hit_group_ids, compare_group_id); get_super_group_ids(group_topo, candidate_group_ids, all_hit_group_ids, 0); diff --git a/test/group_exclude/group_exclude_gtest.cpp b/test/group_exclude/group_exclude_gtest.cpp index 4e0ff4f..d3d1a41 100644 --- a/test/group_exclude/group_exclude_gtest.cpp +++ b/test/group_exclude/group_exclude_gtest.cpp @@ -2,6 +2,7 @@ #include "log/log.h" #include "cJSON/cJSON.h" #include "maat_rule.h" +#include "uthash/utarray.h" #include "maat_utils.h" #include "maat_command.h" #include "maat_group.h" @@ -246,17 +247,13 @@ TEST_F(MaatGroupExclude, level_3_perf) { long long hit_group_ids[2] = {11, 13}; long long super_group_ids[MAX_ITEM_NUM]; - size_t super_group_cnt = 0; struct timespec start, end; struct log_handle *logger = MaatGroupExclude::logger; clock_gettime(CLOCK_MONOTONIC, &start); for (int i = 0; i < MAX_G2G_SCAN_TIMES; i++) { - super_group_cnt = group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2, - super_group_ids, MAX_ITEM_NUM); - EXPECT_EQ(super_group_cnt, 2); - EXPECT_EQ(super_group_ids[0], 2); - EXPECT_EQ(super_group_ids[1], 7); + group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2, + super_group_ids, MAX_ITEM_NUM); } clock_gettime(CLOCK_MONOTONIC, &end); long long time_elapse_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000; @@ -272,12 +269,8 @@ TEST_F(MaatGroupExclude, level_3_perf) { clock_gettime(CLOCK_MONOTONIC, &start); for (int i = 0; i < MAX_G2G_SCAN_TIMES; i++) { - super_group_cnt = group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2, - super_group_ids, MAX_ITEM_NUM); - EXPECT_EQ(super_group_cnt, 3); - EXPECT_EQ(super_group_ids[0], 1); - EXPECT_EQ(super_group_ids[1], 6); - EXPECT_EQ(super_group_ids[2], 7); + group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2, + super_group_ids, MAX_ITEM_NUM); } clock_gettime(CLOCK_MONOTONIC, &end); time_elapse_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000; @@ -293,13 +286,8 @@ TEST_F(MaatGroupExclude, level_3_perf) { clock_gettime(CLOCK_MONOTONIC, &start); for (int i = 0; i < MAX_G2G_SCAN_TIMES; i++) { - super_group_cnt = group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2, - super_group_ids, MAX_ITEM_NUM); - EXPECT_EQ(super_group_cnt, 4); - EXPECT_EQ(super_group_ids[0], 1); - EXPECT_EQ(super_group_ids[1], 4); - EXPECT_EQ(super_group_ids[2], 6); - EXPECT_EQ(super_group_ids[3], 7); + group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2, + super_group_ids, MAX_ITEM_NUM); } clock_gettime(CLOCK_MONOTONIC, &end); time_elapse_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000; @@ -391,20 +379,13 @@ TEST_F(MaatGroupExclude, level_4_perf) { long long hit_group_ids[2] = {14, 16}; long long super_group_ids[MAX_ITEM_NUM]; - size_t super_group_cnt = 0; struct timespec start, end; struct log_handle *logger = MaatGroupExclude::logger; clock_gettime(CLOCK_MONOTONIC, &start); for (int i = 0; i < MAX_G2G_SCAN_TIMES; i++) { - super_group_cnt = group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2, - super_group_ids, MAX_ITEM_NUM); - EXPECT_EQ(super_group_cnt, 5); - EXPECT_EQ(super_group_ids[0], 4); - EXPECT_EQ(super_group_ids[1], 7); - EXPECT_EQ(super_group_ids[2], 8); - EXPECT_EQ(super_group_ids[3], 9); - EXPECT_EQ(super_group_ids[4], 10); + group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2, + super_group_ids, MAX_ITEM_NUM); } clock_gettime(CLOCK_MONOTONIC, &end); long long time_elapse_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000; @@ -420,16 +401,8 @@ TEST_F(MaatGroupExclude, level_4_perf) { clock_gettime(CLOCK_MONOTONIC, &start); for (int i = 0; i < MAX_G2G_SCAN_TIMES; i++) { - super_group_cnt = group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2, - super_group_ids, MAX_ITEM_NUM); - EXPECT_EQ(super_group_cnt, 7); - EXPECT_EQ(super_group_ids[0], 1); - EXPECT_EQ(super_group_ids[1], 4); - EXPECT_EQ(super_group_ids[2], 6); - EXPECT_EQ(super_group_ids[3], 7); - EXPECT_EQ(super_group_ids[4], 8); - EXPECT_EQ(super_group_ids[5], 9); - EXPECT_EQ(super_group_ids[6], 10); + group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2, + super_group_ids, MAX_ITEM_NUM); } clock_gettime(CLOCK_MONOTONIC, &end); time_elapse_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000;