!617 syscall review bugfix

Merge pull request !617 from 野生毛霉君/master
This commit is contained in:
openharmony_ci 2021-09-09 14:53:55 +00:00 committed by Gitee
commit 8713997548
4 changed files with 74 additions and 26 deletions

View File

@ -686,7 +686,6 @@ int VfsJffs2Symlink(struct Vnode *parentVnode, struct Vnode **newVnode, const ch
ssize_t VfsJffs2Readlink(struct Vnode *vnode, char *buffer, size_t bufLen) ssize_t VfsJffs2Readlink(struct Vnode *vnode, char *buffer, size_t bufLen)
{ {
ssize_t ret = 0;
struct jffs2_inode *inode = NULL; struct jffs2_inode *inode = NULL;
struct jffs2_inode_info *f = NULL; struct jffs2_inode_info *f = NULL;
ssize_t targetLen; ssize_t targetLen;
@ -705,14 +704,12 @@ ssize_t VfsJffs2Readlink(struct Vnode *vnode, char *buffer, size_t bufLen)
cnt = (bufLen - 1) < targetLen ? (bufLen - 1) : targetLen; cnt = (bufLen - 1) < targetLen ? (bufLen - 1) : targetLen;
if (LOS_CopyFromKernel(buffer, bufLen, (const char *)f->target, cnt) != 0) { if (LOS_CopyFromKernel(buffer, bufLen, (const char *)f->target, cnt) != 0) {
cnt = 0; cnt = 0;
ret = -EFAULT; LOS_MuxUnlock(&g_jffs2FsLock);
return -EFAULT;
} }
buffer[cnt] = '\0'; buffer[cnt] = '\0';
LOS_MuxUnlock(&g_jffs2FsLock); LOS_MuxUnlock(&g_jffs2FsLock);
if (ret < 0) {
return ret;
}
return cnt; return cnt;
} }

View File

@ -59,10 +59,6 @@ void FileTableUnLock(struct fd_table_s *fdt)
static int AssignProcessFd(const struct fd_table_s *fdt, int minFd) static int AssignProcessFd(const struct fd_table_s *fdt, int minFd)
{ {
if (fdt == NULL) {
return VFS_ERROR;
}
if (minFd >= fdt->max_fds) { if (minFd >= fdt->max_fds) {
set_errno(EINVAL); set_errno(EINVAL);
return VFS_ERROR; return VFS_ERROR;

View File

@ -128,6 +128,7 @@ struct PathCache *PathCacheAlloc(struct Vnode *parent, struct Vnode *vnode, cons
ret = strncpy_s(pc->name, len + 1, name, len); ret = strncpy_s(pc->name, len + 1, name, len);
if (ret != LOS_OK) { if (ret != LOS_OK) {
free(pc);
return NULL; return NULL;
} }

View File

@ -450,8 +450,16 @@ OUT:
int SysSymlink(const char *target, const char *linkpath) int SysSymlink(const char *target, const char *linkpath)
{ {
int ret; int ret;
char *targetRet = NULL;
char *pathRet = NULL; char *pathRet = NULL;
if (target != NULL) {
ret = UserPathCopy(target, &targetRet);
if (ret != 0) {
goto OUT;
}
}
if (linkpath != NULL) { if (linkpath != NULL) {
ret = UserPathCopy(linkpath, &pathRet); ret = UserPathCopy(linkpath, &pathRet);
if (ret != 0) { if (ret != 0) {
@ -459,7 +467,7 @@ int SysSymlink(const char *target, const char *linkpath)
} }
} }
ret = symlink(target, pathRet); ret = symlink(targetRet, pathRet);
if (ret < 0) { if (ret < 0) {
ret = -get_errno(); ret = -get_errno();
} }
@ -468,6 +476,10 @@ OUT:
if (pathRet != NULL) { if (pathRet != NULL) {
(void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet); (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
} }
if (targetRet != NULL) {
(void)LOS_MemFree(OS_SYS_MEM_ADDR, targetRet);
}
return ret; return ret;
} }
@ -606,6 +618,7 @@ int SysMount(const char *source, const char *target, const char *filesystemtype,
int ret; int ret;
char *sourceRet = NULL; char *sourceRet = NULL;
char *targetRet = NULL; char *targetRet = NULL;
char *dataRet = NULL;
char fstypeRet[FILESYSTEM_TYPE_MAX + 1] = {0}; char fstypeRet[FILESYSTEM_TYPE_MAX + 1] = {0};
if (!IsCapPermit(CAP_FS_MOUNT)) { if (!IsCapPermit(CAP_FS_MOUNT)) {
@ -642,7 +655,14 @@ int SysMount(const char *source, const char *target, const char *filesystemtype,
#endif #endif
} }
ret = mount(sourceRet, targetRet, (filesystemtype ? fstypeRet : NULL), mountflags, data); if (data != NULL) {
ret = UserPathCopy(data, &dataRet);
if (ret != 0) {
goto OUT;
}
}
ret = mount(sourceRet, targetRet, (filesystemtype ? fstypeRet : NULL), mountflags, dataRet);
if (ret < 0) { if (ret < 0) {
ret = -get_errno(); ret = -get_errno();
} }
@ -654,6 +674,9 @@ OUT:
if (targetRet != NULL) { if (targetRet != NULL) {
(void)LOS_MemFree(OS_SYS_MEM_ADDR, targetRet); (void)LOS_MemFree(OS_SYS_MEM_ADDR, targetRet);
} }
if (dataRet != NULL) {
(void)LOS_MemFree(OS_SYS_MEM_ADDR, dataRet);
}
return ret; return ret;
} }
@ -1327,9 +1350,12 @@ ssize_t SysReadv(int fd, const struct iovec *iov, int iovcnt)
/* Process fd convert to system global fd */ /* Process fd convert to system global fd */
fd = GetAssociatedSystemFd(fd); fd = GetAssociatedSystemFd(fd);
if ((iov == NULL) || (iovcnt <= 0) || (iovcnt > IOV_MAX)) { if ((iov == NULL) || (iovcnt < 0) || (iovcnt > IOV_MAX)) {
ret = vfs_readv(fd, iov, iovcnt, NULL); return -EINVAL;
return -get_errno(); }
if (iovcnt == 0) {
return 0;
} }
ret = UserIovCopy(&iovRet, iov, iovcnt, &valid_iovcnt); ret = UserIovCopy(&iovRet, iov, iovcnt, &valid_iovcnt);
@ -1363,6 +1389,11 @@ ssize_t SysWritev(int fd, const struct iovec *iov, int iovcnt)
if ((iovcnt < 0) || (iovcnt > IOV_MAX)) { if ((iovcnt < 0) || (iovcnt > IOV_MAX)) {
return -EINVAL; return -EINVAL;
} }
if (iovcnt == 0) {
return 0;
}
if (iov == NULL) { if (iov == NULL) {
return -EFAULT; return -EFAULT;
} }
@ -1545,21 +1576,26 @@ char *SysGetcwd(char *buf, size_t n)
{ {
char *ret = NULL; char *ret = NULL;
char *bufRet = NULL; char *bufRet = NULL;
size_t bufLen = n;
int retVal; int retVal;
bufRet = (char *)LOS_MemAlloc(OS_SYS_MEM_ADDR, n); if (bufLen > PATH_MAX) {
bufLen = PATH_MAX;
}
bufRet = (char *)LOS_MemAlloc(OS_SYS_MEM_ADDR, bufLen);
if (bufRet == NULL) { if (bufRet == NULL) {
return (char *)(intptr_t)-ENOMEM; return (char *)(intptr_t)-ENOMEM;
} }
(void)memset_s(bufRet, n, 0, n); (void)memset_s(bufRet, bufLen, 0, bufLen);
ret = getcwd((buf ? bufRet : NULL), n); ret = getcwd((buf ? bufRet : NULL), bufLen);
if (ret == NULL) { if (ret == NULL) {
(void)LOS_MemFree(OS_SYS_MEM_ADDR, bufRet); (void)LOS_MemFree(OS_SYS_MEM_ADDR, bufRet);
return (char *)(intptr_t)-get_errno(); return (char *)(intptr_t)-get_errno();
} }
retVal = LOS_ArchCopyToUser(buf, bufRet, n); retVal = LOS_ArchCopyToUser(buf, bufRet, bufLen);
if (retVal != 0) { if (retVal != 0) {
(void)LOS_MemFree(OS_SYS_MEM_ADDR, bufRet); (void)LOS_MemFree(OS_SYS_MEM_ADDR, bufRet);
return (char *)(intptr_t)-EFAULT; return (char *)(intptr_t)-EFAULT;
@ -1749,6 +1785,14 @@ int SysSymlinkat(const char *target, int dirfd, const char *linkpath)
{ {
int ret; int ret;
char *pathRet = NULL; char *pathRet = NULL;
char *targetRet = NULL;
if (target != NULL) {
ret = UserPathCopy(target, &targetRet);
if (ret != 0) {
goto OUT;
}
}
if (linkpath != NULL) { if (linkpath != NULL) {
ret = UserPathCopy(linkpath, &pathRet); ret = UserPathCopy(linkpath, &pathRet);
@ -1762,7 +1806,7 @@ int SysSymlinkat(const char *target, int dirfd, const char *linkpath)
dirfd = GetAssociatedSystemFd(dirfd); dirfd = GetAssociatedSystemFd(dirfd);
} }
ret = symlinkat(target, dirfd, pathRet); ret = symlinkat(targetRet, dirfd, pathRet);
if (ret < 0) { if (ret < 0) {
ret = -get_errno(); ret = -get_errno();
} }
@ -1771,6 +1815,10 @@ OUT:
if (pathRet != NULL) { if (pathRet != NULL) {
(void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet); (void)LOS_MemFree(OS_SYS_MEM_ADDR, pathRet);
} }
if (targetRet != NULL) {
(void)LOS_MemFree(OS_SYS_MEM_ADDR, targetRet);
}
return ret; return ret;
} }
@ -1924,9 +1972,12 @@ ssize_t SysPreadv(int fd, const struct iovec *iov, int iovcnt, long loffset, lon
/* Process fd convert to system global fd */ /* Process fd convert to system global fd */
fd = GetAssociatedSystemFd(fd); fd = GetAssociatedSystemFd(fd);
if ((iov == NULL) || (iovcnt <= 0) || (iovcnt > IOV_MAX)) { if ((iov == NULL) || (iovcnt < 0) || (iovcnt > IOV_MAX)) {
ret = preadv(fd, iov, iovcnt, offsetflag); return -EINVAL;
return -get_errno(); }
if (iovcnt == 0) {
return 0;
} }
ret = UserIovCopy(&iovRet, iov, iovcnt, &valid_iovcnt); ret = UserIovCopy(&iovRet, iov, iovcnt, &valid_iovcnt);
@ -1959,9 +2010,12 @@ ssize_t SysPwritev(int fd, const struct iovec *iov, int iovcnt, long loffset, lo
/* Process fd convert to system global fd */ /* Process fd convert to system global fd */
fd = GetAssociatedSystemFd(fd); fd = GetAssociatedSystemFd(fd);
if ((iov == NULL) || (iovcnt <= 0) || (iovcnt > IOV_MAX)) { if ((iov == NULL) || (iovcnt < 0) || (iovcnt > IOV_MAX)) {
ret = pwritev(fd, iov, iovcnt, offsetflag); return -EINVAL;
return -get_errno(); }
if (iovcnt == 0) {
return 0;
} }
ret = UserIovCopy(&iovRet, iov, iovcnt, &valid_iovcnt); ret = UserIovCopy(&iovRet, iov, iovcnt, &valid_iovcnt);