e2fsck: fix ASAN error when using 128 byte inodes

Submitted by Theodore Ts'o on April 15, 2017, 2:36 p.m.

Details

Message ID 20170415143622.11938-1-tytso@mit.edu
State Accepted
Headers show

Commit Message

Theodore Ts'o April 15, 2017, 2:36 p.m.
Due to the inode table buffering, it's actually hard to overrun the
end of allocated memory, so the ASAN error doesn't trigger all the
time.

Google-Bug-Id: 37326362

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

Patch hide | download patch | download mbox

diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c
index 99e8f66a..cf2e9ed2 100644
--- a/e2fsck/pass1.c
+++ b/e2fsck/pass1.c
@@ -1822,9 +1822,14 @@  void e2fsck_pass1(e2fsck_t ctx)
 		     inode->i_block[EXT2_DIND_BLOCK] ||
 		     inode->i_block[EXT2_TIND_BLOCK] ||
 		     ext2fs_file_acl_block(fs, inode))) {
+			struct ext2_inode_large *ip;
+
 			inodes_to_process[process_inode_count].ino = ino;
-			inodes_to_process[process_inode_count].inode =
-				       *(struct ext2_inode_large *)inode;
+			ip = &inodes_to_process[process_inode_count].inode;
+			if (inode_size < sizeof(struct ext2_inode_large))
+				memcpy(ip, inode, inode_size);
+			else
+				memcpy(ip, inode, sizeof(*ip));
 			process_inode_count++;
 		} else
 			check_blocks(ctx, &pctx, block_buf);