diff options
author | Anton Kling <anton@kling.gg> | 2023-11-16 15:12:50 +0100 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2023-11-16 15:12:50 +0100 |
commit | 6164f8564e94ffa7ee8fbfcc82f4350a35ab08a5 (patch) | |
tree | 0a59f947220c7e3f687c30178053d8db494e74fb /kernel/fs/ext2.c | |
parent | f4cf0cac3fbefce2454a0e96ab32000a12b54253 (diff) |
ext2: Fix directory resolution
Previously a parsing of /usr/../ would fail as it would be searching '/'
for a empty file even though the desired outcome if for it to stop
parsing after reaching '/'. The solution is to give the current
directory inode if the file searched for in the directory is empty.
Diffstat (limited to 'kernel/fs/ext2.c')
-rw-r--r-- | kernel/fs/ext2.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/kernel/fs/ext2.c b/kernel/fs/ext2.c index 69de441..cb4a0d4 100644 --- a/kernel/fs/ext2.c +++ b/kernel/fs/ext2.c @@ -168,6 +168,9 @@ void ext2_write_inode(int inode_index, inode_t *data) { int ext2_get_inode_in_directory(int dir_inode, char *file, direntry_header_t *entry) { + if ('\0' == *file) { + return dir_inode; + } u64 file_size; ASSERT_BUT_FIXME_PROPOGATE(-1 != read_inode(dir_inode, NULL, 0, 0, &file_size)); @@ -500,18 +503,19 @@ int ext2_write(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) { } int ext2_read(u8 *buffer, u64 offset, u64 len, vfs_fd_t *fd) { - u64 file_size; - int rc; int inode_num = fd->inode->inode_num; - if (fd->inode->type == FS_TYPE_DIRECTORY) { - rc = ext2_read_dir(inode_num, buffer, len, offset); - return rc; - } if (fd->inode->type == FS_TYPE_LINK) { inode_num = resolve_link(inode_num); } - rc = read_inode(inode_num, buffer, len, offset, &file_size); - return rc; + u8 inode_buffer[inode_size]; + ext2_get_inode_header(inode_num, (inode_t *)inode_buffer); + inode_t *inode = (inode_t *)inode_buffer; + + if (DIRECTORY & inode->types_permissions) { + return ext2_read_dir(inode_num, buffer, len, offset); + } + + return read_inode(inode_num, buffer, len, offset, NULL); } int ext2_stat(vfs_fd_t *fd, struct stat *buf) { |