summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlijia <[email protected]>2021-09-13 10:24:06 +0800
committerlijia <[email protected]>2021-09-13 10:24:06 +0800
commitf0417b62929761b0694b900cbece9dba63c40eda (patch)
tree23e220cb5c1a8604b54a46a789a4c3fcef474480
parent52883a1a1c14c30c16be838b255fd4122beae9d0 (diff)
TSG-7746, 修复stream_bridge接口内存泄漏BUG.v4.2.52
-rw-r--r--src/project/stream_bridge.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/src/project/stream_bridge.c b/src/project/stream_bridge.c
index 7d3a2a7..4db7792 100644
--- a/src/project/stream_bridge.c
+++ b/src/project/stream_bridge.c
@@ -7,12 +7,12 @@ extern "C" {
#include "MESA_htable.h"
#include "MESA_list.h"
-#define STREAM_BRIDEG_MAX_NUM (128)
+#define STREAM_BRIDGE_MAX_NUM (128)
-#define STREAM_BRIDGE_MAGIC_SUCC (0x62726765)
+#define STREAM_BRIDGE_MAGIC_SUCC (0x62726765) // "brge" 十六进制
typedef struct{
- int magic_num; /* 表示当前bridge曾经注册成功过 */
+ int magic_num; /* 安全性校验, 也表示当前bridge曾经注册成功过 */
int bridge_id;
char bridge_name[NAME_MAX];
stream_bridge_free_cb_t *async_data_free_cb;
@@ -21,13 +21,13 @@ typedef struct{
struct stream_bridge_item{
long long value;
- char valid_flag; /* 用于识别初始状态值为0, 和外部调用者设置了0, 两种值相同但不同的状态 */
+ char valid_flag; /* 用于识别初始状态值为0, 和外部调用者设置了0. 两种值相同, 但是两个不同的状态 */
}__attribute__((packed, aligned(1)));
typedef struct stream_bridge_item stream_bridge_item_t;
static int g_stream_bridge_actual_num;
-static stream_bridge_manage_t g_stream_bridge_manage[STREAM_BRIDEG_MAX_NUM];
+static stream_bridge_manage_t g_stream_bridge_manage[STREAM_BRIDGE_MAX_NUM];
static MESA_htable_handle g_stream_bridge_name2id_htable;
@@ -90,7 +90,11 @@ static int stream_bridege_create_new_bridge(const char *bridge_name)
*bridge_id = g_stream_bridge_actual_num;
ret = MESA_htable_add(g_stream_bridge_name2id_htable, (const unsigned char *)bridge_name, strlen(bridge_name), (void *)bridge_id);
- assert(ret >= 0);
+ if(ret < 0){
+ free(bridge_id);
+ sapp_runtime_log(RLOG_LV_FATAL, "stream_bridge_build() error, bridge name '%s' already exist!", bridge_name);
+ return -1;
+ }
memset(&g_stream_bridge_manage[g_stream_bridge_actual_num], 0, sizeof(stream_bridge_manage_t));
g_stream_bridge_manage[g_stream_bridge_actual_num].magic_num = STREAM_BRIDGE_MAGIC_SUCC;
@@ -146,7 +150,7 @@ int stream_bridge_build(const char *bridge_name, const char *rw_mode)
{
int bridge_id;
- if(strlen(bridge_name) >= NAME_MAX){
+ if(strnlen(bridge_name, NAME_MAX+1) >= NAME_MAX){
sapp_runtime_log(RLOG_LV_FATAL, "stream_bridge_build() error, bridge name too long:%s", bridge_name);
errno = EINVAL ;
return -1;
@@ -155,9 +159,13 @@ int stream_bridge_build(const char *bridge_name, const char *rw_mode)
bridge_id = stream_bridge_name2id(bridge_name);
if(bridge_id < 0){
- if(strncasecmp(rw_mode, "r", 1) == 0){
+ if((strncasecmp(rw_mode, "r", 1) == 0) && (strnlen(rw_mode, 2) == 1)){
return -1;
- }else if(strncasecmp(rw_mode, "w", 1) == 0){
+ }else if((strncasecmp(rw_mode, "w", 1) == 0) || (strncasecmp(rw_mode, "rw", 2) == 0)){
+ if(sapp_global_val->individual_volatile->current_state >= SAPP_STATE_PROCESSING){
+ sapp_runtime_log(RLOG_LV_FATAL, "stream_bridge_build() error, can't call use write mode in processing state!");
+ return -1;
+ }
bridge_id = stream_bridege_create_new_bridge(bridge_name);
}else{
sapp_runtime_log(RLOG_LV_FATAL, "stream_bridge_build() error, unknown mode:%s", rw_mode);
@@ -173,7 +181,7 @@ int stream_bridge_register_data_sync_cb(int bridge_id, stream_bridge_sync_cb_t *
{
MESA_list_t *new_list_node;
- if((bridge_id < 0) || (bridge_id >= STREAM_BRIDEG_MAX_NUM) || (g_stream_bridge_manage[bridge_id].magic_num != STREAM_BRIDGE_MAGIC_SUCC)){
+ if((bridge_id < 0) || (bridge_id >= STREAM_BRIDGE_MAX_NUM) || (g_stream_bridge_manage[bridge_id].magic_num != STREAM_BRIDGE_MAGIC_SUCC)){
errno = EINVAL ;
return -1;
}
@@ -187,7 +195,8 @@ int stream_bridge_register_data_sync_cb(int bridge_id, stream_bridge_sync_cb_t *
int stream_bridge_register_data_free_cb(int bridge_id, stream_bridge_free_cb_t *cb_fun)
{
- if((bridge_id >= 0) || (bridge_id >= STREAM_BRIDEG_MAX_NUM) || (g_stream_bridge_manage[bridge_id].magic_num != STREAM_BRIDGE_MAGIC_SUCC)){
+ if((bridge_id < 0) || (bridge_id >= STREAM_BRIDGE_MAX_NUM) || (g_stream_bridge_manage[bridge_id].magic_num != STREAM_BRIDGE_MAGIC_SUCC)){
+ errno = EINVAL ;
return -1;
}
@@ -202,7 +211,7 @@ int stream_bridge_async_data_put(const struct streaminfo *stream, int bridge_id,
stream_bridge_item_t *bridge_item_array;
struct streaminfo_private *stream_pr;
- if((bridge_id < 0) || (bridge_id >= STREAM_BRIDEG_MAX_NUM) || (g_stream_bridge_manage[bridge_id].magic_num != STREAM_BRIDGE_MAGIC_SUCC)){
+ if((bridge_id < 0) || (bridge_id >= STREAM_BRIDGE_MAX_NUM) || (g_stream_bridge_manage[bridge_id].magic_num != STREAM_BRIDGE_MAGIC_SUCC)){
errno = EINVAL ;
return -1;
}
@@ -222,7 +231,7 @@ void *stream_bridge_async_data_get(const struct streaminfo *stream, int bridge_i
stream_bridge_item_t *bridge_item_array;
struct streaminfo_private *stream_pr;
- if((bridge_id < 0) || (bridge_id >= STREAM_BRIDEG_MAX_NUM) || (g_stream_bridge_manage[bridge_id].magic_num != STREAM_BRIDGE_MAGIC_SUCC)){
+ if((bridge_id < 0) || (bridge_id >= STREAM_BRIDGE_MAX_NUM) || (g_stream_bridge_manage[bridge_id].magic_num != STREAM_BRIDGE_MAGIC_SUCC)){
errno = EINVAL ;
return NULL;
}
@@ -245,11 +254,10 @@ void *stream_bridge_async_data_get(const struct streaminfo *stream, int bridge_i
int stream_bridge_sync_data_put(const struct streaminfo *stream, int bridge_id, void *data)
{
stream_bridge_sync_cb_t *sync_cb_fun;
- struct streaminfo_private *stream_pr;
MESA_list_t *list_node;
int callback_num = 0;
- if((bridge_id < 0) || (bridge_id >= STREAM_BRIDEG_MAX_NUM) || (g_stream_bridge_manage[bridge_id].magic_num != STREAM_BRIDGE_MAGIC_SUCC)){
+ if((bridge_id < 0) || (bridge_id >= STREAM_BRIDGE_MAX_NUM) || (g_stream_bridge_manage[bridge_id].magic_num != STREAM_BRIDGE_MAGIC_SUCC)){
errno = EINVAL ;
return -1;
}