diff options
author | robi <robi> | 2010-10-02 15:41:49 +0000 |
---|---|---|
committer | robi <robi> | 2010-10-02 15:41:49 +0000 |
commit | 88e4c10b43783c24201e932b6494250b548ed84b (patch) | |
tree | 0e47a288f716c0e6fdf5ce425ebabd9fd3562fa5 /src/util.c | |
parent | 36208b20d0afdd5d26fcaf57fb4b7a384d93157c (diff) |
BUGs:#017547 #017556 #017557 #017559
Diffstat (limited to 'src/util.c')
-rw-r--r-- | src/util.c | 64 |
1 files changed, 35 insertions, 29 deletions
@@ -532,8 +532,7 @@ return; } -void get_ind_block_len(char *buf, blk_t *blk, blk_t *last ,blk_t *next, __u64 *p_len){ -// unsigned long long len; +int get_ind_block_len(char *buf, blk_t *blk, blk_t *last ,blk_t *next, __u64 *p_len){ int i = (current_fs->blocksize >> 2)- 1; char *priv_buf = NULL; blk_t block, *p_block; @@ -542,7 +541,7 @@ void get_ind_block_len(char *buf, blk_t *blk, blk_t *last ,blk_t *next, __u64 *p priv_buf = malloc(current_fs->blocksize); if (! priv_buf){ fprintf(stderr,"can not allocate memory\n"); - return ; + return 0; } p_block = (blk_t*)buf; p_block += i; @@ -555,9 +554,10 @@ void get_ind_block_len(char *buf, blk_t *blk, blk_t *last ,blk_t *next, __u64 *p } else break; } - if (io_channel_read_blk ( current_fs->io, block, 1, priv_buf )){ - fprintf(stderr,"ERROR: while read block %10u\n",block); - return ; + if ((block >= current_fs->super->s_blocks_count) || + (ext2fs_test_block_bitmap(bmap,block)) || (io_channel_read_blk ( current_fs->io, block, 1, priv_buf ))){ +// fprintf(stderr,"ERROR: while read block %10u\n",block); + return 0; } *next = (flag) ? 0 : block+1 ; *last = block; @@ -565,13 +565,13 @@ void get_ind_block_len(char *buf, blk_t *blk, blk_t *last ,blk_t *next, __u64 *p *p_len += (i * (current_fs->blocksize)) ; *blk += (i + 1) ; free(priv_buf); -return ; +return 1; } -void get_dind_block_len(char *buf, blk_t *blk, blk_t *last, blk_t *next, __u64 *p_len){ -// unsigned long long len; +int get_dind_block_len(char *buf, blk_t *blk, blk_t *last, blk_t *next, __u64 *p_len){ + int ret = 0; int i = (current_fs->blocksize >> 2)- 1; char *priv_buf = NULL; blk_t block, *p_block; @@ -579,7 +579,7 @@ void get_dind_block_len(char *buf, blk_t *blk, blk_t *last, blk_t *next, __u64 * priv_buf = malloc(current_fs->blocksize); if (! priv_buf){ fprintf(stderr,"can not allocate memory\n"); - return; + return 0; } p_block = (blk_t*)buf; p_block += i; @@ -591,23 +591,26 @@ void get_dind_block_len(char *buf, blk_t *blk, blk_t *last, blk_t *next, __u64 * } else break; } - if (io_channel_read_blk ( current_fs->io, block, 1, priv_buf )){ - fprintf(stderr,"ERROR: while read ind-block %10u\n",block); - return; + if ((block >= current_fs->super->s_blocks_count) || + (ext2fs_test_block_bitmap(bmap,block)) || (io_channel_read_blk ( current_fs->io, block, 1, priv_buf ))){ +// fprintf(stderr,"ERROR: while read ind-block %10u\n",block); + return 0; } - get_ind_block_len(priv_buf, blk, last, next, p_len); - *p_len += (i * current_fs->blocksize * (current_fs->blocksize >>2) ) ; - *next = ( i == ((current_fs->blocksize >> 2)- 1)) ? *last : 0 ; - *blk += ((i * ((current_fs->blocksize >>2) + 1)) + 1) ; + ret = get_ind_block_len(priv_buf, blk, last, next, p_len); + if (ret){ + *p_len += (i * current_fs->blocksize * (current_fs->blocksize >>2) ) ; + *next = ( i == ((current_fs->blocksize >> 2)- 1)) ? *last : 0 ; + *blk += ((i * ((current_fs->blocksize >>2) + 1)) + 1) ; + } free(priv_buf); -return ; +return ret ; } -void get_tind_block_len(char *buf, blk_t *blk, blk_t *last, blk_t *next, __u64 *p_len){ -// unsigned long long len; +int get_tind_block_len(char *buf, blk_t *blk, blk_t *last, blk_t *next, __u64 *p_len){ + int ret = 0; int i = (current_fs->blocksize >> 2)- 1; char *priv_buf = NULL; blk_t block, *p_block; @@ -615,7 +618,7 @@ void get_tind_block_len(char *buf, blk_t *blk, blk_t *last, blk_t *next, __u64 * priv_buf = malloc(current_fs->blocksize); if (! priv_buf){ fprintf(stderr,"can not allocate memory\n"); - return ; + return 0 ; } p_block = (blk_t*)buf; p_block += i; @@ -627,16 +630,19 @@ void get_tind_block_len(char *buf, blk_t *blk, blk_t *last, blk_t *next, __u64 * } else break; } - if (io_channel_read_blk ( current_fs->io, block, 1, priv_buf )){ - fprintf(stderr,"ERROR: while read dind-block %10u\n",block); - return ; + if ((block >= current_fs->super->s_blocks_count) || + (ext2fs_test_block_bitmap(bmap,block)) ||(io_channel_read_blk ( current_fs->io, block, 1, priv_buf ))){ +// fprintf(stderr,"ERROR: while read dind-block %10u\n",block); + return 0; } - get_dind_block_len(priv_buf, blk, last, next,p_len); - *p_len += (i * current_fs->blocksize * (current_fs->blocksize >>2) * (current_fs->blocksize >>2) ) ; - *blk += ((i * ((current_fs->blocksize >>2) + 1) * (current_fs->blocksize >>2)) + 1) ; - *next = 0; + ret = get_dind_block_len(priv_buf, blk, last, next,p_len); + if (ret){ + *p_len += (i * current_fs->blocksize * (current_fs->blocksize >>2) * (current_fs->blocksize >>2) ) ; + *blk += ((i * ((current_fs->blocksize >>2) + 1) * (current_fs->blocksize >>2)) + 1) ; + *next = 0; + } free(priv_buf); -return; +return ret; } |