!166 修复fatfs文件系统中部分指针访问前未判空、全局变量保护不完全问题。
Merge pull request !166 from JING/fatfs
This commit is contained in:
commit
db89b353e9
|
@ -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,
|
||||||
|
};
|
Loading…
Reference in New Issue