diff options
| author | yangwei <[email protected]> | 2024-07-23 18:03:15 +0800 |
|---|---|---|
| committer | yangwei <[email protected]> | 2024-07-23 18:14:04 +0800 |
| commit | a91425ce46fdf3459924f6463af533ac8d2f3ce0 (patch) | |
| tree | 99f16c68b6cc8e3c795451715d8aaedcac88e19f | |
| parent | e94c0f07702b003f6db0d57292f3200906e02bef (diff) | |
🐞 fix(plugin manager): forbidden exdata op in free_cb
| -rw-r--r-- | src/plugin_manager/plugin_manager.c | 5 | ||||
| -rw-r--r-- | src/plugin_manager/plugin_manager_interna.h | 6 | ||||
| -rw-r--r-- | test/plugin_manager/plugin_manager_gtest_main.cpp | 13 |
3 files changed, 18 insertions, 6 deletions
diff --git a/src/plugin_manager/plugin_manager.c b/src/plugin_manager/plugin_manager.c index 7ab8f99..a1c1d84 100644 --- a/src/plugin_manager/plugin_manager.c +++ b/src/plugin_manager/plugin_manager.c @@ -231,6 +231,7 @@ int stellar_exdata_set(UT_array *exdata_schema, struct stellar_exdata *exdata_ar if(exdata_schema == NULL|| exdata_array == NULL)return -1; unsigned int len=utarray_len(exdata_schema); if(len < (unsigned int)idx)return -1; + if((exdata_array+idx)->state == EXIT)return -1; (exdata_array+idx)->exdata=ex_ptr; return 0; } @@ -240,6 +241,7 @@ void *stellar_exdata_get(UT_array *exdata_schema, struct stellar_exdata *exdata_ if(exdata_schema == NULL|| exdata_array == NULL)return NULL; unsigned int len = utarray_len(exdata_schema); if(len < (unsigned int)idx)return NULL; + if((exdata_array+idx)->state == EXIT)return NULL; return (exdata_array+idx)->exdata; } @@ -267,6 +269,7 @@ static void per_thread_packet_exdata_arrary_clean(struct plugin_manager_schema * for (unsigned int i = 0; i < len; i++) { void *exdata = (per_thread_pkt_exdata_arrary + i)->exdata; + (per_thread_pkt_exdata_arrary + i)->state=EXIT; struct stellar_exdata_schema *schema = (struct stellar_exdata_schema *)utarray_eltptr(plug_mgr->packet_exdata_schema_array, i); if (exdata) { @@ -276,6 +279,7 @@ static void per_thread_packet_exdata_arrary_clean(struct plugin_manager_schema * } (per_thread_pkt_exdata_arrary + i)->exdata=NULL; } + (per_thread_pkt_exdata_arrary + i)->state=INIT; } } @@ -847,6 +851,7 @@ static void session_exdata_runtime_free(struct plugin_manager_schema *plug_mgr, for (unsigned int i = 0; i < len; i++) { void *exdata = (exdata_rt + i)->exdata; + (exdata_rt + i)->state=EXIT; struct stellar_exdata_schema *schema = (struct stellar_exdata_schema *)utarray_eltptr(plug_mgr->session_exdata_schema_array, i); if (exdata) { diff --git a/src/plugin_manager/plugin_manager_interna.h b/src/plugin_manager/plugin_manager_interna.h index abb2e5d..6ea3804 100644 --- a/src/plugin_manager/plugin_manager_interna.h +++ b/src/plugin_manager/plugin_manager_interna.h @@ -53,10 +53,13 @@ struct plugin_manager_schema struct plugin_manger_per_thread_data *per_thread_data; }__attribute__((aligned(sizeof(void*)))); +enum plugin_exdata_state +{ INIT, ACTIVE, EXIT }; struct stellar_exdata { void *exdata; + enum plugin_exdata_state state; }; @@ -124,8 +127,7 @@ struct stellar_mq_topic_schema struct stellar_mq_subscriber *subscribers; }__attribute__((aligned(sizeof(void*)))); -enum plugin_exdata_state -{ INIT, ACTIVE, EXIT }; + struct session_plugin_ctx_runtime { diff --git a/test/plugin_manager/plugin_manager_gtest_main.cpp b/test/plugin_manager/plugin_manager_gtest_main.cpp index 90c3bf1..3282625 100644 --- a/test/plugin_manager/plugin_manager_gtest_main.cpp +++ b/test/plugin_manager/plugin_manager_gtest_main.cpp @@ -389,6 +389,9 @@ static void test_packet_exdata_free(struct packet *pkt, int idx, void *ex_ptr, v EXPECT_EQ(*(long long *)ex_ptr, idx); FREE(ex_ptr); env->exdata_free_called[idx]+=1; + + EXPECT_EQ((long)packet_exdata_get(pkt, idx), NULL);// illegal get in exdata_free callback + EXPECT_EQ(packet_exdata_set(pkt, idx, pkt), -1);// illegal set in exdata_free callback return; } @@ -687,7 +690,7 @@ static void test_exdata_free_pub_msg_exdata_free(struct packet *pkt, int idx, vo EXPECT_EQ(env->packet_exdata_idx[idx], idx); EXPECT_EQ(ex_ptr, pkt); env->exdata_free_called[idx]+=1; - EXPECT_EQ(packet_mq_publish_message(pkt, env->packet_topic_id[0], pkt), 0 );// publish message in packet exdata_free is ok + EXPECT_EQ(packet_mq_publish_message(pkt, env->packet_topic_id[0], pkt), -1);// publish message in packet exdata_free is illegal env->msg_pub_cnt+=1; return; } @@ -745,9 +748,9 @@ TEST(plugin_manager, packet_plugin_exdata_free_pub_msg) { plugin_manager_exit(plug_mgr); EXPECT_EQ(env.basic_on_packet_called, 1); - EXPECT_EQ(env.msg_pub_cnt, env.msg_sub_cnt); - EXPECT_EQ(env.msg_pub_cnt, env.msg_free_cnt); - EXPECT_EQ(env.msg_free_cnt, 1); + EXPECT_EQ(env.msg_pub_cnt, 1); + EXPECT_EQ(env.msg_sub_cnt, 0); + EXPECT_EQ(env.msg_free_cnt, 0); EXPECT_EQ(env.exdata_free_called[0], 1); } @@ -1034,6 +1037,8 @@ static void test_basic_session_exdata_free(struct session *sess, int idx, void * struct session_plugin_env *env = (struct session_plugin_env *)arg; EXPECT_EQ(env->basic_exdata_idx, idx); EXPECT_EQ(ex_ptr, env); + EXPECT_EQ((long)session_exdata_get(sess, idx), NULL);// illegal get in exdata_free callback + EXPECT_EQ(session_exdata_set(sess, idx, arg), -1);// illegal set in exdata_free callback env->basic_exdata_free_called+=1; } |
