From 972d3a1219f6efef97804687f0fea9d6ab972749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=96=87=E5=9D=9B?= Date: Thu, 7 Dec 2023 08:08:25 +0000 Subject: [PATCH] [FEATURE]add maat_state_get_last_hit_group_ids API => TSG-17831 --- include/maat.h | 7 +++++ src/inc_internal/maat_compile.h | 4 +++ src/maat_api.c | 12 +++++++++ src/maat_compile.c | 47 ++++++++++++++++++++------------- test/maat_framework_gtest.cpp | 19 ++++++++++++- 5 files changed, 70 insertions(+), 19 deletions(-) diff --git a/include/maat.h b/include/maat.h index 5740fed..4fff9d4 100644 --- a/include/maat.h +++ b/include/maat.h @@ -325,6 +325,7 @@ size_t maat_state_get_scan_count(struct maat_state *state); * @brief direct group means group corresponding to item * * NOTE: hit groups may be duplicated + * */ int maat_state_get_direct_hit_groups(struct maat_state *state, struct maat_hit_group *group_array, @@ -341,6 +342,12 @@ int maat_state_get_indirect_hit_groups(struct maat_state *state, size_t array_size); size_t maat_state_get_indirect_hit_group_cnt(struct maat_state *state); +/** + * @brief get last scan hit group id(including direct/indirect) +*/ +int maat_state_get_last_hit_group_ids(struct maat_state *state, + long long *group_id_array, + size_t array_size); #ifdef __cplusplus } #endif diff --git a/src/inc_internal/maat_compile.h b/src/inc_internal/maat_compile.h index 3a5f716..371b4bd 100644 --- a/src/inc_internal/maat_compile.h +++ b/src/inc_internal/maat_compile.h @@ -119,6 +119,10 @@ size_t compile_state_get_indirect_hit_groups(struct compile_state *compile_state size_t compile_state_get_indirect_hit_group_cnt(struct compile_state *compile_state); +size_t compile_state_get_last_hit_group_id(struct compile_state *compile_state, + long long *group_id_arary, + size_t array_size); + int compile_state_get_compile_table_id(struct compile_state *compile_state, long long compile_id); diff --git a/src/maat_api.c b/src/maat_api.c index 6dce05f..dbc633b 100644 --- a/src/maat_api.c +++ b/src/maat_api.c @@ -2139,4 +2139,16 @@ size_t maat_state_get_indirect_hit_group_cnt(struct maat_state *state) } return compile_state_get_indirect_hit_group_cnt(state->compile_state); +} + +int maat_state_get_last_hit_group_ids(struct maat_state *state, + long long *group_id_array, + size_t array_size) +{ + if (NULL == state || NULL == state->compile_state) { + return 0; + } + + return compile_state_get_last_hit_group_id(state->compile_state, + group_id_array, array_size); } \ No newline at end of file diff --git a/src/maat_compile.c b/src/maat_compile.c index c2d84b8..504d4a7 100644 --- a/src/maat_compile.c +++ b/src/maat_compile.c @@ -179,6 +179,7 @@ struct compile_state { UT_array *exclude_not_clauses; UT_array *direct_hit_groups; UT_array *indirect_hit_groups; + UT_array *last_hit_group_ids; UT_array *hit_compile_table_ids; struct table_group *hit_not_tbl_groups; }; @@ -1464,6 +1465,7 @@ struct compile_state *compile_state_new(void) utarray_new(compile_state->exclude_not_clauses, &ut_clause_id_icd); utarray_new(compile_state->direct_hit_groups, &ut_maat_hit_group_icd); utarray_new(compile_state->indirect_hit_groups, &ut_maat_hit_group_icd); + utarray_new(compile_state->last_hit_group_ids, &ut_compile_group_id_icd); utarray_new(compile_state->hit_compile_table_ids, &ut_hit_compile_table_id_icd); compile_state->hit_not_tbl_groups = NULL; @@ -1508,6 +1510,7 @@ void compile_state_reset(struct compile_state *compile_state) utarray_clear(compile_state->exclude_not_clauses); utarray_clear(compile_state->direct_hit_groups); utarray_clear(compile_state->indirect_hit_groups); + utarray_clear(compile_state->last_hit_group_ids); utarray_clear(compile_state->hit_compile_table_ids); struct table_group *tbl_group = NULL, *tmp_tbl_group = NULL; @@ -1567,6 +1570,12 @@ void compile_state_free(struct compile_state *compile_state, compile_state->indirect_hit_groups = NULL; } + if (compile_state->last_hit_group_ids != NULL) { + free_bytes += utarray_size(compile_state->last_hit_group_ids) * sizeof(long long); + utarray_free(compile_state->last_hit_group_ids); + compile_state->last_hit_group_ids = NULL; + } + if (compile_state->hit_compile_table_ids != NULL) { free_bytes += utarray_size(compile_state->hit_compile_table_ids) * sizeof(struct compile2table_id); utarray_free(compile_state->hit_compile_table_ids); @@ -2396,13 +2405,15 @@ int compile_state_update(struct compile_state *compile_state, struct maat *maat_ size_t i = 0, j = 0; size_t hit_cnt = n_hit_item; long long hit_group_ids[MAX_HIT_GROUP_NUM]; - + utarray_clear(compile_state->this_scan_hit_clauses); + utarray_clear(compile_state->last_hit_group_ids); compile_state->this_scan_not_logic = 0; compile_state->Nth_scan = Nth_scan; for (i = 0; i < hit_cnt; i++) { hit_group_ids[i] = hit_items[i].group_id; + utarray_push_back(compile_state->last_hit_group_ids, &hit_items[i].group_id); } int g2g_table_id = table_manager_get_group2group_table_id(maat_inst->tbl_mgr); @@ -2412,11 +2423,14 @@ int compile_state_update(struct compile_state *compile_state, struct maat *maat_ size_t super_group_cnt = group2group_runtime_get_super_groups(g2g_rt, hit_group_ids, hit_cnt, super_group_ids, MAX_HIT_GROUP_NUM); + for (i = 0; i < super_group_cnt; i++) { + utarray_push_back(compile_state->last_hit_group_ids, &super_group_ids[i]); + } + if (1 == maat_inst->opts.hit_path_on && hit_cnt > 0) { for (i = 0; i < hit_cnt; i++) { compile_state_add_internal_hit_path(compile_state, hit_items[i].item_id, - hit_items[i].group_id, vtable_id, - 0, Nth_scan); + hit_items[i].group_id, vtable_id, 0, Nth_scan); } } @@ -2493,10 +2507,6 @@ size_t compile_state_get_indirect_hit_groups(struct compile_state *compile_state struct maat_hit_group *group_array, size_t array_size) { - if (NULL == compile_state) { - return 0; - } - size_t i = 0; struct maat_hit_group *hit_group = NULL; for (i = 0; i < utarray_len(compile_state->indirect_hit_groups) && i < array_size; i++) { @@ -2513,21 +2523,26 @@ size_t compile_state_get_indirect_hit_groups(struct compile_state *compile_state size_t compile_state_get_indirect_hit_group_cnt(struct compile_state *compile_state) { - if (NULL == compile_state) { - return 0; + return utarray_len(compile_state->indirect_hit_groups); +} + +size_t compile_state_get_last_hit_group_id(struct compile_state *compile_state, + long long *group_id_array, + size_t array_size) +{ + size_t i = 0; + + for (i = 0; i < utarray_len(compile_state->last_hit_group_ids) && i < array_size; i++) { + group_id_array[i] = *(long long *)utarray_eltptr(compile_state->last_hit_group_ids, i); } - return utarray_len(compile_state->indirect_hit_groups); + return i; } size_t compile_state_get_direct_hit_groups(struct compile_state *compile_state, struct maat_hit_group *group_array, size_t array_size) { - if (NULL == compile_state) { - return 0; - } - UT_array *direct_hit_group = compile_state->direct_hit_groups; size_t i = 0; @@ -2546,10 +2561,6 @@ size_t compile_state_get_direct_hit_groups(struct compile_state *compile_state, size_t compile_state_get_direct_hit_group_cnt(struct compile_state *compile_state) { - if (NULL == compile_state) { - return 0; - } - return utarray_len(compile_state->direct_hit_groups); } diff --git a/test/maat_framework_gtest.cpp b/test/maat_framework_gtest.cpp index 6197943..69288a6 100644 --- a/test/maat_framework_gtest.cpp +++ b/test/maat_framework_gtest.cpp @@ -8745,6 +8745,7 @@ TEST_F(MaatCmdTest, HitGroup) { struct maat_hit_group hit_groups[128]; memset(hit_groups, 0, sizeof(hit_groups)); + size_t n_hit_group = maat_state_get_direct_hit_group_cnt(state); maat_state_get_direct_hit_groups(state, hit_groups, n_hit_group); EXPECT_EQ(n_hit_group, 1); @@ -8760,8 +8761,14 @@ TEST_F(MaatCmdTest, HitGroup) { EXPECT_EQ(hit_groups[0].group_id, group11_id); EXPECT_EQ(hit_groups[0].vtable_id, http_req_table_id); + long long last_hit_group_ids[128] = {0}; + size_t n_last_hit_group = maat_state_get_last_hit_group_ids(state, last_hit_group_ids, 128); + EXPECT_EQ(n_last_hit_group, 2); + EXPECT_EQ(last_hit_group_ids[0], group1_id); + EXPECT_EQ(last_hit_group_ids[1], group11_id); + int http_res_table_id = maat_get_table_id(maat_inst, "HTTP_RESPONSE_HEADER"); - ASSERT_GT(http_res_table_id, 0); + ASSERT_GT(http_res_table_id, 0); const char *district_str1 = "Cookie"; ret = maat_state_set_scan_district(state, http_res_table_id, district_str1, @@ -8799,6 +8806,11 @@ TEST_F(MaatCmdTest, HitGroup) { EXPECT_EQ(hit_groups[0].group_id, group21_id); EXPECT_EQ(hit_groups[0].vtable_id, http_res_table_id); + n_last_hit_group = maat_state_get_last_hit_group_ids(state, last_hit_group_ids, 128); + EXPECT_EQ(n_last_hit_group, 2); + EXPECT_EQ(last_hit_group_ids[0], group2_id); + EXPECT_EQ(last_hit_group_ids[1], group21_id); + const char* keywords1="In graph theory, hit group item forth"; const char *keywords2="To test one group hit group item fifth"; @@ -8858,6 +8870,11 @@ TEST_F(MaatCmdTest, HitGroup) { EXPECT_EQ(hit_groups[0].group_id, group1_id); EXPECT_EQ(hit_groups[0].vtable_id, keywords_table_id); //physical table(keywords_table) vtable_id is 0 + n_last_hit_group = maat_state_get_last_hit_group_ids(state, last_hit_group_ids, 128); + EXPECT_EQ(n_last_hit_group, 2); + EXPECT_EQ(last_hit_group_ids[0], group1_id); + EXPECT_EQ(last_hit_group_ids[1], group11_id); + maat_stream_free(stream); maat_state_free(state); state = NULL;