stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	patches@lists.linux.dev, Jan Kara <jack@suse.cz>
Subject: [PATCH 6.0 13/28] udf: Fix extending file within last block
Date: Mon, 19 Dec 2022 20:23:00 +0100	[thread overview]
Message-ID: <20221219182944.753745630@linuxfoundation.org> (raw)
In-Reply-To: <20221219182944.179389009@linuxfoundation.org>

From: Jan Kara <jack@suse.cz>

commit 1f3868f06855c97a4954c99b36f3fc9eb8f60326 upstream.

When extending file within last block it can happen that the extent is
already rounded to the blocksize and thus contains the offset we want to
grow up to. In such case we would mistakenly expand the last extent and
make it one block longer than it should be, exposing unallocated block
in a file and causing data corruption. Fix the problem by properly
detecting this case and bailing out.

CC: stable@vger.kernel.org
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 fs/udf/inode.c |   32 +++++++++++++++++---------------
 1 file changed, 17 insertions(+), 15 deletions(-)

--- a/fs/udf/inode.c
+++ b/fs/udf/inode.c
@@ -590,13 +590,17 @@ out:
 static void udf_do_extend_final_block(struct inode *inode,
 				      struct extent_position *last_pos,
 				      struct kernel_long_ad *last_ext,
-				      uint32_t final_block_len)
+				      uint32_t new_elen)
 {
-	struct super_block *sb = inode->i_sb;
 	uint32_t added_bytes;
 
-	added_bytes = final_block_len -
-		      (last_ext->extLength & (sb->s_blocksize - 1));
+	/*
+	 * Extent already large enough? It may be already rounded up to block
+	 * size...
+	 */
+	if (new_elen <= (last_ext->extLength & UDF_EXTENT_LENGTH_MASK))
+		return;
+	added_bytes = (last_ext->extLength & UDF_EXTENT_LENGTH_MASK) - new_elen;
 	last_ext->extLength += added_bytes;
 	UDF_I(inode)->i_lenExtents += added_bytes;
 
@@ -613,12 +617,12 @@ static int udf_extend_file(struct inode
 	int8_t etype;
 	struct super_block *sb = inode->i_sb;
 	sector_t first_block = newsize >> sb->s_blocksize_bits, offset;
-	unsigned long partial_final_block;
+	loff_t new_elen;
 	int adsize;
 	struct udf_inode_info *iinfo = UDF_I(inode);
 	struct kernel_long_ad extent;
 	int err = 0;
-	int within_final_block;
+	bool within_last_ext;
 
 	if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
 		adsize = sizeof(struct short_ad);
@@ -634,9 +638,9 @@ static int udf_extend_file(struct inode
 	udf_discard_prealloc(inode);
 
 	etype = inode_bmap(inode, first_block, &epos, &eloc, &elen, &offset);
-	within_final_block = (etype != -1);
+	within_last_ext = (etype != -1);
 	/* We don't expect extents past EOF... */
-	WARN_ON_ONCE(etype != -1 &&
+	WARN_ON_ONCE(within_last_ext &&
 		     elen > ((loff_t)offset + 1) << inode->i_blkbits);
 
 	if ((!epos.bh && epos.offset == udf_file_entry_alloc_offset(inode)) ||
@@ -653,19 +657,17 @@ static int udf_extend_file(struct inode
 		extent.extLength |= etype << 30;
 	}
 
-	partial_final_block = newsize & (sb->s_blocksize - 1);
+	new_elen = ((loff_t)offset << inode->i_blkbits) |
+					(newsize & (sb->s_blocksize - 1));
 
 	/* File has extent covering the new size (could happen when extending
 	 * inside a block)?
 	 */
-	if (within_final_block) {
+	if (within_last_ext) {
 		/* Extending file within the last file block */
-		udf_do_extend_final_block(inode, &epos, &extent,
-					  partial_final_block);
+		udf_do_extend_final_block(inode, &epos, &extent, new_elen);
 	} else {
-		loff_t add = ((loff_t)offset << sb->s_blocksize_bits) |
-			     partial_final_block;
-		err = udf_do_extend_file(inode, &epos, &extent, add);
+		err = udf_do_extend_file(inode, &epos, &extent, new_elen);
 	}
 
 	if (err < 0)



  parent reply	other threads:[~2022-12-19 19:26 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-19 19:22 [PATCH 6.0 00/28] 6.0.15-rc1 review Greg Kroah-Hartman
2022-12-19 19:22 ` [PATCH 6.0 01/28] PCI: mt7621: Add sentinel to quirks table Greg Kroah-Hartman
2022-12-19 19:22 ` [PATCH 6.0 02/28] kallsyms: Make module_kallsyms_on_each_symbol generally available Greg Kroah-Hartman
2022-12-19 19:22 ` [PATCH 6.0 03/28] ftrace: Add support to resolve module symbols in ftrace_lookup_symbols Greg Kroah-Hartman
2022-12-19 19:22 ` [PATCH 6.0 04/28] bpf: Rename __bpf_kprobe_multi_cookie_cmp to bpf_kprobe_multi_addrs_cmp Greg Kroah-Hartman
2022-12-19 19:22 ` [PATCH 6.0 05/28] bpf: Take module reference on kprobe_multi link Greg Kroah-Hartman
2022-12-19 19:22 ` [PATCH 6.0 06/28] selftests/bpf: Add load_kallsyms_refresh function Greg Kroah-Hartman
2022-12-19 19:22 ` [PATCH 6.0 07/28] selftests/bpf: Add bpf_testmod_fentry_* functions Greg Kroah-Hartman
2022-12-19 19:22 ` [PATCH 6.0 08/28] selftests/bpf: Add kprobe_multi check to module attach test Greg Kroah-Hartman
2022-12-19 19:22 ` [PATCH 6.0 09/28] selftests/bpf: Add kprobe_multi kmod attach api tests Greg Kroah-Hartman
2022-12-19 19:22 ` [PATCH 6.0 10/28] udf: Discard preallocation before extending file with a hole Greg Kroah-Hartman
2022-12-19 19:22 ` [PATCH 6.0 11/28] udf: Fix preallocation discarding at indirect extent boundary Greg Kroah-Hartman
2022-12-19 19:22 ` [PATCH 6.0 12/28] udf: Do not bother looking for prealloc extents if i_lenExtents matches i_size Greg Kroah-Hartman
2022-12-19 19:23 ` Greg Kroah-Hartman [this message]
2022-12-19 19:23 ` [PATCH 6.0 14/28] usb: gadget: uvc: Prevent buffer overflow in setup handler Greg Kroah-Hartman
2022-12-19 19:23 ` [PATCH 6.0 15/28] USB: serial: option: add Quectel EM05-G modem Greg Kroah-Hartman
2022-12-19 19:23 ` [PATCH 6.0 16/28] USB: serial: cp210x: add Kamstrup RF sniffer PIDs Greg Kroah-Hartman
2022-12-19 19:23 ` [PATCH 6.0 17/28] USB: serial: f81232: fix division by zero on line-speed change Greg Kroah-Hartman
2022-12-19 19:23 ` [PATCH 6.0 18/28] USB: serial: f81534: " Greg Kroah-Hartman
2022-12-19 19:23 ` [PATCH 6.0 19/28] ALSA: hda/realtek: fix mute/micmute LEDs for a HP ProBook Greg Kroah-Hartman
2022-12-19 19:23 ` [PATCH 6.0 20/28] xhci: Apply XHCI_RESET_TO_DEFAULT quirk to ADL-N Greg Kroah-Hartman
2022-12-19 19:23 ` [PATCH 6.0 21/28] igb: Initialize mailbox message for VF reset Greg Kroah-Hartman
2022-12-19 19:23 ` [PATCH 6.0 22/28] usb: typec: ucsi: Resume in separate work Greg Kroah-Hartman
2022-12-19 19:23 ` [PATCH 6.0 23/28] usb: dwc3: pci: Update PCIe device ID for USB3 controller on CPU sub-system for Raptor Lake Greg Kroah-Hartman
2022-12-19 19:23 ` [PATCH 6.0 24/28] KEYS: encrypted: fix key instantiation with user-provided data Greg Kroah-Hartman
2022-12-19 19:23 ` [PATCH 6.0 25/28] usb: ulpi: defer ulpi_register on ulpi_read_id timeout Greg Kroah-Hartman
2022-12-19 19:23 ` [PATCH 6.0 26/28] Bluetooth: L2CAP: Fix u8 overflow Greg Kroah-Hartman
2022-12-19 19:23 ` [PATCH 6.0 27/28] selftests: net: Use "grep -E" instead of "egrep" Greg Kroah-Hartman
2022-12-19 19:23 ` [PATCH 6.0 28/28] net: loopback: use NET_NAME_PREDICTABLE for name_assign_type Greg Kroah-Hartman
2022-12-19 23:55 ` [PATCH 6.0 00/28] 6.0.15-rc1 review Florian Fainelli
2022-12-20  0:16 ` Shuah Khan
2022-12-20  4:44 ` Bagas Sanjaya
2022-12-20  6:41 ` Naresh Kamboju
2022-12-20 11:21 ` Sudip Mukherjee (Codethink)
2022-12-20 14:49 ` Guenter Roeck
2022-12-20 15:33   ` Guenter Roeck
2022-12-21  1:07     ` Guenter Roeck
2022-12-20 17:44 ` Ron Economos
2022-12-21  1:16 ` Slade Watkins
2022-12-21 16:04 ` Justin Forbes

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221219182944.753745630@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=jack@suse.cz \
    --cc=patches@lists.linux.dev \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).