From de4f20d48d0b4f51c04ade690d5a2d49d1abc230 Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko <phcoder@gmail.com> Date: Sun, 20 Aug 2023 17:41:34 +0200 Subject: [PATCH] ufs2: Fix wrong lookup iteration Passed size needs to be size of name buffer, not of length we compare to. Fix the value and remove now unused parameter. Change-Id: Idb69a0e78ba376751edf8b3df3635cd0af4c9460 Reviewed-on: https://review.haiku-os.org/c/haiku/+/6850 Reviewed-by: Adrien Destugues <pulkomandy@pulkomandy.tk> --- src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.cpp | 7 ++++--- src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.h | 3 +-- src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp | 3 +-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.cpp b/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.cpp index c0af9cca93..9a004501b2 100644 --- a/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.cpp +++ b/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.cpp @@ -42,18 +42,19 @@ DirectoryIterator::InitCheck() status_t -DirectoryIterator::Lookup(const char* name, size_t length, ino_t* _id) +DirectoryIterator::Lookup(const char* name, ino_t* _id) { if (strcmp(name, ".") == 0) { *_id = fInode->ID(); return B_OK; } - char getname[B_FILE_NAME_LENGTH]; + char getname[B_FILE_NAME_LENGTH + 1]; status_t status; while(true) { - status = GetNext(getname, &length, _id); + size_t len = sizeof (getname) - 1; + status = GetNext(getname, &len, _id); if (status != B_OK) return status; if (strcmp(getname, name) == 0) diff --git a/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.h b/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.h index 72fe3a744c..5377b9b045 100644 --- a/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.h +++ b/src/add-ons/kernel/file_systems/ufs2/DirectoryIterator.h @@ -42,8 +42,7 @@ public: ~DirectoryIterator(); status_t InitCheck(); - status_t Lookup(const char* name, size_t length, - ino_t* id); + status_t Lookup(const char* name, ino_t* id); status_t GetNext(char* name, size_t* _nameLength, ino_t* _id); status_t _GetNext(const char* name, size_t* _nameLength, diff --git a/src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp b/src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp index 4dbbde9ad3..b3eb02f4c0 100644 --- a/src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp @@ -214,8 +214,7 @@ ufs2_lookup(fs_volume *_volume, fs_vnode *_directory, const char *name, Volume* volume = (Volume*)_volume->private_volume; Inode* directory = (Inode*)_directory->private_node; - status_t status = DirectoryIterator(directory).Lookup(name, strlen(name), - (ino_t*)_vnodeID); + status_t status = DirectoryIterator(directory).Lookup(name, _vnodeID); if (status != B_OK) return status;