diff --git a/standard/appspawn_appmgr.c b/standard/appspawn_appmgr.c index 7866bac892a5174e9ee938c918442b70ea58aa87..18740ea95c796a0737a7805c7bfaba1e6bb74b13 100644 --- a/standard/appspawn_appmgr.c +++ b/standard/appspawn_appmgr.c @@ -320,7 +320,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 1cb026acf8c510f4a9e5d8f6d4a99aefd832c089..3c16cb2ff448b60cc9c749ea9aa1b61bfe4571a2 100644 --- a/standard/appspawn_manager.h +++ b/standard/appspawn_manager.h @@ -187,7 +187,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 4c45e88ba46d6adc66b21979e2b34a7ac4693af7..34d7d8eb59477766da1cd6e78f05528e5105cedc 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 5fb55e3cd672557fcfbecb5c80c1099e00056abe..8ca1bb109ff7b7413c307f46734eca786b63db6d 100644 --- a/standard/appspawn_service.c +++ b/standard/appspawn_service.c @@ -260,7 +260,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); @@ -314,7 +314,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); } @@ -498,7 +498,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); @@ -945,7 +945,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; } @@ -960,7 +960,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; } @@ -1260,7 +1260,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; } @@ -1432,7 +1432,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; @@ -1443,18 +1443,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) @@ -1587,14 +1587,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; @@ -1624,7 +1624,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; } @@ -1803,7 +1803,7 @@ APPSPAWN_STATIC void ProcessObserveProcessSignalMsg(AppSpawnConnection *connecti if (fd <= 0 || ret != 0) { APPSPAWN_LOGE("Spawn Listen appspawn signal fd get unsuccess"); SendResponse(connection, &message->msgHeader, APPSPAWN_SYSTEM_ERROR, 0); - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); return; } @@ -1812,7 +1812,7 @@ APPSPAWN_STATIC void ProcessObserveProcessSignalMsg(AppSpawnConnection *connecti content->signalFd = fd; connection->receiverCtx.fdCount = 0; SendResponse(connection, &message->msgHeader, 0, 0); - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); } static void ProcessRecvMsg(AppSpawnConnection *connection, AppSpawnMsgNode *message) @@ -1830,7 +1830,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 @@ -1841,7 +1841,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); @@ -1850,7 +1850,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); @@ -1862,7 +1862,7 @@ 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); @@ -1870,14 +1870,14 @@ static void ProcessRecvMsg(AppSpawnConnection *connection, AppSpawnMsgNode *mess case MSG_LOCK_STATUS: ProcessAppSpawnLockStatusMsg(message); SendResponse(connection, msg, 0, 0); - DeleteAppSpawnMsg(message); + DeleteAppSpawnMsg(&message); break; case MSG_OBSERVE_PROCESS_SIGNAL_STATUS: ProcessObserveProcessSignalMsg(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 64787af2ffeaf62a82edc1cd27f82126ceeee702..b154d78fdecaf67458f45ed6382ba13ca630da3f 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) @@ -514,7 +514,7 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsgNode_005, TestSize.Level0) ret = ProcessTerminationStatusMsg(nullptr, nullptr); EXPECT_NE(0, ret); - DeleteAppSpawnMsg(outMsg); + DeleteAppSpawnMsg(&outMsg); DeleteAppSpawnMgr(mgr); } @@ -550,7 +550,7 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsgNode_006, TestSize.Level0) ret = ProcessTerminationStatusMsg(outMsg, &result); EXPECT_EQ(0, ret); - DeleteAppSpawnMsg(outMsg); + DeleteAppSpawnMsg(&outMsg); DeleteAppSpawnMgr(mgr); } @@ -582,7 +582,7 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsgNode_007, TestSize.Level0) ret = ProcessTerminationStatusMsg(outMsg, &result); EXPECT_EQ(0, ret); - DeleteAppSpawnMsg(outMsg); + DeleteAppSpawnMsg(&outMsg); DeleteAppSpawnMgr(mgr); } @@ -615,10 +615,24 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsgNode_008, TestSize.Level0) outMsg->tlvOffset = nullptr; ProcessAppSpawnDumpMsg(outMsg); - 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); + msgNode = CreateAppSpawnMsg(); + EXPECT_NE(msgNode, NULL); + DeleteAppSpawnMsg(&msgNode); + EXPECT_EQ(msgNode, NULL); + DeleteAppSpawnMsg(nullptr); +} /** * @brief 消息内容操作接口 * @@ -658,7 +672,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); } @@ -725,7 +739,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); } @@ -780,7 +794,7 @@ HWTEST_F(AppSpawnAppMgrTest, App_Spawn_AppSpawnMsg_003, TestSize.Level0) EXPECT_EQ(0, ret); } } - DeleteAppSpawnMsg(outMsg); + DeleteAppSpawnMsg(&outMsg); DeleteAppSpawnMgr(mgr); } @@ -810,7 +824,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 4751384f674064d967eecbad4776841b92a630b4..49802175e391ccd22730949ffd0265e47e6e5ccc 100644 --- a/test/unittest/app_spawn_test_helper.cpp +++ b/test/unittest/app_spawn_test_helper.cpp @@ -563,7 +563,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; @@ -577,10 +577,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();