From a5bd09d5a995400c4f4ec1270e1ad380d238783c Mon Sep 17 00:00:00 2001
From: dzwdz
Date: Fri, 27 Aug 2021 19:36:37 +0200
Subject: make vfs_mount_resolve pass all the tests

---
 src/kernel/tests/vfs.c |  8 ++++----
 src/kernel/vfs/mount.c | 11 ++++++++++-
 2 files changed, 14 insertions(+), 5 deletions(-)

(limited to 'src/kernel')

diff --git a/src/kernel/tests/vfs.c b/src/kernel/tests/vfs.c
index cfbf86b..0871f92 100644
--- a/src/kernel/tests/vfs.c
+++ b/src/kernel/tests/vfs.c
@@ -70,7 +70,7 @@ TEST(vfs_mount_resolve) {
 		mount = mount2; \
 	} while (0)
 
-	ADD_MOUNT("/");
+	ADD_MOUNT(""); // root mount
 	ADD_MOUNT("/dir/shadowed");
 	ADD_MOUNT("/dir");
 
@@ -82,10 +82,10 @@ TEST(vfs_mount_resolve) {
 		       && (0 == memcmp(mount2->prefix, expected, mount2->prefix_len))); \
 	} while (0)
 
-	TEST_WRAPPER("/",              "/");
-	TEST_WRAPPER("/test",          "/");
+	TEST_WRAPPER("/",              "");
+	TEST_WRAPPER("/test",          "");
 	TEST_WRAPPER("/dir",           "/dir");
-	TEST_WRAPPER("/dirry",         "/");
+	TEST_WRAPPER("/dirry",         "");
 	TEST_WRAPPER("/dir/",          "/dir");
 	TEST_WRAPPER("/dir/shadowed",  "/dir");
 	TEST_WRAPPER("/dir/shadowed/", "/dir");
diff --git a/src/kernel/vfs/mount.c b/src/kernel/vfs/mount.c
index bf98957..bd06370 100644
--- a/src/kernel/vfs/mount.c
+++ b/src/kernel/vfs/mount.c
@@ -21,7 +21,16 @@ struct vfs_mount *vfs_mount_resolve(
 	for (; top; top = top->prev) {
 		if (top->prefix_len > path_len)
 			continue;
-		if (memcmp(top->prefix, path, top->prefix_len) == 0)
+		if (memcmp(top->prefix, path, top->prefix_len) != 0)
+			continue;
+
+		/* ensure that there's no garbage after the match
+		 * recognize that e.g. /thisasdf doesn't get recognized as mounted under
+		 * /this */
+		
+		if (top->prefix_len == path_len) // can't happen if prefix == path
+			break;
+		if (path[top->prefix_len] == '/')
 			break;
 	}
 	return top;
-- 
cgit v1.2.3