From: Darrick J. Wong Date: Sun, 3 Aug 2014 02:18:29 +0000 (-0400) Subject: e2fsck: never free critical metadata blocks in the block found map X-Git-Tag: v1.43-WIP-2015-05-18~265 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=409f3884b54092c4b160e33d731b2218e48dbec3;p=thirdparty%2Fe2fsprogs.git e2fsck: never free critical metadata blocks in the block found map Don't allow critical metadata blocks to be marked free in the block found map. This can theoretically happen on an FS where a first inode's ETB/indirect map block is in the inode table, the first inode is itself unclonable (and thus gets deleted) and there are enough crosslinked files before and after the first inode to use up all the free blocks during pass 1b. (I do actually have a test FS image but it's 256M and it proved very difficult to craft a bite-sized test case that actually hit this bug.) Signed-off-by: Darrick J. Wong Signed-off-by: Theodore Ts'o --- diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c index 26fe60cb8..e7a6acd26 100644 --- a/e2fsck/pass1.c +++ b/e2fsck/pass1.c @@ -3356,6 +3356,13 @@ static void e2fsck_block_alloc_stats(ext2_filsys fs, blk64_t blk, int inuse) { e2fsck_t ctx = (e2fsck_t) fs->priv_data; + /* Never free a critical metadata block */ + if (ctx->block_found_map && + ctx->block_metadata_map && + inuse < 0 && + ext2fs_test_block_bitmap2(ctx->block_metadata_map, blk)) + return; + if (ctx->block_found_map) { if (inuse > 0) ext2fs_mark_block_bitmap2(ctx->block_found_map, blk);