Received: by 2002:a05:6a10:a852:0:0:0:0 with SMTP id d18csp145233pxy; Thu, 6 May 2021 23:14:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxkhm6JyadtcQMKIPpTz7/T+cgqEq6rfM03PALFaRO3a0g/IC7QXNItzmxaKI/h9Ej9Ulif X-Received: by 2002:a62:16c9:0:b029:24b:a41e:cd6 with SMTP id 192-20020a6216c90000b029024ba41e0cd6mr8814748pfw.52.1620368064518; Thu, 06 May 2021 23:14:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620368064; cv=none; d=google.com; s=arc-20160816; b=o33VIIxsYBMg8TtkLo/QywqXAvQJ3OFb9FoPTn/NX5ufEhYX/pxXW+OUsIMNN8OzHm PcGzmgvjjL1UPV9NY7rh8Yd6qL87JXnm3uMzn8K1zS6uSWjdA3wqSnWlTA6k7KFsK4Em J7zLL3HEDM6yL7emeZ74iDuZkt+iLCZdF7eIHF3CFejlGbGnfn739Z1nkjTqkDF+FtOn S6fD4gbYEVU6NJ0aPcFp6jBdwUlHF400xUV6IGLqKf2kLIw7Tf5WH1OKATSlNmRXY40S T2kZHLB7+rdagHZ2ANAsTfl04WR1IdCdgyh1bSLQ12aXdYAcLfJmtXM27YjwVObB7qm+ OEcQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=gmnUbeAZGJgXOLrjyNOE8KCTTOboz2Xp7Y7rRgSLKIs=; b=0rPryn8SnE6EEbw038bNbqN4eEpwg/1fcvHdPZrvzItVKuTmv6JLBdb+jJvk1I+S9n 13+VP+7TkuN+IdvAOp4BxOZ8En/ZdJ3f3vUwnITh8ZvxW2HpbihiEhpu3TwXjUpt8snm oupAgjVIcIdZVi0aZNXVUhHz1A/VXjVPohcyTFeAdtmIPSz7szSz0ySr9WC5CSQS/Xju FtxCqn/JbA7PKBhBsi5RkDe0W7iKJu8hOvYe61AgaxHy2qS/AoRNODOVBURwUA4wzDmn dhsECsF0WXbRELOPby2EkPqagwnJhIF5UYhz78cf55nE/6gf/BTaEub5gOwBIamYzDam 8TSg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id g66si5525125pfb.181.2021.05.06.23.14.10; Thu, 06 May 2021 23:14:24 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230215AbhEGDON (ORCPT + 99 others); Thu, 6 May 2021 23:14:13 -0400 Received: from outgoing-auth-1.mit.edu ([18.9.28.11]:53421 "EHLO outgoing.mit.edu" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S229942AbhEGDOM (ORCPT ); Thu, 6 May 2021 23:14:12 -0400 Received: from cwcc.thunk.org (pool-72-74-133-215.bstnma.fios.verizon.net [72.74.133.215]) (authenticated bits=0) (User authenticated as tytso@ATHENA.MIT.EDU) by outgoing.mit.edu (8.14.7/8.12.4) with ESMTP id 1473D9r7014763 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 6 May 2021 23:13:10 -0400 Received: by cwcc.thunk.org (Postfix, from userid 15806) id B99DE15C39BD; Thu, 6 May 2021 23:13:09 -0400 (EDT) From: "Theodore Ts'o" To: Ext4 Developers List Cc: harshadshirwadkar@gmail.com, "Theodore Ts'o" Subject: [PATCH] e2fsck: fix unaligned accesses to ext4_fc_add_range and fc_raw_inode Date: Thu, 6 May 2021 23:13:06 -0400 Message-Id: <20210507031306.294753-1-tytso@mit.edu> X-Mailer: git-send-email 2.31.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org These fast commit related structures can be unaligned on disk. So we need to avoid accessing these structures directly, and first copy them to memory which we know is appropriately aligned. This fixes an e2fsck crash while running the j_recovery_fast_commit regression test on a sparc64 system. Signed-off-by: Theodore Ts'o --- e2fsck/journal.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/e2fsck/journal.c b/e2fsck/journal.c index ae3df800..0128fbd3 100644 --- a/e2fsck/journal.c +++ b/e2fsck/journal.c @@ -284,7 +284,7 @@ static int ext4_fc_replay_scan(journal_t *j, struct buffer_head *bh, e2fsck_t ctx = j->j_fs_dev->k_ctx; struct e2fsck_fc_replay_state *state; int ret = JBD2_FC_REPLAY_CONTINUE; - struct ext4_fc_add_range *ext; + struct ext4_fc_add_range ext; struct ext4_fc_tl tl; struct ext4_fc_tail tail; __u8 *start, *cur, *end, *val; @@ -321,9 +321,10 @@ static int ext4_fc_replay_scan(journal_t *j, struct buffer_head *bh, tag2str(le16_to_cpu(tl.fc_tag)), bh->b_blocknr); switch (le16_to_cpu(tl.fc_tag)) { case EXT4_FC_TAG_ADD_RANGE: - ext = (struct ext4_fc_add_range *)val; - ret = ext2fs_decode_extent(&ext2fs_ex, (void *)&ext->fc_ex, - sizeof(ext->fc_ex)); + memcpy(&ext, val, sizeof(ext)); + ret = ext2fs_decode_extent(&ext2fs_ex, + (void *)&ext.fc_ex, + sizeof(ext.fc_ex)); if (ret) ret = JBD2_FC_REPLAY_STOP; else @@ -764,12 +765,9 @@ static int ext4_fc_handle_inode(e2fsck_t ctx, __u8 *val) inode_len); if (err) goto out; -#ifdef WORDS_BIGENDIAN - ext2fs_swap_inode_full(ctx->fs, fc_inode, - (struct ext2_inode_large *)fc_raw_inode, - 0, sizeof(*inode)); -#else memcpy(fc_inode, fc_raw_inode, inode_len); +#ifdef WORDS_BIGENDIAN + ext2fs_swap_inode_full(ctx->fs, fc_inode, fc_inode, 0, inode_len); #endif memcpy(inode, fc_inode, offsetof(struct ext2_inode_large, i_block)); memcpy(&inode->i_generation, &fc_inode->i_generation, -- 2.31.0