]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
e2fsck: detect holes in extent-mapped directories
authorTheodore Ts'o <tytso@mit.edu>
Sun, 29 Nov 2009 05:06:10 +0000 (00:06 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 29 Nov 2009 06:03:04 +0000 (01:03 -0500)
Directories are not allowed to be sparse; the code for scanning
extent-mapped directories was not calling ext2fs_add_dir_block() for
missing directory blocks, so we weren't catching this form of file
system corruption.  Fix this.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
e2fsck/pass1.c

index d2021dd2f76d2e3036877b29b1cea04bbcea049b..a241c236994b42d72036aedba8776cd6347149ba 100644 (file)
@@ -1725,6 +1725,16 @@ static void scan_extent_node(e2fsck_t ctx, struct problem_context *pctx,
                        }
                        pb->fragmented = 1;
                }
+               while (is_dir && ++pb->last_db_block < extent.e_lblk) {
+                       pctx->errcode = ext2fs_add_dir_block(ctx->fs->dblist,
+                                                            pb->ino, 0,
+                                                            pb->last_db_block);
+                       if (pctx->errcode) {
+                               pctx->blk = 0;
+                               pctx->num = pb->last_db_block;
+                               goto failed_add_dir_block;
+                       }
+               }
                for (blk = extent.e_pblk, blockcnt = extent.e_lblk, i = 0;
                     i < extent.e_len;
                     blk++, blockcnt++, i++) {
@@ -1735,6 +1745,7 @@ static void scan_extent_node(e2fsck_t ctx, struct problem_context *pctx,
                                if (pctx->errcode) {
                                        pctx->blk = blk;
                                        pctx->num = blockcnt;
+                               failed_add_dir_block:
                                        fix_problem(ctx, PR_1_ADD_DBLOCK, pctx);
                                        /* Should never get here */
                                        ctx->flags |= E2F_FLAG_ABORT;
@@ -1742,6 +1753,8 @@ static void scan_extent_node(e2fsck_t ctx, struct problem_context *pctx,
                                }
                        }
                }
+               if (is_dir && extent.e_len > 0)
+                       pb->last_db_block = blockcnt - 1;
                pb->num_blocks += extent.e_len;
                pb->previous_block = extent.e_pblk + extent.e_len - 1;
                start_block = extent.e_lblk + extent.e_len - 1;