From 314328c0024e7feaed0a4bd8127245fab85f7cdf Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Sun, 17 Sep 2023 01:21:59 +0800 Subject: [PATCH] fix: properly releasing C memory to avoid double-freeing --- c_wrapper/export.go | 18 +++++++++--------- c_wrapper/protocol.go | 40 +++++++++++++++++++++++++++++++++++----- c_wrapper/test.c | 7 ++++--- 3 files changed, 48 insertions(+), 17 deletions(-) diff --git a/c_wrapper/export.go b/c_wrapper/export.go index 2742844..ca3209a 100644 --- a/c_wrapper/export.go +++ b/c_wrapper/export.go @@ -294,40 +294,40 @@ func NewUserCallback(cCallback C.CB_I_S) *UserCallback { type SendMessageCallback struct { cCallback C.CB_S_I_S_S_I - operationID *C.char + operationID string } func NewSendMessageCallback(cCallback C.CB_S_I_S_S_I, operationID *C.char) *SendMessageCallback { - return &SendMessageCallback{cCallback: cCallback, operationID: operationID} + return &SendMessageCallback{cCallback: cCallback, operationID: C.GoString(operationID)} } func (s SendMessageCallback) OnError(errCode int32, errMsg string) { - C.Call_CB_S_I_S_S_I(s.cCallback, s.operationID, C.int(errCode), C.CString(errMsg), NO_DATA, NO_PROGRESS) + C.Call_CB_S_I_S_S_I(s.cCallback, C.CString(s.operationID), C.int(errCode), C.CString(errMsg), NO_DATA, NO_PROGRESS) } func (s SendMessageCallback) OnSuccess(data string) { - C.Call_CB_S_I_S_S_I(s.cCallback, s.operationID, NO_ERR, NO_ERR_MSG, C.CString(data), NO_PROGRESS) + C.Call_CB_S_I_S_S_I(s.cCallback, C.CString(s.operationID), NO_ERR, NO_ERR_MSG, C.CString(data), NO_PROGRESS) } func (s SendMessageCallback) OnProgress(progress int) { - C.Call_CB_S_I_S_S_I(s.cCallback, s.operationID, NO_ERR, NO_ERR_MSG, NO_DATA, C.int(progress)) + C.Call_CB_S_I_S_S_I(s.cCallback, C.CString(s.operationID), NO_ERR, NO_ERR_MSG, NO_DATA, C.int(progress)) } type BaseCallback struct { cCallback C.CB_S_I_S_S - operationID *C.char + operationID string } func NewBaseCallback(cCallback C.CB_S_I_S_S, operationID *C.char) *BaseCallback { - return &BaseCallback{cCallback: cCallback, operationID: operationID} + return &BaseCallback{cCallback: cCallback, operationID: C.GoString(operationID)} } func (b BaseCallback) OnError(errCode int32, errMsg string) { - C.Call_CB_S_I_S_S(b.cCallback, b.operationID, C.int(errCode), C.CString(errMsg), NO_DATA) + C.Call_CB_S_I_S_S(b.cCallback, C.CString(b.operationID), C.int(errCode), C.CString(errMsg), NO_DATA) } func (b BaseCallback) OnSuccess(data string) { - C.Call_CB_S_I_S_S(b.cCallback, b.operationID, NO_ERR, NO_ERR_MSG, C.CString(data)) + C.Call_CB_S_I_S_S(b.cCallback, C.CString(b.operationID), NO_ERR, NO_ERR_MSG, C.CString(data)) } // =====================================================global_callback=============================================== diff --git a/c_wrapper/protocol.go b/c_wrapper/protocol.go index 8e13b6b..6047d88 100644 --- a/c_wrapper/protocol.go +++ b/c_wrapper/protocol.go @@ -10,19 +10,49 @@ typedef void (*CB_S_I_S_S_I)(char *,int,char *,char *,int); void Call_CB_I_S(CB_I_S func,int event,char* data) { func(event,data); - free(data); + if (data != NULL && data[0] != '\0') + { + printf("this is not null data event\n"); + free(data); + } } void Call_CB_S_I_S_S(CB_S_I_S_S func,char* operationID, int errCode,char* errMsg,char* data) { func(operationID,errCode,errMsg,data); - free(errMsg); - free(data); + if (errMsg != NULL && errMsg[0] != '\0') + { + printf("this is not null errmsg\n"); + free(errMsg); + } + if (data != NULL && data[0] != '\0') + { + printf("this is not null data base,opid:%s,data:%s\n",operationID,data); + free(data); + } + if (operationID != NULL) + { + printf("this is not null operationID:%s\n",operationID); + free(operationID); + } } void Call_CB_S_I_S_S_I(CB_S_I_S_S_I func,char* operationID,int errCode,char* errMsg,char* data,int progress) { func(operationID,errCode,errMsg,data,progress); - free(errMsg); - free(data); + if (errMsg != NULL && errMsg[0] != '\0') + { + printf("this is not null errmsg\n"); + free(errMsg); + } + if (data != NULL && data[0] != '\0') + { + printf("this is not null data\n"); + free(data); + } + if (operationID != NULL) + { + printf("this is not null operationID\n"); + free(operationID); + } } enum CONN_EVENT{ CONNECTING, diff --git a/c_wrapper/test.c b/c_wrapper/test.c index ac28edd..9b75e4f 100644 --- a/c_wrapper/test.c +++ b/c_wrapper/test.c @@ -46,10 +46,11 @@ int main(int argc, char **argv) char* loginUserID=get_login_user(); printf("return :%s\n",loginUserID); - - char* message = create_text_message(operationID,"哈哈"); + char operationID1[] = "12345,create"; + char *message = create_text_message(operationID1, "哈哈"); printf("return :%s\n",message); - get_all_conversation_list(c_base_callback,operationID); + char operationID2[] = "12345,get_all_conversation_list"; + get_all_conversation_list(c_base_callback, operationID2); sleep(1000000); return 0;