diff options
| author | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-12-04 21:28:25 +0100 |
|---|---|---|
| committer | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-12-04 21:43:38 +0100 |
| commit | 9ec2aeb349d3d935f61c195244b6464e939f4b51 (patch) | |
| tree | 94c0fdd8d4e672c495c9abecc00a2b9a3620b89e /kernel/src/fs | |
| parent | 57fc2b58f362a361188856ed73dbb7391df66938 (diff) | |
ext2.c: terminating buff; handling incorrect use
Diffstat (limited to 'kernel/src/fs')
| -rw-r--r-- | kernel/src/fs/ext2.c | 24 |
1 files changed, 21 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); + } } |
