Whamcloud - gitweb
LU-4017 e2fsprogs: always read full inode structure
[tools/e2fsprogs.git] / lib / ext2fs / inode.c
index 573a8fa..b7805bc 100644 (file)
@@ -150,8 +150,11 @@ errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
        scan->blocks_left = scan->fs->inode_blocks_per_group;
        if (EXT2_HAS_RO_COMPAT_FEATURE(fs->super,
                                       EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
-               scan->inodes_left -=
-                       ext2fs_bg_itable_unused(fs, scan->current_group);
+               __u32 unused = ext2fs_bg_itable_unused(fs, scan->current_group);
+               if (scan->inodes_left > unused)
+                       scan->inodes_left -= unused;
+               else
+                       scan->inodes_left = 0;
                scan->blocks_left =
                        (scan->inodes_left +
                         (fs->blocksize / scan->inode_size - 1)) *
@@ -243,8 +246,11 @@ static errcode_t get_next_blockgroup(ext2_inode_scan scan)
        scan->blocks_left = fs->inode_blocks_per_group;
        if (EXT2_HAS_RO_COMPAT_FEATURE(fs->super,
                                       EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
-               scan->inodes_left -=
-                       ext2fs_bg_itable_unused(fs, scan->current_group);
+               __u32 unused = ext2fs_bg_itable_unused(fs, scan->current_group);
+               if (scan->inodes_left > unused)
+                       scan->inodes_left -= unused;
+               else
+                       scan->inodes_left = 0;
                scan->blocks_left =
                        (scan->inodes_left +
                         (fs->blocksize / scan->inode_size - 1)) *
@@ -483,7 +489,7 @@ errcode_t ext2fs_get_next_inode_full(ext2_inode_scan scan, ext2_ino_t *ino,
                               (struct ext2_inode_large *) scan->temp_buffer,
                               0, bufsize);
 #else
-               *inode = *((struct ext2_inode *) scan->temp_buffer);
+               memcpy(inode, scan->temp_buffer, bufsize);
 #endif
                if (scan->scan_flags & EXT2_SF_BAD_EXTRA_BYTES)
                        retval = EXT2_ET_BAD_BLOCK_IN_INODE_TABLE;