Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp5230513imu; Tue, 25 Dec 2018 21:51:55 -0800 (PST) X-Google-Smtp-Source: ALg8bN7oUAdNmm00MftMQif40sSgF/7cvX2zyK3NdN98IOWuwSQTbqvKib32Zd5m439pn7rKO3zA X-Received: by 2002:a63:4c4e:: with SMTP id m14mr17924742pgl.173.1545803515193; Tue, 25 Dec 2018 21:51:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1545803515; cv=none; d=google.com; s=arc-20160816; b=dYtK2hW/l7B41It2JhpoAhn59ZMTJFyAZBWFHHNa6fWjrbSn8jOVIZwDOeweOgfznw iojbn6LEsn/L9KY0+6IXcSOCjwH3wsfhKosqDQC9CfZstCh0lgnKo2Pm1NTd3phZOg2t 93eMisQTF0rJmo9+3tXDbTrzd7l5D826WbB/6NYVknyKGQlhGhq8Ipo8DIsNCAgd8YG0 vWtFVdk57WoAiyPLykZs18luW0mMuXrjy/xdP6pYF5w5QRQV5LJa6JFfKTT/1uaiJ6Xp IAyLeS8P4AJxFFQYOTpLXfMOTaenJItqK1G4ui8da+030hKJUZc3Kp3dgN9m9GYLPLkO lshQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dmarc-filter:dkim-signature:dkim-signature; bh=R3+7/8iPYiqhjs88e9KpAk3W6M4aARJzVDlzavuArDY=; b=E7bkmgN9o6AYA/jFpkOwsf5mcF2lZJrShcyEpKVc7HTXy7YO8/d3+KUGXqSTITCZYH XTKLtS4DBgMRQnHH9tUD88VggSH/nHgFvT/CnVRoLBV1uvpJBL/RDbPk4zQNmwAScKzl qV/AHdOS0pSQiFcoEN10jj21WPw5VrCvPOLLdlmr3kD1oK5lPmU0qK5D0XOutvC5HMEI +cEYntc3gAk1zmUbyPGHUvBxqO0w2c4Iw+wcrQ8ffgzCTaPZOJ2qUzl69JeY4biN2Zs0 Zx0nreoS3DlALgxF0tCca6TycGWEyYz9L3Wwyur4MwdXR7PJT+uBtAWH4bJ2Eba+cXpr Szvw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=nhL0qpsn; dkim=pass header.i=@codeaurora.org header.s=default header.b=F5ZVsXFM; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z14si18066636pgz.180.2018.12.25.21.51.39; Tue, 25 Dec 2018 21:51:55 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=nhL0qpsn; dkim=pass header.i=@codeaurora.org header.s=default header.b=F5ZVsXFM; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725987AbeLZFut (ORCPT + 99 others); Wed, 26 Dec 2018 00:50:49 -0500 Received: from smtp.codeaurora.org ([198.145.29.96]:55938 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725891AbeLZFut (ORCPT ); Wed, 26 Dec 2018 00:50:49 -0500 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 5685460364; Wed, 26 Dec 2018 05:50:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1545803448; bh=JUsQ9IVn1Fp9glEOcDKM+8t31FMwMuwYLb+dmVcL5f8=; h=From:To:Cc:Subject:Date:From; b=nhL0qpsnPbKkfHzSvGeL4J3rfkMtXtJit9CX71kCO7wxwx+El850n0SSIc/GL+bC6 wqF4w7vNy6PGHixO1FFPirISeWsYjFR5cL0MOEz9LK65gFlkn3ycolaaYIEl4hkvaC fDh7WDCbNSLQJ/Nr8qGD1giDVEyiQ1YTVuVWprgg= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_INVALID,DKIM_SIGNED autolearn=no autolearn_force=no version=3.4.0 Received: from codeaurora.org (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: stummala@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 3591E6022B; Wed, 26 Dec 2018 05:50:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1545803438; bh=JUsQ9IVn1Fp9glEOcDKM+8t31FMwMuwYLb+dmVcL5f8=; h=From:To:Cc:Subject:Date:From; b=F5ZVsXFMyufm5ZK9YfEmNa1XsmWZFl/pRU58VQVTXBFmUyzR2GObFpUwHNe6mUfXh uhc4KUy76+78IKHmiGCBxs0oCvgllqYmzxz+cDFIbgDx6UL7ahaWQGNCADRlqSNoQx moSYLn3tah4J9ACnRXiqXDrYiLFF7JIfr4dcnaV4= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 3591E6022B Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=stummala@codeaurora.org From: Sahitya Tummala To: Jaegeuk Kim , Chao Yu , linux-f2fs-devel@lists.sourceforge.net Cc: linux-kernel@vger.kernel.org, Sahitya Tummala Subject: [PATCH v2] f2fs: fix use-after-free issue when accessing sbi->stat_info Date: Wed, 26 Dec 2018 11:20:29 +0530 Message-Id: <1545803429-14340-1-git-send-email-stummala@codeaurora.org> X-Mailer: git-send-email 1.9.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org iput() on sbi->node_inode can update sbi->stat_info in the below context, if the f2fs_write_checkpoint() has failed with error. f2fs_balance_fs_bg+0x1ac/0x1ec f2fs_write_node_pages+0x4c/0x260 do_writepages+0x80/0xbc __writeback_single_inode+0xdc/0x4ac writeback_single_inode+0x9c/0x144 write_inode_now+0xc4/0xec iput+0x194/0x22c f2fs_put_super+0x11c/0x1e8 generic_shutdown_super+0x70/0xf4 kill_block_super+0x2c/0x5c kill_f2fs_super+0x44/0x50 deactivate_locked_super+0x60/0x8c deactivate_super+0x68/0x74 cleanup_mnt+0x40/0x78 Fix this by moving f2fs_destroy_stats() further below iput() in both f2fs_put_super() and f2fs_fill_super() paths. Signed-off-by: Sahitya Tummala --- v2: - cover f2fs_fill_super() also, as pointed out by Chao. fs/f2fs/super.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index e184ad4e..01d9548 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -1058,9 +1058,6 @@ static void f2fs_put_super(struct super_block *sb) f2fs_write_checkpoint(sbi, &cpc); } - /* f2fs_write_checkpoint can update stat informaion */ - f2fs_destroy_stats(sbi); - /* * normally superblock is clean, so we need to release this. * In addition, EIO will skip do checkpoint, we need this as well. @@ -1080,6 +1077,12 @@ static void f2fs_put_super(struct super_block *sb) iput(sbi->node_inode); iput(sbi->meta_inode); + /* + * iput() can update stat information, if f2fs_write_checkpoint() + * above failed with error. + */ + f2fs_destroy_stats(sbi); + /* destroy f2fs internal modules */ f2fs_destroy_node_manager(sbi); f2fs_destroy_segment_manager(sbi); @@ -3259,30 +3262,30 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) f2fs_build_gc_manager(sbi); + err = f2fs_build_stats(sbi); + if (err) + goto free_nm; + /* get an inode for node space */ sbi->node_inode = f2fs_iget(sb, F2FS_NODE_INO(sbi)); if (IS_ERR(sbi->node_inode)) { f2fs_msg(sb, KERN_ERR, "Failed to read node inode"); err = PTR_ERR(sbi->node_inode); - goto free_nm; + goto free_stats; } - err = f2fs_build_stats(sbi); - if (err) - goto free_node_inode; - /* read root inode and dentry */ root = f2fs_iget(sb, F2FS_ROOT_INO(sbi)); if (IS_ERR(root)) { f2fs_msg(sb, KERN_ERR, "Failed to read root inode"); err = PTR_ERR(root); - goto free_stats; + goto free_node_inode; } if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size || !root->i_nlink) { iput(root); err = -EINVAL; - goto free_stats; + goto free_node_inode; } sb->s_root = d_make_root(root); /* allocate root dentry */ @@ -3406,12 +3409,12 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) free_root_inode: dput(sb->s_root); sb->s_root = NULL; -free_stats: - f2fs_destroy_stats(sbi); free_node_inode: f2fs_release_ino_entry(sbi, true); truncate_inode_pages_final(NODE_MAPPING(sbi)); iput(sbi->node_inode); +free_stats: + f2fs_destroy_stats(sbi); free_nm: f2fs_destroy_node_manager(sbi); free_sm: -- Qualcomm India Private Limited, on behalf of Qualcomm Innovation Center, Inc. Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.