mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
vfs: fix UAF on VOP_RELEASE
This commit is contained in:
@@ -242,12 +242,13 @@ typedef struct vops_t {
|
|||||||
#define VOP_SYNC(v) (v)->ops->sync(v)
|
#define VOP_SYNC(v) (v)->ops->sync(v)
|
||||||
#define VOP_ADVLOCK(v, o, a) (v)->ops->advlock(v, o, a)
|
#define VOP_ADVLOCK(v, o, a) (v)->ops->advlock(v, o, a)
|
||||||
#define VOP_HOLD(v) __atomic_add_fetch(&(v)->refcount, 1, __ATOMIC_SEQ_CST)
|
#define VOP_HOLD(v) __atomic_add_fetch(&(v)->refcount, 1, __ATOMIC_SEQ_CST)
|
||||||
#define VOP_RELEASE(v) {\
|
#define VOP_RELEASE(v) do { \
|
||||||
if (__atomic_sub_fetch(&(v)->refcount, 1, __ATOMIC_SEQ_CST) == 0) {\
|
vnode_t *vop_release_node = (v); \
|
||||||
vfs_inactive(v); \
|
if (__atomic_sub_fetch(&vop_release_node->refcount, 1, __ATOMIC_SEQ_CST) == 0) { \
|
||||||
(v) = NULL; \
|
(v) = NULL; \
|
||||||
|
vfs_inactive(vop_release_node); \
|
||||||
} \
|
} \
|
||||||
}
|
} while (0)
|
||||||
|
|
||||||
#define VFS_STUB(x) static int x () { return ENODEV; }
|
#define VFS_STUB(x) static int x () { return ENODEV; }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user