!166 修复fatfs文件系统中部分指针访问前未判空、全局变量保护不完全问题。

Merge pull request !166 from JING/fatfs
This commit is contained in:
openharmony_ci 2021-06-10 13:21:37 +08:00 committed by Gitee
commit db89b353e9
1 changed files with 84 additions and 31 deletions

View File

@ -622,14 +622,21 @@ int fatfs_close(int fd)
FRESULT res; FRESULT res;
INT32 ret; INT32 ret;
ret = FsLock();
if (ret != 0) {
errno = ret;
return FS_FAILURE;
}
if (!IsValidFd(fd)) { if (!IsValidFd(fd)) {
FsUnlock();
errno = EBADF; errno = EBADF;
return FS_FAILURE; return FS_FAILURE;
} }
ret = FsLock(); if (g_handle[fd].fil.obj.fs == NULL) {
if (ret != 0) { FsUnlock();
errno = ret; errno = ENOENT;
return FS_FAILURE; return FS_FAILURE;
} }
@ -668,10 +675,6 @@ ssize_t fatfs_read(int fd, void *buf, size_t nbyte)
errno = EFAULT; errno = EFAULT;
return FS_FAILURE; return FS_FAILURE;
} }
if (!IsValidFd(fd)) {
errno = EBADF;
return FS_FAILURE;
}
ret = FsLock(); ret = FsLock();
if (ret != 0) { if (ret != 0) {
@ -679,6 +682,18 @@ ssize_t fatfs_read(int fd, void *buf, size_t nbyte)
return FS_FAILURE; return FS_FAILURE;
} }
if (!IsValidFd(fd)) {
FsUnlock();
errno = EBADF;
return FS_FAILURE;
}
if (g_handle[fd].fil.obj.fs == NULL) {
FsUnlock();
errno = ENOENT;
return FS_FAILURE;
}
res = f_read(&g_handle[fd].fil, buf, nbyte, &lenRead); res = f_read(&g_handle[fd].fil, buf, nbyte, &lenRead);
if (res != FR_OK) { if (res != FR_OK) {
FsUnlock(); FsUnlock();
@ -701,10 +716,6 @@ ssize_t fatfs_write(int fd, const void *buf, size_t nbyte)
errno = EFAULT; errno = EFAULT;
return FS_FAILURE; return FS_FAILURE;
} }
if (!IsValidFd(fd)) {
errno = EBADF;
return FS_FAILURE;
}
ret = FsLock(); ret = FsLock();
if (ret != 0) { if (ret != 0) {
@ -712,15 +723,27 @@ ssize_t fatfs_write(int fd, const void *buf, size_t nbyte)
return FS_FAILURE; return FS_FAILURE;
} }
if (!IsValidFd(fd)) {
errno = EBADF;
goto ERROUT;
}
if (g_handle[fd].fil.obj.fs == NULL) {
errno = ENOENT;
goto ERROUT;
}
if (!FsCheckByID(g_handle[fd].fil.obj.fs->id)) { if (!FsCheckByID(g_handle[fd].fil.obj.fs->id)) {
errno = EACCES; errno = EACCES;
goto ERROUT; goto ERROUT;
} }
res = f_write(&g_handle[fd].fil, buf, nbyte, &lenWrite); res = f_write(&g_handle[fd].fil, buf, nbyte, &lenWrite);
if ((res == FR_OK) && (lenWrite == 0) && (nbyte != 0) && (overFlow == FALSE)) { if ((res == FR_OK) && (lenWrite == 0) && (nbyte != 0) && (overFlow == FALSE)) {
overFlow = TRUE; overFlow = TRUE;
PRINTK("FAT write err 0x%x!\r\n", fd); PRINTK("FAT write err 0x%x!\r\n", fd);
} }
if ((res != FR_OK) || (nbyte != lenWrite)) { if ((res != FR_OK) || (nbyte != lenWrite)) {
errno = FatfsErrno(res); errno = FatfsErrno(res);
goto ERROUT; goto ERROUT;
@ -740,17 +763,22 @@ off_t fatfs_lseek(int fd, off_t offset, int whence)
INT32 ret; INT32 ret;
off_t pos; off_t pos;
if (!IsValidFd(fd)) {
errno = EBADF;
return FS_FAILURE;
}
ret = FsLock(); ret = FsLock();
if (ret != 0) { if (ret != 0) {
errno = ret; errno = ret;
return FS_FAILURE; return FS_FAILURE;
} }
if (!IsValidFd(fd)) {
errno = EBADF;
goto ERROUT;
}
if (g_handle[fd].fil.obj.fs == NULL) {
errno = ENOENT;
goto ERROUT;
}
if (whence == SEEK_SET) { if (whence == SEEK_SET) {
pos = 0; pos = 0;
} else if (whence == SEEK_CUR) { } else if (whence == SEEK_CUR) {
@ -832,10 +860,6 @@ int fatfs_fstat(int fd, struct stat *buf)
errno = EFAULT; errno = EFAULT;
return FS_FAILURE; return FS_FAILURE;
} }
if (!IsValidFd(fd)) {
errno = EBADF;
return FS_FAILURE;
}
ret = FsLock(); ret = FsLock();
if (ret != 0) { if (ret != 0) {
@ -843,6 +867,18 @@ int fatfs_fstat(int fd, struct stat *buf)
return FS_FAILURE; return FS_FAILURE;
} }
if (!IsValidFd(fd)) {
FsUnlock();
errno = EBADF;
return FS_FAILURE;
}
if (g_handle[fd].fil.obj.fs == NULL) {
FsUnlock();
errno = ENOENT;
return FS_FAILURE;
}
buf->st_size = f_size(&g_handle[fd].fil); buf->st_size = f_size(&g_handle[fd].fil);
buf->st_mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH | buf->st_mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH |
S_IWUSR | S_IWGRP | S_IWOTH | S_IWUSR | S_IWGRP | S_IWOTH |
@ -879,6 +915,7 @@ int fatfs_stat(const char *path, struct stat *buf)
ret = FS_FAILURE; ret = FS_FAILURE;
goto OUT; goto OUT;
} }
res = f_stat(path, &fileInfo); res = f_stat(path, &fileInfo);
if (res != FR_OK) { if (res != FR_OK) {
PRINTK("FAT stat err 0x%x!\r\n", res); PRINTK("FAT stat err 0x%x!\r\n", res);
@ -914,22 +951,30 @@ int fatfs_fsync(int fd)
FRESULT res; FRESULT res;
INT32 ret; INT32 ret;
if (!IsValidFd(fd)) {
errno = EBADF;
return FS_FAILURE;
}
ret = FsLock(); ret = FsLock();
if (ret != 0) { if (ret != 0) {
errno = ret; errno = ret;
return FS_FAILURE; return FS_FAILURE;
} }
if (!IsValidFd(fd)) {
errno = EBADF;
ret = FS_FAILURE;
goto OUT;
}
if (g_handle[fd].fil.obj.fs == NULL) {
errno = ENOENT;
ret = FS_FAILURE;
goto OUT;
}
if (!FsCheckByID(g_handle[fd].fil.obj.fs->id)) { if (!FsCheckByID(g_handle[fd].fil.obj.fs->id)) {
errno = EACCES; errno = EACCES;
ret = FS_FAILURE; ret = FS_FAILURE;
goto OUT; goto OUT;
} }
res = f_sync(&g_handle[fd].fil); res = f_sync(&g_handle[fd].fil);
if (res != FR_OK) { if (res != FR_OK) {
errno = FatfsErrno(res); errno = FatfsErrno(res);
@ -1293,11 +1338,6 @@ int fatfs_ftruncate(int fd, off_t length)
UINT count; UINT count;
DWORD fclust; DWORD fclust;
if (!IsValidFd(fd)) {
errno = EBADF;
return FS_FAILURE;
}
if ((length < 0) || (length > UINT_MAX)) { if ((length < 0) || (length > UINT_MAX)) {
errno = EINVAL; errno = EINVAL;
return FS_FAILURE; return FS_FAILURE;
@ -1309,6 +1349,18 @@ int fatfs_ftruncate(int fd, off_t length)
return FS_FAILURE; return FS_FAILURE;
} }
if (!IsValidFd(fd)) {
errno = EBADF;
ret = FS_FAILURE;
goto OUT;
}
if (g_handle[fd].fil.obj.fs == NULL) {
errno = ENOENT;
ret = FS_FAILURE;
goto OUT;
}
if (!FsCheckByID(g_handle[fd].fil.obj.fs->id)) { if (!FsCheckByID(g_handle[fd].fil.obj.fs->id)) {
errno = EACCES; errno = EACCES;
ret = FS_FAILURE; ret = FS_FAILURE;
@ -1442,4 +1494,5 @@ struct FileOps g_fatfsFops = {
.Rename = fatfs_rename, .Rename = fatfs_rename,
.Getattr = fatfs_stat, .Getattr = fatfs_stat,
.Fsync = fatfs_fsync, .Fsync = fatfs_fsync,
}; .Fstat = fatfs_fstat,
};