From e16a50b58667f130995a392804ed63c0b834bb77 Mon Sep 17 00:00:00 2001 From: Mart G Date: Sat, 22 May 2021 00:12:32 +0200 Subject: [PATCH] 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. --- Kernel/FileSystem/VirtualFileSystem.cpp | 13 +++++++++---- 1 file 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> 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 = 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> 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.