diff options
author | Mart G <martg_@hotmail.com> | 2021-05-22 00:12:32 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-22 00:12:32 +0200 |
commit | e16a50b58667f130995a392804ed63c0b834bb77 (patch) | |
tree | b98d00f0ffbaf683cd50615987618705e58bb8d5 | |
parent | 467ceb15aab4aa9220ef8b00a34141045329b5ff (diff) | |
download | serenity-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.cpp | 13 |
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. |