summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryangwei <[email protected]>2024-07-23 18:03:15 +0800
committeryangwei <[email protected]>2024-07-23 18:14:04 +0800
commita91425ce46fdf3459924f6463af533ac8d2f3ce0 (patch)
tree99f16c68b6cc8e3c795451715d8aaedcac88e19f
parente94c0f07702b003f6db0d57292f3200906e02bef (diff)
🐞 fix(plugin manager): forbidden exdata op in free_cb
-rw-r--r--src/plugin_manager/plugin_manager.c5
-rw-r--r--src/plugin_manager/plugin_manager_interna.h6
-rw-r--r--test/plugin_manager/plugin_manager_gtest_main.cpp13
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;
}