diff --git a/kernel/extended/dynload/src/los_exec_elf.c b/kernel/extended/dynload/src/los_exec_elf.c index 57d8969b92041e93b7dc74c43c6a88a704b5d2b3..48b3ddc190f3d4f3ac91dd270a696e61dbb051cd 100644 --- a/kernel/extended/dynload/src/los_exec_elf.c +++ b/kernel/extended/dynload/src/los_exec_elf.c @@ -90,6 +90,7 @@ STATIC INT32 OsCopyUserParam(ELFLoadInfo *loadInfo, const CHAR *fileName, CHAR * { UINT32 strLen; errno_t err; + static UINT32 userFirstInitFlag = 0; if (LOS_IsUserAddress((VADDR_T)(UINTPTR)fileName)) { err = LOS_StrncpyFromUser(kfileName, fileName, PATH_MAX + 1); @@ -99,7 +100,12 @@ STATIC INT32 OsCopyUserParam(ELFLoadInfo *loadInfo, const CHAR *fileName, CHAR * PRINT_ERR("%s[%d], filename len exceeds maxlen: %d\n", __FUNCTION__, __LINE__, PATH_MAX); return -ENAMETOOLONG; } - } else if (LOS_IsKernelAddress((VADDR_T)(UINTPTR)fileName)) { + } else if (LOS_IsKernelAddress((VADDR_T)(UINTPTR)fileName) && (userFirstInitFlag == 0)) { + /** + * The first user process is created by the function OsUserInit->execve(/bin/init) in the kernel space + * after the first user process is created, this branch should not enter again + */ + userFirstInitFlag = 1; strLen = strlen(fileName); err = memcpy_s(kfileName, PATH_MAX, fileName, strLen); if (err != EOK) {