diff --git a/src/appspawn_process.c b/src/appspawn_process.c index 31f0312c1467ea409b3976149513ec44d986364a..fcd50a6ee732cc64dad5c94bcf0b072ae0c968dd 100755 --- a/src/appspawn_process.c +++ b/src/appspawn_process.c @@ -19,6 +19,7 @@ #include #include #include +#include "ability_main.h" #include "appspawn_adapter.h" #include "log.h" #include "securec.h" @@ -31,17 +32,12 @@ extern "C" { #define DEFAULT_UMASK 022 #define CAP_NUM 2 -#define ABILITY_EXE_FILE_FULL_PATH "/bin/abilityMain" -#define ABILITY_EXE_FILE_NAME "abilityMain" #define ENV_TITLE "LD_LIBRARY_PATH=" #define UPPER_BOUND_GID 999 #define LOWER_BOUND_GID 100 #define GRP_NUM 2 #define DEVMGR_GRP 99 -static const unsigned int MAX_IDENTITY_ID_LENGTH = 25; -static const unsigned int MAX_PROCESS_NAME_LENGTH = 130; - static int SetPerms(uid_t uID, gid_t gID) { gid_t groups[GRP_NUM]; @@ -118,35 +114,11 @@ static char* GetEnvStrs(const MessageSt* msgSt) pid_t CreateProcess(const MessageSt* msgSt) { - char identityIDStr[MAX_IDENTITY_ID_LENGTH]; - char processNameStr[MAX_PROCESS_NAME_LENGTH]; - if (memset_s(identityIDStr, MAX_IDENTITY_ID_LENGTH, '\0', MAX_IDENTITY_ID_LENGTH) != EOK || - memset_s(processNameStr, MAX_PROCESS_NAME_LENGTH, '\0', MAX_PROCESS_NAME_LENGTH) != EOK) { - HILOG_ERROR(HILOG_MODULE_HIVIEW, "[appspawn] create service, memset_s failed."); - return -1; - } - - if (sprintf_s(identityIDStr, MAX_IDENTITY_ID_LENGTH, "%s", msgSt->identityID) <= 0 || - sprintf_s(processNameStr, MAX_PROCESS_NAME_LENGTH, "%s", msgSt->bundleName) <= 0) { - HILOG_ERROR(HILOG_MODULE_HIVIEW, "[appspawn] sprintf_s failed. id %{public}s, name %{public}s.",\ - msgSt->identityID, msgSt->bundleName); - return -1; - } - char* envStr = GetEnvStrs(msgSt); if (envStr == NULL) { return -1; } - // check if the exe file exists - struct stat pathStat = {0}; - if (stat(ABILITY_EXE_FILE_FULL_PATH, &pathStat) != 0) { - HILOG_ERROR(HILOG_MODULE_HIVIEW, "[appspawn] stat %{public}s failed, err %{public}d.",\ - ABILITY_EXE_FILE_FULL_PATH, errno); - free(envStr); - return -1; - } - pid_t newPID = fork(); if (newPID < 0) { HILOG_ERROR(HILOG_MODULE_HIVIEW, "[appspawn] create process, fork failed! err %{public}d.", errno); @@ -158,18 +130,18 @@ pid_t CreateProcess(const MessageSt* msgSt) if (newPID == 0) { // set permissions if (SetPerms(msgSt->uID, msgSt->gID) != 0) { - HILOG_ERROR(HILOG_MODULE_HIVIEW, "[appspawn] process %{public}s exit!", processNameStr); - _exit(0x7f); // 0x7f: user specified + HILOG_ERROR(HILOG_MODULE_HIVIEW, "[appspawn] process %{public}s exit!", msgSt->bundleName); + exit(0x7f); // 0x7f: user specified } - char* argv[] = {ABILITY_EXE_FILE_NAME, identityIDStr, processNameStr, NULL}; - char* env[] = {envStr, NULL}; - if (execve(ABILITY_EXE_FILE_FULL_PATH, argv, env) != 0) { - HILOG_ERROR(HILOG_MODULE_HIVIEW, "[appspawn] execve %{public}s failed! err %{public}d.",\ - ABILITY_EXE_FILE_FULL_PATH, errno); + (void) prctl(PR_SET_NAME, msgSt->bundleName); + if (AbilityMain(msgSt->identityID) != 0) { + HILOG_ERROR(HILOG_MODULE_HIVIEW, "[appspawn] AbilityMain execute failed, pid %{public}d.", getpid()); + exit(0x7f); // 0x7f: user specified } + HILOG_ERROR(HILOG_MODULE_HIVIEW, "[appspawn] sub-process exit, pid %{public}d.", getpid()); - _exit(0x7f); // 0x7f: user specified + exit(0x7f); // 0x7f: user specified } free(envStr);