]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
libext2fs: fix reading bitmaps from e2image files
authorTheodore Ts'o <tytso@mit.edu>
Mon, 19 Mar 2018 22:58:09 +0000 (18:58 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 20 Mar 2018 14:30:59 +0000 (10:30 -0400)
The loop termination code was broken, so that only the first block's
worth of bitmap data was getting read.

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Reported-by: Kazuya Mio <k-mio@sx.jp.nec.com>
lib/ext2fs/rw_bitmaps.c

index 9db76eb94b67a901f513d14c2c69b80c982a9ebc..0b532dbf9f1f26eea46b500d8a0c731ae47da322 100644 (file)
@@ -255,7 +255,7 @@ static errcode_t read_bitmaps(ext2_filsys fs, int do_inode, int do_block)
        if (fs->flags & EXT2_FLAG_IMAGE_FILE) {
                blk = (fs->image_header->offset_inodemap / fs->blocksize);
                ino_cnt = fs->super->s_inodes_count;
-               while (inode_nbytes > 0) {
+               while (inode_bitmap && ino_cnt > 0) {
                        retval = io_channel_read_blk64(fs->image_io, blk++,
                                                     1, inode_bitmap);
                        if (retval)
@@ -267,15 +267,14 @@ static errcode_t read_bitmaps(ext2_filsys fs, int do_inode, int do_block)
                                               ino_itr, cnt, inode_bitmap);
                        if (retval)
                                goto cleanup;
-                       ino_itr += fs->blocksize << 3;
-                       ino_cnt -= fs->blocksize << 3;
-                       inode_nbytes -= fs->blocksize;
+                       ino_itr += cnt;
+                       ino_cnt -= cnt;
                }
                blk = (fs->image_header->offset_blockmap /
                       fs->blocksize);
                blk_cnt = EXT2_GROUPS_TO_CLUSTERS(fs->super,
                                                  fs->group_desc_count);
-               while (block_nbytes > 0) {
+               while (block_bitmap && blk_cnt > 0) {
                        retval = io_channel_read_blk64(fs->image_io, blk++,
                                                     1, block_bitmap);
                        if (retval)
@@ -287,9 +286,8 @@ static errcode_t read_bitmaps(ext2_filsys fs, int do_inode, int do_block)
                                       blk_itr, cnt, block_bitmap);
                        if (retval)
                                goto cleanup;
-                       blk_itr += fs->blocksize << 3;
-                       blk_cnt -= fs->blocksize << 3;
-                       block_nbytes -= fs->blocksize;
+                       blk_itr += cnt;
+                       blk_cnt -= cnt;
                }
                goto success_cleanup;
        }