summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMart G <martg_@hotmail.com>2021-05-22 00:12:32 +0200
committerGitHub <noreply@github.com>2021-05-22 00:12:32 +0200
commite16a50b58667f130995a392804ed63c0b834bb77 (patch)
treeb98d00f0ffbaf683cd50615987618705e58bb8d5
parent467ceb15aab4aa9220ef8b00a34141045329b5ff (diff)
downloadserenity-e16a50b58667f130995a392804ed63c0b834bb77.zip
Kernel: Remove an allocation from VFS::resolve_path_without_veil (#7287)
Use GenericLexer to replace a call to StringView::split() since that returns its result in a heap-allocating Vector.
-rw-r--r--Kernel/FileSystem/VirtualFileSystem.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp
index fd54270833..ea3db0c577 100644
--- a/Kernel/FileSystem/VirtualFileSystem.cpp
+++ b/Kernel/FileSystem/VirtualFileSystem.cpp
@@ -941,13 +941,19 @@ KResultOr<NonnullRefPtr<Custody>> VFS::resolve_path_without_veil(StringView path
if (path.is_empty())
return EINVAL;
- auto parts = path.split_view('/', true);
+ GenericLexer path_lexer(path);
auto current_process = Process::current();
auto& current_root = current_process->root_directory();
NonnullRefPtr<Custody> custody = path[0] == '/' ? current_root : base;
+ bool extra_iteration = path[path.length() - 1] == '/';
+
+ while (!path_lexer.is_eof() || extra_iteration) {
+ if (path_lexer.is_eof())
+ extra_iteration = false;
+ auto part = path_lexer.consume_until('/');
+ path_lexer.consume_specific('/');
- for (size_t i = 0; i < parts.size(); ++i) {
Custody& parent = custody;
auto parent_metadata = parent.inode().metadata();
if (!parent_metadata.is_directory())
@@ -956,8 +962,7 @@ KResultOr<NonnullRefPtr<Custody>> VFS::resolve_path_without_veil(StringView path
if (!parent_metadata.may_execute(*current_process))
return EACCES;
- auto& part = parts[i];
- bool have_more_parts = i + 1 < parts.size();
+ bool have_more_parts = !path_lexer.is_eof() || extra_iteration;
if (part == "..") {
// If we encounter a "..", take a step back, but don't go beyond the root.