aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/src/filesystem/vfs.cpp23
1 files changed, 15 insertions, 8 deletions
diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp
index 03921df..e6d9241 100644
--- a/kernel/src/filesystem/vfs.cpp
+++ b/kernel/src/filesystem/vfs.cpp
@@ -1,5 +1,6 @@
#include <kernel/filesystem/vfs.hpp>
+#include <kernel/filesystem/constants.hpp>
#include <kernel/filesystem/dentry.hpp>
#include <kernel/filesystem/devfs/filesystem.hpp>
#include <kernel/filesystem/filesystem.hpp>
@@ -93,7 +94,7 @@ namespace kernel::filesystem
auto vfs::do_mount(std::string_view source, std::string_view target) -> operation_result
{
- if (!kernel::filesystem::path::is_valid_path(source) || !kernel::filesystem::path::is_valid_path(target))
+ if (!path::is_valid_path(source) || !path::is_valid_path(target))
{
return operation_result::invalid_path;
}
@@ -116,7 +117,7 @@ namespace kernel::filesystem
auto vfs::unmount(std::string_view path) -> operation_result
{
- if (!kernel::filesystem::path::is_valid_path(path))
+ if (!path::is_valid_path(path))
{
return operation_result::invalid_path;
}
@@ -147,7 +148,7 @@ namespace kernel::filesystem
auto vfs::resolve_path(std::string_view path) -> kstd::shared_ptr<dentry>
{
- if (!kernel::filesystem::path::is_valid_absolute_path(path))
+ if (!path::is_valid_absolute_path(path))
{
return nullptr;
}
@@ -161,10 +162,12 @@ namespace kernel::filesystem
auto current_dentry = current_mount->root_dentry();
- auto path_parts = kernel::filesystem::path::split(path);
+ auto path_parts = path::split(path);
kstd::vector path_parts_vector(path_parts.begin(), path_parts.end());
std::ranges::reverse(path_parts_vector);
+ auto symlink_counter = 0uz;
+
while (!path_parts_vector.empty())
{
auto part = path_parts_vector.back();
@@ -230,18 +233,22 @@ namespace kernel::filesystem
if (next_dentry->get_inode()->is_symbolic_link())
{
- // TODO BA-FS26 max symbolic link depth to prevent infinite loops
- kstd::vector<uint8_t> buffer(4096); // TODO BA-FS26 max symlink size?
+ if (symlink_counter++ > constants::symloop_max)
+ {
+ return nullptr;
+ }
+
+ kstd::vector<uint8_t> buffer(constants::symlink_max_path_length);
auto const bytes_read = next_dentry->get_inode()->read(buffer.data(), 0, buffer.size());
auto const symbolic_link_path = std::string_view{reinterpret_cast<char const *>(buffer.data()), bytes_read};
- auto symbolic_link_parts = kernel::filesystem::path::split(symbolic_link_path);
+ auto symbolic_link_parts = path::split(symbolic_link_path);
kstd::vector symbolic_link_parts_vector(symbolic_link_parts.begin(), symbolic_link_parts.end());
std::ranges::reverse(symbolic_link_parts_vector);
path_parts_vector.insert_range(path_parts_vector.end(), symbolic_link_parts_vector);
- if (kernel::filesystem::path::is_valid_absolute_path(symbolic_link_path))
+ if (path::is_valid_absolute_path(symbolic_link_path))
{
current_mount = m_mount_table.find_longest_prefix_mount("/");
current_dentry = current_mount->root_dentry();