summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorwdfk-prog <[email protected]>2026-01-05 10:34:16 +0800
committerR b b666 <[email protected]>2026-02-02 13:33:32 +0800
commit2b95c3409c24afd18a061eb03ec96af019798d88 (patch)
tree95aa2bbcfb171120eaaaf45b2db157d0404c8b3d /components
parent88c1e6c88a99a74ad85eb08652d4e31e960c1f19 (diff)
fix[dfs_v1]: prevent vnode ref underflow and double release on close/fd release
Diffstat (limited to 'components')
-rw-r--r--components/dfs/dfs_v1/src/dfs.c7
-rw-r--r--components/dfs/dfs_v1/src/dfs_file.c7
2 files changed, 9 insertions, 5 deletions
diff --git a/components/dfs/dfs_v1/src/dfs.c b/components/dfs/dfs_v1/src/dfs.c
index 3783179315..9a7c98cc33 100644
--- a/components/dfs/dfs_v1/src/dfs.c
+++ b/components/dfs/dfs_v1/src/dfs.c
@@ -414,13 +414,16 @@ void fdt_fd_release(struct dfs_fdtable* fdt, int fd)
if (fd_slot->ref_count == 0)
{
struct dfs_vnode *vnode = fd_slot->vnode;
+ fd_slot->vnode = RT_NULL;
if (vnode)
{
- vnode->ref_count--;
+ if (vnode->ref_count > 0)
+ {
+ vnode->ref_count--;
+ }
if(vnode->ref_count == 0)
{
rt_free(vnode);
- fd_slot->vnode = RT_NULL;
}
}
rt_free(fd_slot);
diff --git a/components/dfs/dfs_v1/src/dfs_file.c b/components/dfs/dfs_v1/src/dfs_file.c
index 75bbd219bc..f1c4e7ee4d 100644
--- a/components/dfs/dfs_v1/src/dfs_file.c
+++ b/components/dfs/dfs_v1/src/dfs_file.c
@@ -337,7 +337,7 @@ int dfs_file_close(struct dfs_file *fd)
dfs_fm_lock();
vnode = fd->vnode;
- if (vnode->ref_count <= 0)
+ if (vnode == NULL || vnode->ref_count <= 0)
{
dfs_fm_unlock();
return -ENXIO;
@@ -348,11 +348,12 @@ int dfs_file_close(struct dfs_file *fd)
result = vnode->fops->close(fd);
}
- if (vnode->ref_count == 1)
+ vnode->ref_count--;
+ fd->vnode = NULL;
+ if (vnode->ref_count == 0)
{
/* remove from hash */
rt_list_remove(&vnode->list);
- fd->vnode = NULL;
if (vnode->path != vnode->fullpath)
{