All of lore.kernel.org
 help / color / mirror / Atom feed
* (unknown)
@ 2009-01-22  8:56 Eric Sesterhenn
  2009-01-22 11:12 ` e2fsck faults with corrupted images Eric Sesterhenn
  0 siblings, 1 reply; 11+ messages in thread
From: Eric Sesterhenn @ 2009-01-22  8:56 UTC (permalink / raw)
  To: pavel, tytso; +Cc: linux-ext4

As suggested by pavel i tested how e2fsck handles corrupted images,
I used the fuzzer bunny (http://code.google.com/p/bunny-the-fuzzer/)
At http://www.cccmz.de/~snakebyte/e2fsck_err.tar.bz2 you
can find a bunch of images crashing e2fsck or keeping it in an endless
loop. I tested with e2fsck 1.41.0 which was the one i had at hand.

The crashes are either in ext2fs_inode_alloc_stats2() or
ext2fs_read_inode_full(), looks like those are always the same
faults.

000	endless loop
000	endless loop
053	ext2fs_inode_alloc_stats2
054	ext2fs_inode_alloc_stats2
073	different endless loop?
086	ext2fs_inode_alloc_stats2
112	ext2fs_read_inode_full
139	ext2fs_inode_alloc_stats2
143	ext2fs_inode_alloc_stats2
161	ext2fs_inode_alloc_stats2
192	ext2fs_inode_alloc_stats2
209	ext2fs_inode_alloc_stats2
214	endless loop
216	ext2fs_read_inode_full
241	endless loop
266	endless loop
303	ext2fs_inode_alloc_stats2
389	ext2fs_inode_alloc_stats2
438	ext2fs_inode_alloc_stats2
440	endless loop
446	ext2fs_inode_alloc_stats2
449	ext2fs_read_inode_full
451	ext2fs_read_inode_full
455	ext2fs_read_inode_full
518	ext2fs_inode_alloc_stats2
530	ext2fs_inode_alloc_stats2
534	ext2fs_inode_alloc_stats2

Greetings, Eric

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: e2fsck faults with corrupted images
  2009-01-22  8:56 (unknown) Eric Sesterhenn
@ 2009-01-22 11:12 ` Eric Sesterhenn
  2009-01-22 21:12   ` Theodore Tso
  0 siblings, 1 reply; 11+ messages in thread
From: Eric Sesterhenn @ 2009-01-22 11:12 UTC (permalink / raw)
  To: pavel, tytso; +Cc: linux-ext4

* Eric Sesterhenn (snakebyte@gmx.de) wrote:
> As suggested by pavel i tested how e2fsck handles corrupted images,
> I used the fuzzer bunny (http://code.google.com/p/bunny-the-fuzzer/)
> At http://www.cccmz.de/~snakebyte/e2fsck_err.tar.bz2 you
> can find a bunch of images crashing e2fsck or keeping it in an endless
> loop. I tested with e2fsck 1.41.0 which was the one i had at hand.
> 
> The crashes are either in ext2fs_inode_alloc_stats2() or
> ext2fs_read_inode_full(), looks like those are always the same
> faults.

I just tried again with e2sck 1.41.3 and I can still
produce the errors.

Greetings, Eric

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: e2fsck faults with corrupted images
  2009-01-22 11:12 ` e2fsck faults with corrupted images Eric Sesterhenn
@ 2009-01-22 21:12   ` Theodore Tso
  2009-01-22 21:32     ` [PATCH] e2fsck: Add superblock check to make sure s_first_ino is valid Theodore Ts'o
  2009-01-22 21:33     ` [PATCH] e2fsck: Add superblock check to make sure s_first_ino is valid Theodore Ts'o
  0 siblings, 2 replies; 11+ messages in thread
From: Theodore Tso @ 2009-01-22 21:12 UTC (permalink / raw)
  To: Eric Sesterhenn; +Cc: pavel, linux-ext4

On Thu, Jan 22, 2009 at 12:12:01PM +0100, Eric Sesterhenn wrote:
> * Eric Sesterhenn (snakebyte@gmx.de) wrote:
> > As suggested by pavel i tested how e2fsck handles corrupted images,
> > I used the fuzzer bunny (http://code.google.com/p/bunny-the-fuzzer/)
> > At http://www.cccmz.de/~snakebyte/e2fsck_err.tar.bz2 you
> > can find a bunch of images crashing e2fsck or keeping it in an endless
> > loop. I tested with e2fsck 1.41.0 which was the one i had at hand.
> > 
> > The crashes are either in ext2fs_inode_alloc_stats2() or
> > ext2fs_read_inode_full(), looks like those are always the same
> > faults.

Thanks, they were all traced to the superblock parameter s_first_ino
being extremely large --- much larger than s_inodes_count.  I've
committed the following patches to address the problem at multiple
levels.

							- Ted

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH] e2fsck: Add superblock check to make sure s_first_ino is valid
  2009-01-22 21:12   ` Theodore Tso
