diff options
author | Theodore Ts'o <tytso@mit.edu> | 1998-09-03 01:26:03 +0000 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 1998-09-03 01:26:03 +0000 |
commit | 7f813ba33711902f5e557da49f98622532e7556d (patch) | |
tree | d26c3e2ef12c61bd5fe57a8ee661aaab589a4233 /e2fsck | |
parent | 2eb374c9401079aa56aa12f0047ca3866e69b754 (diff) | |
download | e2fsprogs-7f813ba33711902f5e557da49f98622532e7556d.tar.gz |
ChangeLog, pass3.c, pass4.c, problem.c, problem.h, super.c:
problem.c: Add PR_3_NO_DIRINFO error code.
super.c (check_super_value): Rename min and max to min_val and max_val
to avoid possible cpp macro conflicts.
pass4.c (e2fsck_pass4): Rename max to maxgroup, to avoid possible cpp
macro conflicts.
pass3.c (e2fsck_pass3): Rename max to maxdirs, to avoid possible cpp
macro conflicts.
(check_directory): Fix logic to avoid possible core dump in the
case of ext2fs_get_dir_info returning NULL. (By the time we get here,
it should never happen, but...). Also simply/streamline the control
flow of the function.
Diffstat (limited to 'e2fsck')
-rw-r--r-- | e2fsck/ChangeLog | 17 | ||||
-rw-r--r-- | e2fsck/pass3.c | 60 | ||||
-rw-r--r-- | e2fsck/pass4.c | 8 | ||||
-rw-r--r-- | e2fsck/problem.c | 5 | ||||
-rw-r--r-- | e2fsck/problem.h | 3 | ||||
-rw-r--r-- | e2fsck/super.c | 8 |
6 files changed, 65 insertions, 36 deletions
diff --git a/e2fsck/ChangeLog b/e2fsck/ChangeLog index 59db2cc4..7ef240ef 100644 --- a/e2fsck/ChangeLog +++ b/e2fsck/ChangeLog @@ -1,3 +1,20 @@ +1998-09-02 Theodore Ts'o <tytso@rsts-11.mit.edu> + + * problem.c: Add PR_3_NO_DIRINFO error code. + + * super.c (check_super_value): Rename min and max to min_val and + max_val to avoid possible cpp macro conflicts. + + * pass4.c (e2fsck_pass4): Rename max to maxgroup, to avoid + possible cpp macro conflicts. + + * pass3.c (e2fsck_pass3): Rename max to maxdirs, to avoid possible + cpp macro conflicts. + (check_directory): Fix logic to avoid possible core dump + in the case of ext2fs_get_dir_info returning NULL. (By + the time we get here, it should never happen, but...). + Also simply/streamline the control flow of the function. + 1998-08-17 Theodore Ts'o <tytso@rsts-11.mit.edu> * unix.c (check_if_skip): Move the "not cleanly mounted" check diff --git a/e2fsck/pass3.c b/e2fsck/pass3.c index c87ebd9c..07006982 100644 --- a/e2fsck/pass3.c +++ b/e2fsck/pass3.c @@ -64,7 +64,7 @@ void e2fsck_pass3(e2fsck_t ctx) #endif struct problem_context pctx; struct dir_info *dir; - unsigned long max, count; + unsigned long maxdirs, count; #ifdef RESOURCE_TRACK init_resource_track(&rtrack); @@ -109,16 +109,16 @@ void e2fsck_pass3(e2fsck_t ctx) ext2fs_mark_inode_bitmap(inode_done_map, EXT2_ROOT_INO); - max = e2fsck_get_num_dirinfo(ctx); + maxdirs = e2fsck_get_num_dirinfo(ctx); count = 1; if (ctx->progress) - if ((ctx->progress)(ctx, 3, 0, max)) + if ((ctx->progress)(ctx, 3, 0, maxdirs)) goto abort_exit; for (i=0; (dir = e2fsck_dir_info_iter(ctx, &i)) != 0;) { if (ctx->progress) - if ((ctx->progress)(ctx, 3, count++, max)) + if ((ctx->progress)(ctx, 3, count++, maxdirs)) goto abort_exit; if (ext2fs_test_inode_bitmap(ctx->inode_dir_map, dir->ino)) check_directory(ctx, dir, &pctx); @@ -256,17 +256,19 @@ static void check_directory(e2fsck_t ctx, struct dir_info *dir, ext2_filsys fs = ctx->fs; struct dir_info *p = dir; + if (!p) + return; + ext2fs_clear_inode_bitmap(inode_loop_detect); - while (p) { - /* - * If we find a parent which we've already checked, - * then stop; we know it's either already connected to - * the directory tree, or it isn't but the user has - * already told us he doesn't want us to reconnect the - * disconnected subtree. - */ - if (ext2fs_test_inode_bitmap(inode_done_map, p->ino)) - goto check_dot_dot; + + /* + * Keep going until we find a parent which we've already + * checked. We know it's either already connected to the + * directory tree, or it isn't but the user has already told + * us he doesn't want us to reconnect the disconnected + * subtree. + */ + while (!ext2fs_test_inode_bitmap(inode_done_map, p->ino)) { /* * Mark this inode as being "done"; by the time we * return from this function, the inode we either be @@ -275,6 +277,7 @@ static void check_directory(e2fsck_t ctx, struct dir_info *dir, * lost+found. */ ext2fs_mark_inode_bitmap(inode_done_map, p->ino); + /* * If this directory doesn't have a parent, or we've * seen the parent once already, then offer to @@ -282,23 +285,25 @@ static void check_directory(e2fsck_t ctx, struct dir_info *dir, */ if (!p->parent || (ext2fs_test_inode_bitmap(inode_loop_detect, - p->parent))) + p->parent))) { + pctx->ino = p->ino; + if (fix_problem(ctx, PR_3_UNCONNECTED_DIR, pctx)) { + if (e2fsck_reconnect_file(ctx, p->ino)) + ext2fs_unmark_valid(fs); + else { + p->parent = lost_and_found; + fix_dotdot(ctx, p, lost_and_found); + } + } break; + } ext2fs_mark_inode_bitmap(inode_loop_detect, p->parent); + pctx->ino = p->parent; p = e2fsck_get_dir_info(ctx, p->parent); - } - /* - * If we've reached here, we've hit a detached directory - * inode; offer to reconnect it to lost+found. - */ - pctx->ino = p->ino; - if (fix_problem(ctx, PR_3_UNCONNECTED_DIR, pctx)) { - if (e2fsck_reconnect_file(ctx, p->ino)) - ext2fs_unmark_valid(fs); - else { - p->parent = lost_and_found; - fix_dotdot(ctx, p, lost_and_found); + if (!p) { + fix_problem(ctx, PR_3_NO_DIRINFO, pctx); + return; } } @@ -306,7 +311,6 @@ static void check_directory(e2fsck_t ctx, struct dir_info *dir, * Make sure that .. and the parent directory are the same; * offer to fix it if not. */ -check_dot_dot: if (dir->parent != dir->dotdot) { pctx->ino = dir->ino; pctx->ino2 = dir->dotdot; diff --git a/e2fsck/pass4.c b/e2fsck/pass4.c index f65785a7..adde7643 100644 --- a/e2fsck/pass4.c +++ b/e2fsck/pass4.c @@ -85,7 +85,7 @@ void e2fsck_pass4(e2fsck_t ctx) #endif struct problem_context pctx; __u16 link_count, link_counted; - int group, max; + int group, maxgroup; #ifdef RESOURCE_TRACK init_resource_track(&rtrack); @@ -101,16 +101,16 @@ void e2fsck_pass4(e2fsck_t ctx) fix_problem(ctx, PR_4_PASS_HEADER, &pctx); group = 0; - max = fs->group_desc_count; + maxgroup = fs->group_desc_count; if (ctx->progress) - if ((ctx->progress)(ctx, 4, 0, max)) + if ((ctx->progress)(ctx, 4, 0, maxgroup)) return; for (i=1; i <= fs->super->s_inodes_count; i++) { if ((i % fs->super->s_inodes_per_group) == 0) { group++; if (ctx->progress) - if ((ctx->progress)(ctx, 4, group, max)) + if ((ctx->progress)(ctx, 4, group, maxgroup)) return; } if (i == EXT2_BAD_INO || diff --git a/e2fsck/problem.c b/e2fsck/problem.c index f996b9bb..d6f67744 100644 --- a/e2fsck/problem.c +++ b/e2fsck/problem.c @@ -787,6 +787,11 @@ static const struct e2fsck_problem problem_table[] = { "Cannot proceed without a @r.\n", PROMPT_NONE, PR_FATAL }, + /* Internal error: couldn't find dir_info */ + { PR_3_NO_DIRINFO, + "Internal error: couldn't find dir_info for %i.\n", + PROMPT_NONE, PR_FATAL }, + /* Pass 4 errors */ /* Pass 4: Checking reference counts */ diff --git a/e2fsck/problem.h b/e2fsck/problem.h index fdc9d2d0..0f16ba68 100644 --- a/e2fsck/problem.h +++ b/e2fsck/problem.h @@ -472,6 +472,9 @@ struct problem_context { /* Cannot proceed without a root inode. */ #define PR_3_NO_ROOT_INODE_ABORT 0x030015 +/* Internal error: couldn't find dir_info */ +#define PR_3_NO_DIRINFO 0x020016 + /* * Pass 4 errors */ diff --git a/e2fsck/super.c b/e2fsck/super.c index f5dc7f2e..ce33c3aa 100644 --- a/e2fsck/super.c +++ b/e2fsck/super.c @@ -24,12 +24,12 @@ static void check_super_value(e2fsck_t ctx, const char *descr, unsigned long value, int flags, - unsigned long min, unsigned long max) + unsigned long min_val, unsigned long max_val) { struct problem_context pctx; - if (((flags & MIN_CHECK) && (value < min)) || - ((flags & MAX_CHECK) && (value > max))) { + if (((flags & MIN_CHECK) && (value < min_val)) || + ((flags & MAX_CHECK) && (value > max_val))) { clear_problem_context(&pctx); pctx.num = value; pctx.str = descr; @@ -57,7 +57,7 @@ void check_super_block(e2fsck_t ctx) blk_t first_block, last_block; struct ext2fs_sb *s = (struct ext2fs_sb *) fs->super; blk_t blocks_per_group = fs->super->s_blocks_per_group; - int i; + dgrp_t i; blk_t should_be; struct problem_context pctx; |