forked from Bananymous/banan-os
Kernel: Ext2 directory functions now fail on invalid blocks
Invalid blocks should only happen while writing to a file and I think in that case we should just bail out instead of giving you incomlete inode list or search result.
This commit is contained in:
parent
a6e5a0b704
commit
dbf7d9f19e
|
@ -217,6 +217,8 @@ namespace Kernel
|
||||||
|
|
||||||
BAN::ErrorOr<size_t> Ext2Inode::read(size_t offset, void* buffer, size_t count)
|
BAN::ErrorOr<size_t> Ext2Inode::read(size_t offset, void* buffer, size_t count)
|
||||||
{
|
{
|
||||||
|
// FIXME: update atime if needed
|
||||||
|
|
||||||
if (ifdir())
|
if (ifdir())
|
||||||
return BAN::Error::from_errno(EISDIR);
|
return BAN::Error::from_errno(EISDIR);
|
||||||
|
|
||||||
|
@ -231,7 +233,7 @@ namespace Kernel
|
||||||
const uint32_t last_block = BAN::Math::div_round_up<uint32_t>(offset + count, block_size);
|
const uint32_t last_block = BAN::Math::div_round_up<uint32_t>(offset + count, block_size);
|
||||||
|
|
||||||
size_t n_read = 0;
|
size_t n_read = 0;
|
||||||
|
|
||||||
for (uint32_t block = first_block; block < last_block; block++)
|
for (uint32_t block = first_block; block < last_block; block++)
|
||||||
{
|
{
|
||||||
uint32_t block_index = TRY(data_block_index(block));
|
uint32_t block_index = TRY(data_block_index(block));
|
||||||
|
@ -257,15 +259,9 @@ namespace Kernel
|
||||||
|
|
||||||
for (uint32_t i = 0; i < data_block_count; i++)
|
for (uint32_t i = 0; i < data_block_count; i++)
|
||||||
{
|
{
|
||||||
auto data_block_index_or_error = data_block_index(i);
|
uint32_t block_index = TRY(data_block_index(i));
|
||||||
if (data_block_index_or_error.is_error())
|
auto block_data = TRY(m_fs.read_block(block_index));
|
||||||
{
|
|
||||||
dprintln("{}", data_block_index_or_error.error());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto block_data = TRY(m_fs.read_block(data_block_index_or_error.value()));
|
|
||||||
|
|
||||||
const uint8_t* block_data_end = block_data.data() + block_data.size();
|
const uint8_t* block_data_end = block_data.data() + block_data.size();
|
||||||
const uint8_t* entry_addr = block_data.data();
|
const uint8_t* entry_addr = block_data.data();
|
||||||
|
|
||||||
|
@ -293,14 +289,8 @@ namespace Kernel
|
||||||
|
|
||||||
for (uint32_t i = 0; i < data_block_count; i++)
|
for (uint32_t i = 0; i < data_block_count; i++)
|
||||||
{
|
{
|
||||||
auto data_block_index_or_error = data_block_index(i);
|
uint32_t block_index = TRY(data_block_index(i));
|
||||||
if (data_block_index_or_error.is_error())
|
auto block_data = TRY(m_fs.read_block(block_index));
|
||||||
{
|
|
||||||
dprintln("{}", data_block_index_or_error.error());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto block_data = TRY(m_fs.read_block(data_block_index_or_error.value()));
|
|
||||||
|
|
||||||
const uint8_t* block_data_end = block_data.data() + block_data.size();
|
const uint8_t* block_data_end = block_data.data() + block_data.size();
|
||||||
const uint8_t* entry_addr = block_data.data();
|
const uint8_t* entry_addr = block_data.data();
|
||||||
|
|
Loading…
Reference in New Issue