@ 2009-01-22 21:32     ` Theodore Ts'o
  2009-01-22 21:32       ` [PATCH] ext2fs_new_inode(): Add sanity check to assure a valid inode number Theodore Ts'o
  2009-01-22 21:33     ` [PATCH] e2fsck: Add superblock check to make sure s_first_ino is valid Theodore Ts'o
  1 sibling, 1 reply; 11+ messages in thread
From: Theodore Ts'o @ 2009-01-22 21:32 UTC (permalink / raw)
  To: Ext4 Developers List; +Cc: Eric Sesterhenn, Theodore Ts'o

An deliberately corrupted filesystem with an insanely large
s_first_ino field could cause e2fsck to crash with a seg fault.

Thanks to Eric Sesterhenn for supplying test cases which demonstrated
this issue.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
---
 e2fsck/super.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/e2fsck/super.c b/e2fsck/super.c
index cd2b9f0..24ec7a8 100644
--- a/e2fsck/super.c
+++ b/e2fsck/super.c
@@ -513,6 +513,10 @@ void check_super_block(e2fsck_t ctx)
 	check_super_value(ctx, "reserved_gdt_blocks",
 			  sb->s_reserved_gdt_blocks, MAX_CHECK, 0,
 			  fs->blocksize/4);
+	if (sb->s_rev_level > EXT2_GOOD_OLD_REV)
+		check_super_value(ctx, "first_ino", sb->s_first_ino,
+				  MIN_CHECK | MAX_CHECK,
+				  EXT2_GOOD_OLD_FIRST_INO, sb->s_inodes_count);
 	inode_size = EXT2_INODE_SIZE(sb);
 	check_super_value(ctx, "inode_size",
 			  inode_size, MIN_CHECK | MAX_CHECK,
-- 
1.6.0.4.8.g36f27.dirty


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH] ext2fs_new_inode(): Add sanity check to assure a valid inode number
  2009-01-22 21:32     ` [PATCH] e2fsck: Add superblock check to make sure s_first_ino is valid Theodore Ts'o
@ 2009-01-22 21:32       ` Theodore Ts'o
  2009-01-22 21:32         ` [PATCH] libext2fs: Add sanity checks to ext2fs_{block,inode}_alloc_stats Theodore Ts'o
  0 siblings, 1 reply; 11+ messages in thread
From: Theodore Ts'o @ 2009-01-22 21:32 UTC (permalink / raw)
  To: Ext4 Developers List; +Cc: Eric Sesterhenn, Theodore Ts'o

Add a sanity check to makesure that even if the superblock field
s_first_inode is insane, that we won't return an invalid inode number.
(The function will return the error EXT2_ET_INODE_ALLOC_FAIL in that
case.)

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
---
 lib/ext2fs/alloc.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/lib/ext2fs/alloc.c b/lib/ext2fs/alloc.c
