From 76cdc3cf7ccdd9fa0d796c829924c7d00fab22dd Mon Sep 17 00:00:00 2001 From: robi Date: Sat, 4 Jun 2011 13:29:46 +0000 Subject: prevent large block numbers --- src/ext4magic.c | 9 +++++---- src/recover.c | 7 ++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/ext4magic.c b/src/ext4magic.c index 5b0899a..57345fe 100644 --- a/src/ext4magic.c +++ b/src/ext4magic.c @@ -830,10 +830,11 @@ if ((recovermodus & (LIST_ALL | LIST_STATUS)) && format) void *block_buf; int allocated; block_buf = malloc(EXT2_BLOCK_SIZE(current_fs->super )); - read_block ( current_fs , &block_nr , block_buf ); - allocated = ext2fs_test_block_bitmap ( current_fs->block_map, block_nr ); - fprintf(stdout,"Dump Filesystemblock %10lu Status : %s\n",block_nr,(allocated) ? "Block is Allocated" : "Block is Unallocated"); - blockhex ( stdout , block_buf , format , EXT2_BLOCK_SIZE(current_fs->super )); + if(!read_block ( current_fs , &block_nr , block_buf )){ + allocated = ext2fs_test_block_bitmap ( current_fs->block_map, block_nr ); + fprintf(stdout,"Dump Filesystemblock %10lu Status : %s\n",block_nr,(allocated) ? "Block is Allocated" : "Block is Unallocated"); + blockhex ( stdout , block_buf , format , EXT2_BLOCK_SIZE(current_fs->super )); + } free(block_buf); } diff --git a/src/recover.c b/src/recover.c index 1547fe9..1c720ba 100644 --- a/src/recover.c +++ b/src/recover.c @@ -154,7 +154,7 @@ return ; blk_t /*ref_blk*/x, int /*ref_offset*/y, void *priv ) { //FIXME: - if (*blocknr > fs->super->s_blocks_count) + if (*blocknr >= fs->super->s_blocks_count) return BLOCK_ERROR; struct alloc_stat *stat = priv; if ( ext2fs_test_block_bitmap ( fs->block_map, *blocknr )) @@ -176,6 +176,9 @@ static int read_syslink_block ( ext2_filsys fs, blk_t *blocknr, e2_blkcnt_t bloc errcode_t retval; int blocksize = fs->blocksize; + if (*blocknr >= fs->super->s_blocks_count) + return BLOCK_ERROR; + if (((struct privat*)priv)->flag){ int allocated = ext2fs_test_block_bitmap ( fs->block_map, *blocknr ); if ( allocated ){ @@ -205,6 +208,8 @@ static int write_block ( ext2_filsys fs, blk_t *blocknr, e2_blkcnt_t blockcnt, errcode_t retval; int blocksize = fs->blocksize; + if (*blocknr >= fs->super->s_blocks_count) + return BLOCK_ERROR; #ifdef DEBUG printf("%c",(ext2fs_test_block_bitmap ( fs->block_map, *blocknr ))? 'X' : 'O'); #endif -- cgit v1.2.3