summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2022-12-04 21:28:25 +0100
committerAleksa Vuckovic <aleksav013@gmail.com>2022-12-04 21:43:38 +0100
commit9ec2aeb349d3d935f61c195244b6464e939f4b51 (patch)
tree94c0fdd8d4e672c495c9abecc00a2b9a3620b89e /kernel
parent57fc2b58f362a361188856ed73dbb7391df66938 (diff)
ext2.c: terminating buff; handling incorrect use
Diffstat (limited to 'kernel')
-rw-r--r--kernel/src/fs/ext2.c24
-rw-r--r--kernel/src/libk/string.c3
-rw-r--r--kernel/src/main.c1
3 files changed, 25 insertions, 3 deletions
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();