aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/kernel/filesystem/ext2/inode.cpp5
-rw-r--r--kernel/kernel/filesystem/ext2/inode.tests.cpp7
2 files changed, 12 insertions, 0 deletions
diff --git a/kernel/kernel/filesystem/ext2/inode.cpp b/kernel/kernel/filesystem/ext2/inode.cpp
index e873d446..136f37a4 100644
--- a/kernel/kernel/filesystem/ext2/inode.cpp
+++ b/kernel/kernel/filesystem/ext2/inode.cpp
@@ -78,6 +78,11 @@ namespace kernel::filesystem::ext2
auto inode::write(void const * buffer, size_t offset, size_t size) -> kstd::result<size_t>
{
+ if (!is_regular())
+ {
+ kapi::system::panic("[EXT2] ext2::inode write called on inode that is not of type regular");
+ }
+
auto const max_writable = this->size() - offset;
auto const requested_size = std::min(size, max_writable);
diff --git a/kernel/kernel/filesystem/ext2/inode.tests.cpp b/kernel/kernel/filesystem/ext2/inode.tests.cpp
index 7448181c..549e2032 100644
--- a/kernel/kernel/filesystem/ext2/inode.tests.cpp
+++ b/kernel/kernel/filesystem/ext2/inode.tests.cpp
@@ -316,6 +316,12 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_fixture, "Ext2 in
auto const text = std::string_view{reinterpret_cast<char const *>(read_buffer.data()), *bytes_read};
REQUIRE(text == "Hello W");
}
+
+ THEN("writing to a an inode of type directory panics")
+ {
+ auto write_buffer = kstd::vector<std::byte>(12, std::byte{0xAA});
+ REQUIRE_THROWS_AS(information->write(write_buffer.data(), 0, write_buffer.size()), kernel::tests::cpu::halt);
+ }
}
}
@@ -337,6 +343,7 @@ SCENARIO("Ext2 inode write across block boundaries", "[filesystem][ext2][inode]"
inode_data.size = block_size * 2;
inode_data.block[0] = 20;
inode_data.block[1] = 21;
+ inode_data.mode = kernel::filesystem::ext2::constants::mode_regular;
auto inode = kernel::filesystem::ext2::inode{&fs, inode_data};