diff --git a/syscall/fs_syscall.c b/syscall/fs_syscall.c index b869ee2a..cd255b66 100644 --- a/syscall/fs_syscall.c +++ b/syscall/fs_syscall.c @@ -1556,6 +1556,7 @@ int SysFtruncate64(int fd, off64_t length) int SysOpenat(int dirfd, const char *path, int oflags, ...) { int ret; + int procFd; char *pathRet = NULL; mode_t mode; #ifdef LOSCFG_FILE_MODE @@ -1571,10 +1572,16 @@ int SysOpenat(int dirfd, const char *path, int oflags, ...) if (path != NULL) { ret = UserPathCopy(path, &pathRet); if (ret != 0) { - goto OUT; + return ret; } } + procFd = AllocProcessFd(); + if (procFd < 0) { + ret = -EMFILE; + goto ERROUT; + } + if (dirfd != AT_FDCWD) { /* Process fd convert to system global fd */ dirfd = GetAssociatedSystemFd(dirfd); @@ -1583,12 +1590,22 @@ int SysOpenat(int dirfd, const char *path, int oflags, ...) ret = do_open(dirfd, (path ? pathRet : NULL), oflags, mode); if (ret < 0) { ret = -get_errno(); + goto ERROUT; } -OUT: + AssociateSystemFd(procFd, ret); if (pathRet != NULL) { (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet); } + return procFd; + +ERROUT: + if (pathRet != NULL) { + (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet); + } + if (procFd >= 0) { + FreeProcessFd(procFd); + } return ret; }