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;