summaryrefslogtreecommitdiff
path: root/kernel/fs/ext2.c
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2023-11-16 15:12:50 +0100
committerAnton Kling <anton@kling.gg>2023-11-16 15:12:50 +0100
commit6164f8564e94ffa7ee8fbfcc82f4350a35ab08a5 (patch)
tree0a59f947220c7e3f687c30178053d8db494e74fb /kernel/fs/ext2.c
parentf4cf0cac3fbefce2454a0e96ab32000a12b54253 (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.c20
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) {