⛏️ index : haiku.git

author X512 <danger_mail@list.ru> 2024-01-06 21:50:05.0 +09:00:00
committer waddlesplash <waddlesplash@gmail.com> 2024-01-08 18:41:46.0 +00:00:00
commit
ed61b791748e0a9707cc23d25b915268d2b7685d [patch]
tree
2695d5c990fc9fdd6c33702d19ce7c3bf9fec176
parent
2ad546a6bc10de9ec1d8412262cdc5843345dfbf
download
ed61b791748e0a9707cc23d25b915268d2b7685d.tar.gz

vfs/preallocate: fix file descriptor leak

Fixes #18724.

Change-Id: I1a17a36106d13853888342a397ecd03087b1fdcf
Reviewed-on: https://review.haiku-os.org/c/haiku/+/7299
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
(cherry picked from commit 3433ec7334ed42eb814586c51ecbf039d686aa88)
Reviewed-on: https://review.haiku-os.org/c/haiku/+/7218

Diff

 src/system/kernel/fs/vfs.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/system/kernel/fs/vfs.cpp b/src/system/kernel/fs/vfs.cpp
index 2469c6c..807014e 100644
--- a/src/system/kernel/fs/vfs.cpp
+++ b/src/system/kernel/fs/vfs.cpp
@@ -6450,7 +6450,7 @@
static status_t
common_preallocate(int fd, off_t offset, off_t length, bool kernel)
{
	struct file_descriptor* descriptor;
	CObjectDeleter<struct file_descriptor, void, put_fd> descriptor;
	struct vnode* vnode;

	if (offset < 0 || length == 0)
@@ -6458,8 +6458,8 @@
	if (offset > OFF_MAX - length)
		return B_FILE_TOO_LARGE;

	descriptor = get_fd_and_vnode(fd, &vnode, kernel);
	if (descriptor == NULL || (descriptor->open_mode & O_RWMASK) == O_RDONLY)
	descriptor.SetTo(get_fd_and_vnode(fd, &vnode, kernel));
	if (!descriptor.IsSet() || (descriptor->open_mode & O_RWMASK) == O_RDONLY)
		return B_FILE_ERROR;

	switch (vnode->Type() & S_IFMT) {