From 788c7556b95b27addba7af46ec7dbf14ebc104bb Mon Sep 17 00:00:00 2001 From: wangfenging Date: Tue, 9 Sep 2025 17:30:51 +0800 Subject: [PATCH] Fix:close child process socket fds Signed-off-by: wangfenging --- standard/appspawn_service.c | 40 +++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/standard/appspawn_service.c b/standard/appspawn_service.c index 179c5a59..c0f79000 100644 --- a/standard/appspawn_service.c +++ b/standard/appspawn_service.c @@ -223,17 +223,23 @@ static void AppSpawningCtxOnClose(const AppSpawnMgr *mgr, AppSpawningCtx *ctx, v static void OnClose(const TaskHandle taskHandle) { + int fd = LE_GetSocketFd(taskHandle); + APPSPAWN_LOGV("OnClose socket fd %{public}d", fd); if (!IsSpawnServer(GetAppSpawnMgr())) { + if (fd > 0) { + close(fd); + fd = -1; + } return; } + AppSpawnConnection *connection = (AppSpawnConnection *)LE_GetUserData(taskHandle); APPSPAWN_CHECK(connection != NULL, return, "Invalid connection"); if (connection->receiverCtx.timer) { LE_StopTimer(LE_GetDefaultLoop(), connection->receiverCtx.timer); connection->receiverCtx.timer = NULL; } - APPSPAWN_LOGI("OnClose connectionId: %{public}u socket %{public}d", - connection->connectionId, LE_GetSocketFd(taskHandle)); + APPSPAWN_LOGI("OnClose connectionId: %{public}u socket %{public}d", connection->connectionId, fd); DeleteAppSpawnMsg(&connection->receiverCtx.incompleteMsg); connection->receiverCtx.incompleteMsg = NULL; // connect close, to close spawning app @@ -406,6 +412,24 @@ static int OnConnection(const LoopHandle loopHandle, const TaskHandle server) return 0; } +static void OnListenFdClose(const TaskHandle taskHandle) +{ + /** + * The socket fd of the parent process appspawn is executed in the AppSpawnDestroyContent function, + * and executing it in the OnListen function will result in a badfd + */ + if (IsSpawnServer(GetAppSpawnMgr())) { + return; + } + // close socket listen fd in child process + int fd = LE_GetSocketFd(taskHandle); + APPSPAWN_LOGV("OnListenFdClose listen fd: %{public}d", fd); + if (fd > 0) { + close(fd); + } + fd = -1; +} + APPSPAWN_STATIC bool MsgDevicedebugCheck(TaskHandle stream, AppSpawnMsgNode *message) { struct ucred cred = {0, 0, 0}; @@ -621,11 +645,11 @@ static void WatchChildProcessFd(AppSpawningCtx *property) static int IsChildColdRun(AppSpawningCtx *property) { - return CheckAppMsgFlagsSet(property, APP_FLAGS_UBSAN_ENABLED) - || CheckAppMsgFlagsSet(property, APP_FLAGS_ASANENABLED) - || CheckAppMsgFlagsSet(property, APP_FLAGS_TSAN_ENABLED) - || CheckAppMsgFlagsSet(property, APP_FLAGS_HWASAN_ENABLED) - || (property->client.flags & APP_COLD_START); + return CheckAppMsgFlagsSet(property, APP_FLAGS_UBSAN_ENABLED) || + CheckAppMsgFlagsSet(property, APP_FLAGS_ASANENABLED) || + CheckAppMsgFlagsSet(property, APP_FLAGS_TSAN_ENABLED) || + CheckAppMsgFlagsSet(property, APP_FLAGS_HWASAN_ENABLED) || + (property->client.flags & APP_COLD_START); } static int AddChildWatcher(AppSpawningCtx *property) @@ -1155,7 +1179,7 @@ static int CreateAppSpawnServer(TaskHandle *server, const char *socketName) info.baseInfo.flags = TASK_STREAM | TASK_PIPE | TASK_SERVER; info.socketId = socketId; info.server = path; - info.baseInfo.close = NULL; + info.baseInfo.close = OnListenFdClose; info.incommingConnect = OnConnection; MakeDirRec(path, 0711, 0); // 0711 default mask -- Gitee