summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorangryproton <[email protected]>2026-08-04 23:12:09 +0800
committerRbb666 <[email protected]>2026-08-06 11:18:51 +0800
commit2f7a2299f61b59d5cf00426dac0d248dce9beb4c (patch)
treebe1dd91b03d2058fa439e9ea250a756fc56c3f64
parent395dff4e2e9c2a3c33cdac24249b20a94ecd9d14 (diff)
[fix][dfs] 增加文件系统操作的类型检查,防止类型不匹配导致数据结构不一致引发的异常
-rw-r--r--components/dfs/dfs_v1/filesystems/elmfat/dfs_elm.c5
-rw-r--r--components/dfs/dfs_v1/src/dfs_posix.c5
-rw-r--r--components/dfs/dfs_v2/filesystems/elmfat/dfs_elm.c5
-rw-r--r--components/dfs/dfs_v2/src/dfs_file.c6
-rw-r--r--components/dfs/dfs_v2/src/dfs_posix.c5
5 files changed, 26 insertions, 0 deletions
diff --git a/components/dfs/dfs_v1/filesystems/elmfat/dfs_elm.c b/components/dfs/dfs_v1/filesystems/elmfat/dfs_elm.c
index ceaccc44b0..86963d6e48 100644
--- a/components/dfs/dfs_v1/filesystems/elmfat/dfs_elm.c
+++ b/components/dfs/dfs_v1/filesystems/elmfat/dfs_elm.c
@@ -588,6 +588,11 @@ int dfs_elm_flush(struct dfs_file *file)
FIL *fd;
FRESULT result;
+ if (file->vnode->type == FT_DIRECTORY)
+ {
+ return -EISDIR;
+ }
+
fd = (FIL *)(file->data);
RT_ASSERT(fd != RT_NULL);
diff --git a/components/dfs/dfs_v1/src/dfs_posix.c b/components/dfs/dfs_v1/src/dfs_posix.c
index f3d7b70c31..9e11307709 100644
--- a/components/dfs/dfs_v1/src/dfs_posix.c
+++ b/components/dfs/dfs_v1/src/dfs_posix.c
@@ -460,6 +460,11 @@ int fsync(int fildes)
}
ret = dfs_file_flush(d);
+ if (ret < 0)
+ {
+ rt_set_errno(ret);
+ return -1;
+ }
return ret;
}
diff --git a/components/dfs/dfs_v2/filesystems/elmfat/dfs_elm.c b/components/dfs/dfs_v2/filesystems/elmfat/dfs_elm.c
index eab787cde4..71dc417205 100644
--- a/components/dfs/dfs_v2/filesystems/elmfat/dfs_elm.c
+++ b/components/dfs/dfs_v2/filesystems/elmfat/dfs_elm.c
@@ -623,6 +623,11 @@ int dfs_elm_flush(struct dfs_file *file)
FIL *fd;
FRESULT result;
+ if (file->vnode->type == FT_DIRECTORY)
+ {
+ return -EISDIR;
+ }
+
fd = (FIL *)(file->vnode->data);
RT_ASSERT(fd != RT_NULL);
diff --git a/components/dfs/dfs_v2/src/dfs_file.c b/components/dfs/dfs_v2/src/dfs_file.c
index 9c6e383e1b..32a18dab3d 100644
--- a/components/dfs/dfs_v2/src/dfs_file.c
+++ b/components/dfs/dfs_v2/src/dfs_file.c
@@ -2202,6 +2202,7 @@ int dfs_file_rename(const char *old_file, const char *new_file)
* @return int Operation result:
* - 0 on success
* -EBADF if invalid file descriptor
+ * -EISDIR if the file is a directory (directories cannot be truncated)
* -ENOSYS if truncate operation not supported
* -EINVAL if invalid parameters or not mounted
*
@@ -2214,6 +2215,11 @@ int dfs_file_ftruncate(struct dfs_file *file, off_t length)
if (file)
{
+ if (file->vnode->type == FT_DIRECTORY)
+ {
+ return -EISDIR;
+ }
+
if (file->fops->truncate)
{
if (dfs_is_mounted(file->vnode->mnt) == 0)
diff --git a/components/dfs/dfs_v2/src/dfs_posix.c b/components/dfs/dfs_v2/src/dfs_posix.c
index d0eff53a46..f774aee341 100644
--- a/components/dfs/dfs_v2/src/dfs_posix.c
+++ b/components/dfs/dfs_v2/src/dfs_posix.c
@@ -605,6 +605,11 @@ int fsync(int fildes)
}
ret = dfs_file_fsync(file);
+ if (ret < 0)
+ {
+ rt_set_errno(ret);
+ return -1;
+ }
return ret;
}