index be2b56b..ade5149 100644
--- a/lib/ext2fs/alloc.c
+++ b/lib/ext2fs/alloc.c
@@ -120,6 +120,8 @@ errcode_t ext2fs_new_inode(ext2_filsys fs, ext2_ino_t dir,
 	start_inode = (dir_group * EXT2_INODES_PER_GROUP(fs->super)) + 1;
 	if (start_inode < EXT2_FIRST_INODE(fs->super))
 		start_inode = EXT2_FIRST_INODE(fs->super);
+	if (start_inode > fs->super->s_inodes_count)
+		return EXT2_ET_INODE_ALLOC_FAIL;
 	i = start_inode;
 
 	do {
-- 
1.6.0.4.8.g36f27.dirty


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH] libext2fs: Add sanity checks to ext2fs_{block,inode}_alloc_stats
  2009-01-22 21:32       ` [PATCH] ext2fs_new_inode(): Add sanity check to assure a valid inode number Theodore Ts'o
@ 2009-01-22 21:32         ` Theodore Ts'o
  2009-01-22 21:32           ` [PATCH] e2fsck: Change PR_3_CREATE_LPF_ERROR to be a non-fatal problem Theodore Ts'o
  0 siblings, 1 reply; 11+ messages in thread
From: Theodore Ts'o @ 2009-01-22 21:32 UTC (permalink / raw)
  To: Ext4 Developers List; +Cc: Eric Sesterhenn, Theodore Ts'o

If ext2fs_inode_alloc_stats2() or ext2fs_block_alloc_stats() is passed
an insanely large inode or block number, it's possible for these
functions to overrun an array boundary and cause the calling program
to crash with a memory error.

Detect this case, and since these functions don't return an error
code, print a warning message, much like we do in ext2fs_warn_bitmap2().

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
---
 lib/ext2fs/alloc_stats.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/lib/ext2fs/alloc_stats.c b/lib/ext2fs/alloc_stats.c
index 97661dc..d523b43 100644
--- a/lib/ext2fs/alloc_stats.c
+++ b/lib/ext2fs/alloc_stats.c
@@ -20,6 +20,13 @@ void ext2fs_inode_alloc_stats2(ext2_filsys fs, ext2_ino_t ino,
 {
 	int	group = ext2fs_group_of_ino(fs, ino);
 
+#ifndef OMIT_COM_ERR
+	if (ino > fs->super->s_inodes_count) {
+		com_err("ext2fs_inode_alloc_stats2", 0,
+			"Illegal inode number: %lu", ino);
+		return;
+	}
+#endif
 	if (inuse > 0)
 		ext2fs_mark_inode_bitmap(fs->inode_map, ino);
 	else
@@ -58,6 +65,13 @@ void ext2fs_block_alloc_stats(ext2_filsys fs, blk_t blk, int inuse)
 {
 	int	group = ext2fs_group_of_blk(fs, blk);
 
+#ifndef OMIT_COM_ERR
+	if (blk >= fs->super->s_blocks_count) {
+		com_err("ext2fs_block_alloc_stats2", 0,
+			"Illegal block number: %lu", blk);
+		return;
+	}
+#endif
 	if (inuse > 0)
 		ext2fs_mark_block_bitmap(fs->block_map, blk);
 	else
-- 
1.6.0.4.8.g36f27.dirty


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH] e2fsck: Change PR_3_CREATE_LPF_ERROR to be a non-fatal problem
  2009-01-22 21:32         ` [PATCH] libext2fs: Add sanity checks to ext2fs_{block,inode}_alloc_stats Theodore Ts'o
@ 2009-01-22 21:32           ` Theodore Ts'o
  0 siblings, 0 replies; 11+ messages in thread
From: Theodore Ts'o @ 2009-01-22 21:32 UTC (permalink / raw)
  To: Ext4 Developers List; +Cc: Eric Sesterhenn, Theodore Ts'o

The other problem codes associated with failing to create the
lost+found directory are non-fatal, and this one should be non-fatal
as well.  The two places which call e2fsck_get_lost_and_found()
already deal with a failure to create the directory, so there's no
point making this be a fatal error.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
---
 e2fsck/problem.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/e2fsck/problem.c b/e2fsck/problem.c
index 9d193c3..3f53350 100644
--- a/e2fsck/problem.c
+++ b/e2fsck/problem.c
@@ -1386,7 +1386,7 @@ static struct e2fsck_problem problem_table[] = {
 	/* Error creating lost and found directory */
 	{ PR_3_CREATE_LPF_ERROR,
 	  N_("Error creating /@l @d (%s): %m\n"),
-	  PROMPT_NONE, PR_FATAL },
+	  PROMPT_NONE, 0 },
 
 	/* Root inode is not directory; aborting */
 	{ PR_3_ROOT_NOT_DIR_ABORT,
-- 
1.6.0.4.8.g36f27.dirty


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH] e2fsck: Add superblock check to make sure s_first_ino is valid
  2009-01-22 21:12   ` Theodore Tso
  2009-01-22 21:32     ` [PATCH] e2fsck: Add superblock check to make sure s_first_ino is valid Theodore Ts'o
@ 2009-01-22 21:33     ` Theodore Ts'o
  2009-01-22 21:33       ` [PATCH] ext2fs_new_inode(): Add sanity check to assure a valid inode number Theodore Ts'o
  1 sibling, 1 reply; 11+ messages in thread
From: Theodore Ts'o @ 2009-01-22 21:33 UTC (permalink / raw)
  To: Ext4 Developers List; +Cc: Eric Sesterhenn, Theodore Ts'o

An deliberately corrupted filesystem with an insanely large
s_first_ino field could cause e2fsck to crash with a seg fault.

Thanks to Eric Sesterhenn for supplying test cases which demonstrated
this issue.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
---
 e2fsck/super.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/e2fsck/super.c b/e2fsck/super.c
index cd2b9f0..24ec7a8 100644
--- a/e2fsck/super.c
+++ b/e2fsck/super.c
@@ -513,6 +513,10 @@ void check_super_block(e2fsck_t ctx)
 	check_super_value(ctx, "reserved_gdt_blocks",
 			  sb->s_reserved_gdt_blocks, MAX_CHECK, 0,
 			  fs->blocksize/4);
+	if (sb->s_rev_level > EXT2_GOOD_OLD_REV)
+		check_super_value(ctx, "first_ino", sb->s_first_ino,
+				  MIN_CHECK | MAX_CHECK,
+				  EXT2_GOOD_OLD_FIRST_INO, sb->s_inodes_count);
 	inode_size = EXT2_INODE_SIZE(sb);
 	check_super_value(ctx, "inode_size",
 			  inode_size, MIN_CHECK | MAX_CHECK,
-- 
1.6.0.4.8.g36f27.dirty


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH] ext2fs_new_inode(): Add sanity check to assure a valid inode number
  2009-01-22 21:33     ` [PATCH] e2fsck: Add superblock check to make sure s_first_ino is valid Theodore Ts'o
@ 2009-01-22 21:33       ` Theodore Ts'o
  2009-01-22 21:33         ` [PATCH] libext2fs: Add sanity checks to ext2fs_{block,inode}_alloc_stats Theodore Ts'o
  0 siblings, 1 reply; 11+ messages in thread
From: Theodore Ts'o @ 2009-01-22 21:33 UTC (permalink / raw)
  To: Ext4 Developers List; +Cc: Eric Sesterhenn, Theodore Ts'o

Add a sanity check to makesure that even if the superblock field
s_first_inode is insane, that we won't return an invalid inode number.
(The function will return the error EXT2_ET_INODE_ALLOC_FAIL in that
case.)

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
---
 lib/ext2fs/alloc.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/lib/ext2fs/alloc.c b/lib/ext2fs/alloc.c
index be2b56b..ade5149 100644
--- a/lib/ext2fs/alloc.c
+++ b/lib/ext2fs/alloc.c
@@ -120,6 +120,8 @@ errcode_t ext2fs_new_inode(ext2_filsys fs, ext2_ino_t dir,
 	start_inode = (dir_group * EXT2_INODES_PER_GROUP(fs->super)) + 1;
 	if (start_inode < EXT2_FIRST_INODE(fs->super))
 		start_inode = EXT2_FIRST_INODE(fs->super);
+	if (start_inode > fs->super->s_inodes_count)
+		return EXT2_ET_INODE_ALLOC_FAIL;
 	i = start_inode;
 
 	do {
-- 
1.6.0.4.8.g36f27.dirty


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH] libext2fs: Add sanity checks to ext2fs_{block,inode}_alloc_stats
  2009-01-22 21:33       ` [PATCH] ext2fs_new_inode(): Add sanity check to assure a valid inode number Theodore Ts'o
@ 2009-01-22 21:33         ` Theodore Ts'o
  2009-01-22 21:33           ` [PATCH] e2fsck: Change PR_3_CREATE_LPF_ERROR to be a non-fatal problem Theodore Ts'o
  0 siblings, 1 reply; 11+ messages in thread
From: Theodore Ts'o @ 2009-01-22 21:33 UTC (permalink / raw)
  To: Ext4 Developers List; +Cc: Eric Sesterhenn, Theodore Ts'o

If ext2fs_inode_alloc_stats2() or ext2fs_block_alloc_stats() is passed
an insanely large inode or block number, it's possible for these
functions to overrun an array boundary and cause the calling program
to crash with a memory error.

Detect this case, and since these functions don't return an error
code, print a warning message, much like we do in ext2fs_warn_bitmap2().

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
---
 lib/ext2fs/alloc_stats.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/lib/ext2fs/alloc_stats.c b/lib/ext2fs/alloc_stats.c
index 97661dc..d523b43 100644
--- a/lib/ext2fs/alloc_stats.c
+++ b/lib/ext2fs/alloc_stats.c
@@ -20,6 +20,13 @@ void ext2fs_inode_alloc_stats2(ext2_filsys fs, ext2_ino_t ino,
 {
 	int	group = ext2fs_group_of_ino(fs, ino);
 
+#ifndef OMIT_COM_ERR
+	if (ino > fs->super->s_inodes_count) {
+		com_err("ext2fs_inode_alloc_stats2", 0,
+			"Illegal inode number: %lu", ino);
+		return;
+	}
+#endif
 	if (inuse > 0)
 		ext2fs_mark_inode_bitmap(fs->inode_map, ino);
 	else
@@ -58,6 +65,13 @@ void ext2fs_block_alloc_stats(ext2_filsys fs, blk_t blk, int inuse)
 {
 	int	group = ext2fs_group_of_blk(fs, blk);
 
+#ifndef OMIT_COM_ERR
+	if (blk >= fs->super->s_blocks_count) {
+		com_err("ext2fs_block_alloc_stats2", 0,
+			"Illegal block number: %lu", blk);
+		return;
+	}
+#endif
 	if (inuse > 0)
 		ext2fs_mark_block_bitmap(fs->block_map, blk);
 	else
-- 
1.6.0.4.8.g36f27.dirty


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH] e2fsck: Change PR_3_CREATE_LPF_ERROR to be a non-fatal problem
  2009-01-22 21:33         ` [PATCH] libext2fs: Add sanity checks to ext2fs_{block,inode}_alloc_stats Theodore Ts'o
@ 2009-01-22 21:33           ` Theodore Ts'o
  0 siblings, 0 replies; 11+ messages in thread
From: Theodore Ts'o @ 2009-01-22 21:33 UTC (permalink / raw)
  To: Ext4 Developers List; +Cc: Eric Sesterhenn, Theodore Ts'o

The other problem codes associated with failing to create the
lost+found directory are non-fatal, and this one should be non-fatal
as well.  The two places which call e2fsck_get_lost_and_found()
already deal with a failure to create the directory, so there's no
point making this be a fatal error.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
---
 e2fsck/problem.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/e2fsck/problem.c b/e2fsck/problem.c
index 9d193c3..3f53350 100644
--- a/e2fsck/problem.c
+++ b/e2fsck/problem.c
@@ -1386,7 +1386,7 @@ static struct e2fsck_problem problem_table[] = {
 	/* Error creating lost and found directory */
 	{ PR_3_CREATE_LPF_ERROR,
 	  N_("Error creating /@l @d (%s): %m\n"),
-	  PROMPT_NONE, PR_FATAL },
+	  PROMPT_NONE, 0 },
 
 	/* Root inode is not directory; aborting */
 	{ PR_3_ROOT_NOT_DIR_ABORT,
-- 
1.6.0.4.8.g36f27.dirty


^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2009-01-22 21:33 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-01-22  8:56 (unknown) Eric Sesterhenn
2009-01-22 11:12 ` e2fsck faults with corrupted images Eric Sesterhenn
2009-01-22 21:12   ` Theodore Tso
2009-01-22 21:32     ` [PATCH] e2fsck: Add superblock check to make sure s_first_ino is valid Theodore Ts'o
2009-01-22 21:32       ` [PATCH] ext2fs_new_inode(): Add sanity check to assure a valid inode number Theodore Ts'o
2009-01-22 21:32         ` [PATCH] libext2fs: Add sanity checks to ext2fs_{block,inode}_alloc_stats Theodore Ts'o
2009-01-22 21:32           ` [PATCH] e2fsck: Change PR_3_CREATE_LPF_ERROR to be a non-fatal problem Theodore Ts'o
2009-01-22 21:33     ` [PATCH] e2fsck: Add superblock check to make sure s_first_ino is valid Theodore Ts'o
2009-01-22 21:33       ` [PATCH] ext2fs_new_inode(): Add sanity check to assure a valid inode number Theodore Ts'o
2009-01-22 21:33         ` [PATCH] libext2fs: Add sanity checks to ext2fs_{block,inode}_alloc_stats Theodore Ts'o
2009-01-22 21:33           ` [PATCH] e2fsck: Change PR_3_CREATE_LPF_ERROR to be a non-fatal problem Theodore Ts'o

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.