diff --git a/standard/appspawn_appmgr.c b/standard/appspawn_appmgr.c index cbd6448534255029af5b304441e9096be726ca6b..b90d8642adfc51ea54b0f82ddd23436da0dd49e7 100644 --- a/standard/appspawn_appmgr.c +++ b/standard/appspawn_appmgr.c @@ -311,7 +311,7 @@ void DeleteAppSpawningCtx(AppSpawningCtx *property) APPSPAWN_CHECK_ONLY_EXPER(property != NULL, return); APPSPAWN_LOGV("DeleteAppSpawningCtx"); - DeleteAppSpawnMsg(property->message); + DeleteAppSpawnMsg(&property->message); OH_ListRemove(&property->node); if (property->forkCtx.timer) { diff --git a/standard/appspawn_manager.h b/standard/appspawn_manager.h index 5c5280ac950208248313a009b6dcbf2d661b1763..f4f157f153ed016ec1e4e78f8ce6808ac9999904 100644 --- a/standard/appspawn_manager.h +++ b/standard/appspawn_manager.h @@ -167,7 +167,7 @@ void ProcessAppSpawnDumpMsg(const AppSpawnMsgNode *message); int ProcessTerminationStatusMsg(const AppSpawnMsgNode *message, AppSpawnResult *result); AppSpawnMsgNode *CreateAppSpawnMsg(void); -void DeleteAppSpawnMsg(AppSpawnMsgNode *msgNode); +void DeleteAppSpawnMsg(AppSpawnMsgNode **msgNode); int CheckAppSpawnMsg(const AppSpawnMsgNode *message); int DecodeAppSpawnMsg(AppSpawnMsgNode *message); int GetAppSpawnMsgFromBuffer(const uint8_t *buffer, uint32_t bufferLen, diff --git a/standard/appspawn_msgmgr.c b/standard/appspawn_msgmgr.c index cf8f4479bde07912a8e64cbcf06a37486e1a58f6..35567e3a402250d29f4f10f20c5d0e8fb82f648c 100644 --- a/standard/appspawn_msgmgr.c +++ b/standard/appspawn_msgmgr.c @@ -100,20 +100,21 @@ AppSpawnMsgNode *CreateAppSpawnMsg(void) return message; } -void DeleteAppSpawnMsg(AppSpawnMsgNode *msgNode) +void DeleteAppSpawnMsg(AppSpawnMsgNode **msgNode) { - if (msgNode == NULL) { + if (msgNode == NULL || *msgNode == NULL) { return; } - if (msgNode->buffer) { - free(msgNode->buffer); - msgNode->buffer = NULL; + if ((*msgNode)->buffer) { + free((*msgNode)->buffer); + (*msgNode)->buffer = NULL; } - if (msgNode->tlvOffset) { - free(msgNode->tlvOffset); - msgNode->tlvOffset = NULL; + if ((*msgNode)->tlvOffset) { + free((*msgNode)->tlvOffset); + (*msgNode)->tlvOffset = NULL; } - free(msgNode); + free(*msgNode); + *msgNode = NULL; } static inline int CheckRecvMsg(const AppSpawnMsg *msg) @@ -157,19 +158,19 @@ AppSpawnMsgNode *RebuildAppSpawnMsgNode(AppSpawnMsgNode *message, AppSpawnedProc AppSpawnMsgNode *node = CreateAppSpawnMsg(); APPSPAWN_CHECK(node != NULL, return NULL, "Failed to create AppSpawnMsgNode"); int ret = memcpy_s(&node->msgHeader, sizeof(AppSpawnMsg), &message->msgHeader, sizeof(AppSpawnMsg)); - APPSPAWN_CHECK(ret == 0, DeleteAppSpawnMsg(node); return NULL, "Failed to memcpy_s node->msgHeader"); + APPSPAWN_CHECK(ret == 0, DeleteAppSpawnMsg(&node); return NULL, "Failed to memcpy_s node->msgHeader"); bufferLen = message->msgHeader.msgLen + appInfo->message->msgHeader.msgLen - sizeof(AppSpawnMsg); node->msgHeader.msgLen = bufferLen; node->msgHeader.msgType = MSG_SPAWN_NATIVE_PROCESS; node->msgHeader.tlvCount += message->msgHeader.tlvCount; ret = AppSpawnMsgRebuild(node, &node->msgHeader); - APPSPAWN_CHECK(ret == 0, DeleteAppSpawnMsg(node); return NULL, "Failed to alloc memory for recv message"); + APPSPAWN_CHECK(ret == 0, DeleteAppSpawnMsg(&node); return NULL, "Failed to alloc memory for recv message"); uint32_t appInfoBufLen = appInfo->message->msgHeader.msgLen - sizeof(AppSpawnMsg); uint32_t msgBufLen = message->msgHeader.msgLen - sizeof(AppSpawnMsg); ret = memcpy_s(node->buffer, bufferLen, appInfo->message->buffer, appInfoBufLen); - APPSPAWN_CHECK(ret == 0, DeleteAppSpawnMsg(node); return NULL, "Failed to memcpy_s appInfo buffer"); + APPSPAWN_CHECK(ret == 0, DeleteAppSpawnMsg(&node); return NULL, "Failed to memcpy_s appInfo buffer"); ret = memcpy_s(node->buffer + appInfoBufLen, bufferLen - appInfoBufLen, message->buffer, msgBufLen); - APPSPAWN_CHECK(ret == 0, DeleteAppSpawnMsg(node); return NULL, "Failed to memcpy_s message->buffer"); + APPSPAWN_CHECK(ret == 0, DeleteAppSpawnMsg(&node); return NULL, "Failed to memcpy_s message->buffer"); return node; #endif return NULL; diff --git a/standard/appspawn_service.c b/standard/appspawn_service.c index 21bcf574f6014981f93b863cd3656b77b989f85d..4aeb7b32383a4e075057aee42cbfd908a829b30a 100644 --- a/standard/appspawn_service.c +++ b/standard/appspawn_service.c @@ -226,7 +226,7 @@ static void OnClose(const TaskHandle taskHandle) } APPSPAWN_LOGI("OnClose connectionId: %{public}u socket %{public}d", connection->connectionId, LE_GetSocketFd(taskHandle)); - DeleteAppSpawnMsg(connection->receiverCtx.incompleteMsg); + DeleteAppSpawnMsg(&connection->receiverCtx.incompleteMsg); connection->receiverCtx.incompleteMsg = NULL; // connect close, to close spawning app AppSpawningCtxTraversal(AppSpawningCtxOnClose, connection); @@ -280,7 +280,7 @@ static void WaitMsgCompleteTimeOut(const TimerHandle taskHandle, void *context) { AppSpawnConnection *connection = (AppSpawnConnection *)context; APPSPAWN_LOGE("Long time no msg complete so close connectionId: %{public}u", connection->connectionId); - DeleteAppSpawnMsg(connection->receiverCtx.incompleteMsg); + DeleteAppSpawnMsg(&connection->receiverCtx.incompleteMsg); connection->receiverCtx.incompleteMsg = NULL; LE_CloseStreamTask(LE_GetDefaultLoop(), connection->stream); } @@ -463,7 +463,7 @@ static void OnReceiveRequest(const TaskHandle taskHandle, const uint8_t *buffer, } while (reminder > 0); if (message) { - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); } if (ret != 0) { LE_CloseTask(LE_GetDefaultLoop(), taskHandle); @@ -879,7 +879,7 @@ static void ProcessSpawnReqMsg(AppSpawnConnection *connection, AppSpawnMsgNode * int ret = CheckAppSpawnMsg(message); if (ret != 0) { SendResponse(connection, &message->msgHeader, ret, 0); - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); return; } @@ -894,7 +894,7 @@ static void ProcessSpawnReqMsg(AppSpawnConnection *connection, AppSpawnMsgNode * AppSpawningCtx *property = CreateAppSpawningCtx(); if (property == NULL) { SendResponse(connection, &message->msgHeader, APPSPAWN_SYSTEM_ERROR, 0); - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); return; } @@ -1209,7 +1209,7 @@ static AppSpawningCtx *GetAppSpawningCtxFromArg(AppSpawnMgr *content, int argc, return property; } NotifyResToParent(&content->content, &property->client, APPSPAWN_MSG_INVALID); - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); DeleteAppSpawningCtx(property); return NULL; } @@ -1381,7 +1381,7 @@ static AppSpawnMsgNode *ProcessSpawnBegetctlMsg(AppSpawnConnection *connection, APPSPAWN_CHECK(msgNode != NULL, return NULL, "Failed to rebuild app message node"); int ret = DecodeAppSpawnMsg(msgNode); if (ret != 0) { - DeleteAppSpawnMsg(msgNode); + DeleteAppSpawnMsg(&msgNode); return NULL; } return msgNode; @@ -1392,18 +1392,18 @@ static void ProcessBegetCmdMsg(AppSpawnConnection *connection, AppSpawnMsgNode * AppSpawnMsg *msg = &message->msgHeader; if (!IsDeveloperModeOpen()) { SendResponse(connection, msg, APPSPAWN_DEBUG_MODE_NOT_SUPPORT, 0); - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); return; } AppSpawnMsgNode *msgNode = ProcessSpawnBegetctlMsg(connection, message); if (msgNode == NULL) { SendResponse(connection, msg, APPSPAWN_DEBUG_MODE_NOT_SUPPORT, 0); - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); return; } ProcessSpawnReqMsg(connection, msgNode); - DeleteAppSpawnMsg(message); - DeleteAppSpawnMsg(msgNode); + DeleteAppSpawnMsg(&message); + DeleteAppSpawnMsg(&msgNode); } static int GetArkWebInstallPath(const char *key, char *value) @@ -1490,14 +1490,14 @@ static void ProcessSpawnRestartMsg(AppSpawnConnection *connection, AppSpawnMsgNo AppSpawnContent *content = GetAppSpawnContent(); if (!IsNWebSpawnMode((AppSpawnMgr *)content)) { SendResponse(connection, &message->msgHeader, APPSPAWN_MSG_INVALID, 0); - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); APPSPAWN_LOGE("Restart msg only support nwebspawn"); return; } TraversalSpawnedProcess(AppQueueDestroyProc, NULL); SendResponse(connection, &message->msgHeader, 0, 0); - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); (void) ServerStageHookExecute(STAGE_SERVER_EXIT, content); errno = 0; @@ -1527,7 +1527,7 @@ APPSPAWN_STATIC void ProcessUninstallDebugHap(AppSpawnConnection *connection, Ap AppSpawningCtx *property = CreateAppSpawningCtx(); if (property == NULL) { SendResponse(connection, &message->msgHeader, APPSPAWN_SYSTEM_ERROR, 0); - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); return; } @@ -1637,7 +1637,7 @@ static void ProcessRecvMsg(AppSpawnConnection *connection, AppSpawnMsgNode *mess AppSpawnResult result = {0}; ret = ProcessTerminationStatusMsg(message, &result); SendResponse(connection, msg, ret == 0 ? result.result : ret, result.pid); - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); break; } case MSG_SPAWN_NATIVE_PROCESS: // spawn msg @@ -1648,7 +1648,7 @@ static void ProcessRecvMsg(AppSpawnConnection *connection, AppSpawnMsgNode *mess case MSG_DUMP: ProcessAppSpawnDumpMsg(message); SendResponse(connection, msg, 0, 0); - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); break; case MSG_BEGET_CMD: { ProcessBegetCmdMsg(connection, message); @@ -1657,7 +1657,7 @@ static void ProcessRecvMsg(AppSpawnConnection *connection, AppSpawnMsgNode *mess case MSG_BEGET_SPAWNTIME: SendResponse(connection, msg, GetAppSpawnMgr()->spawnTime.minAppspawnTime, GetAppSpawnMgr()->spawnTime.maxAppspawnTime); - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); break; case MSG_UPDATE_MOUNT_POINTS: ret = ProcessSpawnRemountMsg(connection, message); @@ -1669,14 +1669,14 @@ static void ProcessRecvMsg(AppSpawnConnection *connection, AppSpawnMsgNode *mess case MSG_DEVICE_DEBUG: ret = ProcessAppSpawnDeviceDebugMsg(message); SendResponse(connection, msg, ret, 0); - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); break; case MSG_UNINSTALL_DEBUG_HAP: ProcessUninstallDebugHap(connection, message); break; default: SendResponse(connection, msg, APPSPAWN_MSG_INVALID, 0); - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); break; } } diff --git a/test/unittest/app_spawn_standard_test/app_spawn_appmgr_test.cpp b/test/unittest/app_spawn_standard_test/app_spawn_appmgr_test.cpp index 15fe7c13515e03d88f0eee42d564a43cbd93c1ca..9369a020c4d2fc6ce83ac50b1cddfd809f563ea8 100644 --- a/test/unittest/app_spawn_standard_test/app_spawn_appmgr_test.cpp +++ b/test/unittest/app_spawn_standard_test/app_spawn_appmgr_test.cpp @@ -307,7 +307,7 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsgNode_001, TestSize.Level0) EXPECT_NE(0, ret); // check fail // delete - DeleteAppSpawnMsg(msgNode); + DeleteAppSpawnMsg(&msgNode); DeleteAppSpawnMsg(nullptr); // get from buffer @@ -327,7 +327,7 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsgNode_001, TestSize.Level0) ret = GetAppSpawnMsgFromBuffer(inputBuffer[i], buffer.size(), &outMsg, inputMsgLen[j], inputReminder[k]); EXPECT_EQ(ret == 0, result[i * inputCount * inputCount + j * inputCount + k]); // check fail - DeleteAppSpawnMsg(outMsg); + DeleteAppSpawnMsg(&outMsg); } } } @@ -394,7 +394,7 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsgNode_002, TestSize.Level0) EXPECT_EQ(msgLen, msgRecvLen); EXPECT_EQ(memcmp(buffer.data() + sizeof(AppSpawnMsg), outMsg->buffer, msgLen - sizeof(AppSpawnMsg)), 0); EXPECT_EQ(sizeof(AppSpawnMsg), reminder); - DeleteAppSpawnMsg(outMsg); + DeleteAppSpawnMsg(&outMsg); } HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsgNode_003, TestSize.Level0) @@ -423,7 +423,7 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsgNode_003, TestSize.Level0) EXPECT_EQ(0, ret); ret = CheckAppSpawnMsg(outMsg); EXPECT_EQ(0, ret); - DeleteAppSpawnMsg(outMsg); + DeleteAppSpawnMsg(&outMsg); } HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsgNode_004, TestSize.Level0) @@ -449,7 +449,7 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsgNode_004, TestSize.Level0) EXPECT_EQ(0, ret); ret = CheckAppSpawnMsg(outMsg); EXPECT_NE(0, ret); - DeleteAppSpawnMsg(outMsg); + DeleteAppSpawnMsg(&outMsg); } static int AddRenderTerminationTlv(uint8_t *buffer, uint32_t bufferLen, uint32_t &realLen, uint32_t &tlvCount) @@ -511,7 +511,7 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsgNode_005, TestSize.Level0) ret = ProcessTerminationStatusMsg(nullptr, nullptr); EXPECT_NE(0, ret); - DeleteAppSpawnMsg(outMsg); + DeleteAppSpawnMsg(&outMsg); DeleteAppSpawnMgr(mgr); } @@ -547,7 +547,7 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsgNode_006, TestSize.Level0) ret = ProcessTerminationStatusMsg(outMsg, &result); EXPECT_EQ(0, ret); - DeleteAppSpawnMsg(outMsg); + DeleteAppSpawnMsg(&outMsg); DeleteAppSpawnMgr(mgr); } @@ -579,7 +579,7 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsgNode_007, TestSize.Level0) ret = ProcessTerminationStatusMsg(outMsg, &result); EXPECT_EQ(0, ret); - DeleteAppSpawnMsg(outMsg); + DeleteAppSpawnMsg(&outMsg); DeleteAppSpawnMgr(mgr); } @@ -610,10 +610,27 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsgNode_008, TestSize.Level0) ProcessAppSpawnDumpMsg(outMsg); ProcessAppSpawnDumpMsg(nullptr); - DeleteAppSpawnMsg(outMsg); + DeleteAppSpawnMsg(&outMsg); DeleteAppSpawnMgr(mgr); } +HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsgNode_009, TestSize.Level0) +{ + AppSpawnMsgNode *msgNode = CreateAppSpawnMsg(); + msgNode->buffer = static_cast(malloc(255));; + msgNode->tlvOffset = static_cast(malloc(128)); + EXPECT_EQ(msgNode != nullptr, 1); + DeleteAppSpawnMsg(&msgNode); + EXPECT_EQ(msgNode, NULL); + DeleteAppSpawnMsg(&msgNode); + EXPECT_EQ(msgNode, NULL); + msgNode = CreateAppSpawnMsg(); + EXPECT_NE(msgNode, NULL); + DeleteAppSpawnMsg(&msgNode); + EXPECT_EQ(msgNode, NULL); + DeleteAppSpawnMsg(nullptr); +} + /** * @brief 消息内容操作接口 * @@ -653,7 +670,7 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsg_001, TestSize.Level0) void *info = GetAppSpawnMsgInfo(nullptr, i); EXPECT_EQ(info == nullptr, 1); } - DeleteAppSpawnMsg(outMsg); + DeleteAppSpawnMsg(&outMsg); DeleteAppSpawnMgr(mgr); } @@ -720,7 +737,7 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsg_002, TestSize.Level0) void *info = GetAppSpawnMsgExtInfo(nullptr, inputName[i], &len); EXPECT_EQ(info == nullptr, 1); } - DeleteAppSpawnMsg(outMsg); + DeleteAppSpawnMsg(&outMsg); DeleteAppSpawnMgr(mgr); } @@ -775,7 +792,7 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsg_003, TestSize.Level0) EXPECT_EQ(0, ret); } } - DeleteAppSpawnMsg(outMsg); + DeleteAppSpawnMsg(&outMsg); DeleteAppSpawnMgr(mgr); } @@ -805,7 +822,7 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsg_004, TestSize.Level0) // dump msg DumpAppSpawnMsg(outMsg); DumpAppSpawnMsg(nullptr); - DeleteAppSpawnMsg(outMsg); + DeleteAppSpawnMsg(&outMsg); DeleteAppSpawnMgr(mgr); } diff --git a/test/unittest/app_spawn_test_helper.cpp b/test/unittest/app_spawn_test_helper.cpp index 2e0c18767d51a0335fea73e60cc3703c1cdd6cfa..b4063d32e3219115f8d8f79f9157b5690f0b8663 100644 --- a/test/unittest/app_spawn_test_helper.cpp +++ b/test/unittest/app_spawn_test_helper.cpp @@ -562,7 +562,7 @@ AppSpawningCtx *AppSpawnTestHelper::GetAppProperty(AppSpawnClientHandle handle, block->buffer + bufferStart, block->currentIndex - bufferStart); if (ret != 0) { AppSpawnReqMsgFree(reqHandle); - DeleteAppSpawnMsg(msgNode); + DeleteAppSpawnMsg(&msgNode); return nullptr; } currIndex += block->currentIndex - bufferStart; @@ -576,10 +576,10 @@ AppSpawningCtx *AppSpawnTestHelper::GetAppProperty(AppSpawnClientHandle handle, // delete reqHandle AppSpawnReqMsgFree(reqHandle); int ret = DecodeAppSpawnMsg(msgNode); - APPSPAWN_CHECK(ret == 0, DeleteAppSpawnMsg(msgNode); + APPSPAWN_CHECK(ret == 0, DeleteAppSpawnMsg(&msgNode); return nullptr, "Decode msg fail"); AppSpawningCtx *property = CreateAppSpawningCtx(); - APPSPAWN_CHECK_ONLY_EXPER(property != nullptr, DeleteAppSpawnMsg(msgNode); + APPSPAWN_CHECK_ONLY_EXPER(property != nullptr, DeleteAppSpawnMsg(&msgNode); return nullptr); property->message = msgNode; SetDefaultTestData();