aboutsummaryrefslogtreecommitdiff
path: root/e2fsck
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>1998-09-03 01:26:03 +0000
committerTheodore Ts'o <tytso@mit.edu>1998-09-03 01:26:03 +0000
commit7f813ba33711902f5e557da49f98622532e7556d (patch)
treed26c3e2ef12c61bd5fe57a8ee661aaab589a4233 /e2fsck
parent2eb374c9401079aa56aa12f0047ca3866e69b754 (diff)
downloade2fsprogs-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/ChangeLog17
-rw-r--r--e2fsck/pass3.c60
-rw-r--r--e2fsck/pass4.c8
-rw-r--r--e2fsck/problem.c5
-rw-r--r--e2fsck/problem.h3
-rw-r--r--e2fsck/super.c8
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;