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 | |
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')
-rw-r--r-- | kernel/fs/ext2.c | 20 | ||||
-rw-r--r-- | kernel/fs/vfs.c | 4 |
2 files changed, 12 insertions, 12 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) { diff --git a/kernel/fs/vfs.c b/kernel/fs/vfs.c index 8c9e08d..2347369 100644 --- a/kernel/fs/vfs.c +++ b/kernel/fs/vfs.c @@ -95,7 +95,6 @@ int vfs_create_file(const char *file) { file); return 0; } - // ext2_create_file("/etc/oscreated", 0); assert(file_mount->local_root->create_file); return file_mount->local_root->create_file(file, 0); } @@ -127,7 +126,6 @@ vfs_inode_t *vfs_internal_open(const char *file) { } char *vfs_clean_path(const char *path, char *resolved_path) { - // char *const clean = kmalloc(strlen(path) + 1); char *clean = resolved_path; int prev_slash = 0; char *ptr = clean; @@ -151,12 +149,10 @@ char *vfs_resolve_path(const char *file, char *resolved_path) { size_t l = strlen(cwd); assert(l > 0); assert('/' == cwd[l - 1]); - // char *r = kmalloc(l + strlen(file) + 1); char r[256]; strcpy(r, cwd); strcat(r, file); char *final = vfs_clean_path(r, resolved_path); - // kfree(r); return final; } |