Skip to content
Snippets Groups Projects
Commit d0180280 authored by Stephen Warren's avatar Stephen Warren Committed by Tom Rini
Browse files

fs: ext4: fix writing zero-length files


ext4fs_allocate_blocks() always allocates at least one block for a file.
If the file size is zero, this causes total_remaining_blocks to
underflow, which then causes an apparent hang while 2^32 blocks are
allocated.

To solve this, check that total_remaining_blocks is non-zero as part of
the loop condition (i.e. before each loop) rather than at the end of
the loop.

Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
parent 50babaf8
Branches
Tags
No related merge requests found
...@@ -1380,7 +1380,7 @@ void ext4fs_allocate_blocks(struct ext2_inode *file_inode, ...@@ -1380,7 +1380,7 @@ void ext4fs_allocate_blocks(struct ext2_inode *file_inode,
unsigned int no_blks_reqd = 0; unsigned int no_blks_reqd = 0;
/* allocation of direct blocks */ /* allocation of direct blocks */
for (i = 0; i < INDIRECT_BLOCKS; i++) { for (i = 0; total_remaining_blocks && i < INDIRECT_BLOCKS; i++) {
direct_blockno = ext4fs_get_new_blk_no(); direct_blockno = ext4fs_get_new_blk_no();
if (direct_blockno == -1) { if (direct_blockno == -1) {
printf("no block left to assign\n"); printf("no block left to assign\n");
...@@ -1390,8 +1390,6 @@ void ext4fs_allocate_blocks(struct ext2_inode *file_inode, ...@@ -1390,8 +1390,6 @@ void ext4fs_allocate_blocks(struct ext2_inode *file_inode,
debug("DB %ld: %u\n", direct_blockno, total_remaining_blocks); debug("DB %ld: %u\n", direct_blockno, total_remaining_blocks);
total_remaining_blocks--; total_remaining_blocks--;
if (total_remaining_blocks == 0)
break;
} }
alloc_single_indirect_block(file_inode, &total_remaining_blocks, alloc_single_indirect_block(file_inode, &total_remaining_blocks,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment