Received: by 2002:ac0:98c7:0:0:0:0:0 with SMTP id g7-v6csp1599671imd; Sun, 4 Nov 2018 06:06:08 -0800 (PST) X-Google-Smtp-Source: AJdET5dOeQmQpm6SsKpxBiE+HSAHK95dVcSOY/85eLmFflfP1+Q+pqXAsLakCzVky9b+SGq8QYR9 X-Received: by 2002:a63:a064:: with SMTP id u36mr14403064pgn.145.1541340368444; Sun, 04 Nov 2018 06:06:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541340368; cv=none; d=google.com; s=arc-20160816; b=sbT7pCAbpOIOJAuAgoq+atISmkJsSH6K3W6OWSxEKrPGMYXlfEWScNIViwngdY/aKQ vZaNjkPEFpKMgwUQTy8+jPZsy1AAZCrKy6h4+Vco6RoHMyfKaqBTOsyh8XjBheuhJTf8 KNZIdIUGzqStiML42zP80hGwKObSFSj3pjEx31hU5FODKzizP88yx9qjpanKnWTPfTKw 2h1mPC5ZoXGP7ljBtchRsDwsmYqLVgZ0QKVl2RvVsriIMPfVgHnKl1D5IuLGsEVGrXXS /414XlOyZyMMaMd8dc3rQtaZA9CnudvtyNRY2FuBzvifS2YxtuAV0UYSjiTG/oEQmVYz ciZw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=DOzM3y1Rzc/y4ZZR5cs4ssijGSahkCVyI3KC697XlJY=; b=TrNFZ34ie3mXVffmMxEJLw523OL9GKEKcTgheNtbwHOYgNGm+urZGd3jx7+z353PE8 iny+RkL43K9QqKinuFo9qyllc4IIMnYjI89gZgmlPwhJ181oqyLllXG7MzdKGJ9stPMP wQ63AbQBvPepzBEiEw911ihUln26i9Sofzjr0Z7ypgjMNeoTcMfNrQsB2YVzSyyZCtrQ 0LkqT2qy7bWb3moi1AdedirtD9cq4HcYw5Z4WWGgXcwUI0oPFSS2UFmkh2eKXz8HI+zH DnGde8a3PCoS4OrT0zzliGMRg4B+yLtJSlpjPeASqaT/PbysNkMIwrsf2Z3B3EoYirwP SXIQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=QA0ueJto; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q12-v6si17470220pll.286.2018.11.04.06.05.53; Sun, 04 Nov 2018 06:06:08 -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=@kernel.org header.s=default header.b=QA0ueJto; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730497AbeKDXHk (ORCPT + 99 others); Sun, 4 Nov 2018 18:07:40 -0500 Received: from mail.kernel.org ([198.145.29.99]:45682 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730437AbeKDXHj (ORCPT ); Sun, 4 Nov 2018 18:07:39 -0500 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 02B982085A; Sun, 4 Nov 2018 13:52:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1541339555; bh=0+5Dm57xvtJEuBh1J+1JT5/oJdYTGSPNmjrR1Q6HiIA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QA0ueJtotMOK59/TxA3ibRmd+/B906DoIyJfbSgoN0YFvMXgzLS2EWdvXdLDizomJ bpeLAD21u/V8kq8ow0xC+8O2G2+RyiIRlXxWcTfi16mZRfehcXdueHZ9+Be3dN4rUw 7T4lxCttHq+ND6fa+H46OLDPGwVlSI57K151N4S4= From: Sasha Levin To: stable@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Jan Kara , Sasha Levin Subject: [PATCH AUTOSEL 4.19 52/57] udf: Prevent write-unsupported filesystem to be remounted read-write Date: Sun, 4 Nov 2018 08:51:39 -0500 Message-Id: <20181104135144.88324-52-sashal@kernel.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181104135144.88324-1-sashal@kernel.org> References: <20181104135144.88324-1-sashal@kernel.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jan Kara [ Upstream commit a9ad01bc759df79b0012f43ee52164391e31cd96 ] There are certain filesystem features which we support for reading but not for writing. We properly refuse to mount such filesystems read-write however for some features (such as read-only partitions), we don't check for these features when remounting the filesystem from read-only to read-write. Thus such filesystems could be remounted read-write leading to strange behavior (most likely crashes). Fix the problem by marking in superblock whether the filesystem has some features that are supported in read-only mode and check this flag during remount. Signed-off-by: Jan Kara Signed-off-by: Sasha Levin --- fs/udf/super.c | 30 ++++++++++++++++-------------- fs/udf/udf_sb.h | 2 ++ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/fs/udf/super.c b/fs/udf/super.c index 6f515651a2c2..b997e3116e37 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c @@ -613,14 +613,11 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options) struct udf_options uopt; struct udf_sb_info *sbi = UDF_SB(sb); int error = 0; - struct logicalVolIntegrityDescImpUse *lvidiu = udf_sb_lvidiu(sb); + + if (!(*flags & SB_RDONLY) && UDF_QUERY_FLAG(sb, UDF_FLAG_RW_INCOMPAT)) + return -EACCES; sync_filesystem(sb); - if (lvidiu) { - int write_rev = le16_to_cpu(lvidiu->minUDFWriteRev); - if (write_rev > UDF_MAX_WRITE_VERSION && !(*flags & SB_RDONLY)) - return -EACCES; - } uopt.flags = sbi->s_flags; uopt.uid = sbi->s_uid; @@ -1257,6 +1254,7 @@ static int udf_load_partdesc(struct super_block *sb, sector_t block) ret = -EACCES; goto out_bh; } + UDF_SET_FLAG(sb, UDF_FLAG_RW_INCOMPAT); ret = udf_load_vat(sb, i, type1_idx); if (ret < 0) goto out_bh; @@ -2155,10 +2153,12 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) UDF_MAX_READ_VERSION); ret = -EINVAL; goto error_out; - } else if (minUDFWriteRev > UDF_MAX_WRITE_VERSION && - !sb_rdonly(sb)) { - ret = -EACCES; - goto error_out; + } else if (minUDFWriteRev > UDF_MAX_WRITE_VERSION) { + if (!sb_rdonly(sb)) { + ret = -EACCES; + goto error_out; + } + UDF_SET_FLAG(sb, UDF_FLAG_RW_INCOMPAT); } sbi->s_udfrev = minUDFWriteRev; @@ -2176,10 +2176,12 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) } if (sbi->s_partmaps[sbi->s_partition].s_partition_flags & - UDF_PART_FLAG_READ_ONLY && - !sb_rdonly(sb)) { - ret = -EACCES; - goto error_out; + UDF_PART_FLAG_READ_ONLY) { + if (!sb_rdonly(sb)) { + ret = -EACCES; + goto error_out; + } + UDF_SET_FLAG(sb, UDF_FLAG_RW_INCOMPAT); } if (udf_find_fileset(sb, &fileset, &rootdir)) { diff --git a/fs/udf/udf_sb.h b/fs/udf/udf_sb.h index 9424d7cab790..d12e507e9eb2 100644 --- a/fs/udf/udf_sb.h +++ b/fs/udf/udf_sb.h @@ -30,6 +30,8 @@ #define UDF_FLAG_LASTBLOCK_SET 16 #define UDF_FLAG_BLOCKSIZE_SET 17 #define UDF_FLAG_INCONSISTENT 18 +#define UDF_FLAG_RW_INCOMPAT 19 /* Set when we find RW incompatible + * feature */ #define UDF_PART_FLAG_UNALLOC_BITMAP 0x0001 #define UDF_PART_FLAG_UNALLOC_TABLE 0x0002 -- 2.17.1