From 9ec2aeb349d3d935f61c195244b6464e939f4b51 Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Sun, 4 Dec 2022 21:28:25 +0100 Subject: ext2.c: terminating buff; handling incorrect use --- kernel/src/fs/ext2.c | 24 +++++++++++++++++++++--- kernel/src/libk/string.c | 3 +++ kernel/src/main.c | 1 + 3 files changed, 25 insertions(+), 3 deletions(-) (limited to 'kernel/src') diff --git a/kernel/src/fs/ext2.c b/kernel/src/fs/ext2.c index 751cf64..f4460c7 100644 --- a/kernel/src/fs/ext2.c +++ b/kernel/src/fs/ext2.c @@ -122,6 +122,10 @@ dentry_list_t* directory_to_entries(uint32_t inode) char* files_to_buffer(uint32_t inode) { + if (inode < 2) { + return NULL; + } + uint32_t bg_desc = (inode - 1) / ext2_superblock->inodes_per_group; uint32_t inode_index = (inode - 1) % ext2_superblock->inodes_per_group; @@ -135,10 +139,17 @@ char* files_to_buffer(uint32_t inode) ext2_inode = (ext2_inode_t*)kalloc(sizeof(ext2_inode_t)); read_inode(ext2_bg_desc->inode_block_address, inode_index, ext2_inode); + if (ext2_inode->type_perms & TYPE_DIR) { + printf("can't print directory\n"); + kfree(ext2_bg_desc); + kfree(ext2_inode); + return NULL; + } + char* data; uint32_t size = ext2_inode->size_lower; - data = (char*)kalloc(size); + data = (char*)kalloc(size + 1); uint32_t block_num = upper_div(size, BLOCK_SIZE); for (size_t i = 0; i < min(block_num, 12); i++) { @@ -146,6 +157,10 @@ char* files_to_buffer(uint32_t inode) read_block(ext2_inode->dbp[i], block); memcpy(data + i * BLOCK_SIZE, block, size >= (i + 1) * BLOCK_SIZE ? BLOCK_SIZE : size % BLOCK_SIZE); } + data[size] = '\0'; + + kfree(ext2_bg_desc); + kfree(ext2_inode); return data; } @@ -257,7 +272,10 @@ void ls(uint32_t inode) void print(uint32_t inode) { - printf("contents of inode %d:\n", inode); char *p = files_to_buffer(inode); - printf("%s", p); + if (p != NULL) { + printf("contents of inode %d:\n", inode); + printf("%s", p); + kfree(p); + } } diff --git a/kernel/src/libk/string.c b/kernel/src/libk/string.c index 4cee538..8b2b2c6 100644 --- a/kernel/src/libk/string.c +++ b/kernel/src/libk/string.c @@ -3,6 +3,9 @@ size_t strlen(const char* s) { + if (s == NULL) + return 0; + char *p = (char*)s; while (*p) p++; return (size_t)(p - s); diff --git a/kernel/src/main.c b/kernel/src/main.c index 2b4be32..5b55c09 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -42,6 +42,7 @@ int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) disc_init(); ext2_init(); ls(path_to_inode("/")); + print(path_to_inode("/")); init_tss(); jump_userspace(); -- cgit v1.2.3