All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@lst.de>
To: linux-ext4@vger.kernel.org, viro@zeniv.linux.org.uk
Cc: jack@suse.cz, tytso@mit.edu, adilger@dilger.ca,
	riteshh@linux.ibm.com, amir73il@gmail.com,
	linux-fsdevel@vger.kernel.org, linux-unionfs@vger.kernel.org
Subject: [PATCH 02/11] ext4: fix fiemap size checks for bitmap files
Date: Mon, 27 Apr 2020 20:19:48 +0200	[thread overview]
Message-ID: <20200427181957.1606257-3-hch@lst.de> (raw)
In-Reply-To: <20200427181957.1606257-1-hch@lst.de>

Add an extra validation of the len parameter, as for ext4 some files
might have smaller file size limits than others.  This also means the
redundant size check in ext4_ioctl_get_es_cache can go away, as all
size checking is done in the shared fiemap handler.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/ext4/extents.c | 31 +++++++++++++++++++++++++++++++
 fs/ext4/ioctl.c   | 33 ++-------------------------------
 2 files changed, 33 insertions(+), 31 deletions(-)

diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index f2b577b315a09..2b4b94542e34d 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -4832,6 +4832,28 @@ static const struct iomap_ops ext4_iomap_xattr_ops = {
 	.iomap_begin		= ext4_iomap_xattr_begin,
 };
 
+static int ext4_fiemap_check_ranges(struct inode *inode, u64 start, u64 *len)
+{
+	u64 maxbytes;
+
+	if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
+		maxbytes = inode->i_sb->s_maxbytes;
+	else
+		maxbytes = EXT4_SB(inode->i_sb)->s_bitmap_maxbytes;
+
+	if (*len == 0)
+		return -EINVAL;
+	if (start > maxbytes)
+		return -EFBIG;
+
+	/*
+	 * Shrink request scope to what the fs can actually handle.
+	 */
+	if (*len > maxbytes || (maxbytes - *len) < start)
+		*len = maxbytes - start;
+	return 0;
+}
+
 static int _ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 			__u64 start, __u64 len, bool from_es_cache)
 {
@@ -4852,6 +4874,15 @@ static int _ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 	if (fiemap_check_flags(fieinfo, ext4_fiemap_flags))
 		return -EBADR;
 
+	/*
+	 * For bitmap files the maximum size limit could be smaller than
+	 * s_maxbytes, so check len here manually instead of just relying on the
+	 * generic check.
+	 */
+	error = ext4_fiemap_check_ranges(inode, start, &len);
+	if (error)
+		return error;
+
 	if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR) {
 		fieinfo->fi_flags &= ~FIEMAP_FLAG_XATTR;
 		error = iomap_fiemap(inode, fieinfo, start, len,
diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c
index bfc1281fc4cbc..0746532ba463d 100644
--- a/fs/ext4/ioctl.c
+++ b/fs/ext4/ioctl.c
@@ -733,29 +733,6 @@ static void ext4_fill_fsxattr(struct inode *inode, struct fsxattr *fa)
 		fa->fsx_projid = from_kprojid(&init_user_ns, ei->i_projid);
 }
 
-/* copied from fs/ioctl.c */
-static int fiemap_check_ranges(struct super_block *sb,
-			       u64 start, u64 len, u64 *new_len)
-{
-	u64 maxbytes = (u64) sb->s_maxbytes;
-
-	*new_len = len;
-
-	if (len == 0)
-		return -EINVAL;
-
-	if (start > maxbytes)
-		return -EFBIG;
-
-	/*
-	 * Shrink request scope to what the fs can actually handle.
-	 */
-	if (len > maxbytes || (maxbytes - len) < start)
-		*new_len = maxbytes - start;
-
-	return 0;
-}
-
 /* So that the fiemap access checks can't overflow on 32 bit machines. */
 #define FIEMAP_MAX_EXTENTS	(UINT_MAX / sizeof(struct fiemap_extent))
 
@@ -765,8 +742,6 @@ static int ext4_ioctl_get_es_cache(struct file *filp, unsigned long arg)
 	struct fiemap __user *ufiemap = (struct fiemap __user *) arg;
 	struct fiemap_extent_info fieinfo = { 0, };
 	struct inode *inode = file_inode(filp);
-	struct super_block *sb = inode->i_sb;
-	u64 len;
 	int error;
 
 	if (copy_from_user(&fiemap, ufiemap, sizeof(fiemap)))
@@ -775,11 +750,6 @@ static int ext4_ioctl_get_es_cache(struct file *filp, unsigned long arg)
 	if (fiemap.fm_extent_count > FIEMAP_MAX_EXTENTS)
 		return -EINVAL;
 
-	error = fiemap_check_ranges(sb, fiemap.fm_start, fiemap.fm_length,
-				    &len);
-	if (error)
-		return error;
-
 	fieinfo.fi_flags = fiemap.fm_flags;
 	fieinfo.fi_extents_max = fiemap.fm_extent_count;
 	fieinfo.fi_extents_start = ufiemap->fm_extents;
@@ -792,7 +762,8 @@ static int ext4_ioctl_get_es_cache(struct file *filp, unsigned long arg)
 	if (fieinfo.fi_flags & FIEMAP_FLAG_SYNC)
 		filemap_write_and_wait(inode->i_mapping);
 
-	error = ext4_get_es_cache(inode, &fieinfo, fiemap.fm_start, len);
+	error = ext4_get_es_cache(inode, &fieinfo, fiemap.fm_start,
+			fiemap.fm_length);
 	fiemap.fm_flags = fieinfo.fi_flags;
 	fiemap.fm_mapped_extents = fieinfo.fi_extents_mapped;
 	if (copy_to_user(ufiemap, &fiemap, sizeof(fiemap)))
-- 
2.26.1


  parent reply	other threads:[~2020-04-27 18:20 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-27 18:19 fix fiemap for ext4 bitmap files (+ cleanups) v2 Christoph Hellwig
2020-04-27 18:19 ` [PATCH 01/11] ext4: fix EXT4_MAX_LOGICAL_BLOCK macro Christoph Hellwig
2020-04-27 18:19 ` Christoph Hellwig [this message]
2020-05-01 23:20   ` [PATCH 02/11] ext4: fix fiemap size checks for bitmap files Ritesh Harjani
2020-04-27 18:19 ` [PATCH 03/11] ext4: split _ext4_fiemap Christoph Hellwig
2020-05-01 23:21   ` Ritesh Harjani
2020-04-27 18:19 ` [PATCH 04/11] ext4: remove the call to fiemap_check_flags in ext4_fiemap Christoph Hellwig
2020-05-01 23:21   ` Ritesh Harjani
2020-04-27 18:19 ` [PATCH 05/11] fs: mark __generic_block_fiemap static Christoph Hellwig
2020-04-28 15:06   ` Darrick J. Wong
2020-05-01 23:22   ` Ritesh Harjani
2020-04-27 18:19 ` [PATCH 06/11] fs: move the fiemap definitions out of fs.h Christoph Hellwig
2020-04-28 15:07   ` Darrick J. Wong
2020-05-01 23:23   ` Ritesh Harjani
2020-04-27 18:19 ` [PATCH 07/11] iomap: fix the iomap_fiemap prototype Christoph Hellwig
2020-04-28 15:08   ` Darrick J. Wong
2020-05-01 23:34   ` Ritesh Harjani
2020-05-05 10:29     ` Christoph Hellwig
2020-04-27 18:19 ` [PATCH 08/11] fs: move fiemap range validation into the file systems instances Christoph Hellwig
2020-04-28  2:35   ` Amir Goldstein
2020-04-28 15:14   ` Darrick J. Wong
2020-05-01 22:49   ` Ritesh Harjani
2020-05-05 10:37     ` Christoph Hellwig
2020-04-27 18:19 ` [PATCH 09/11] fs: handle FIEMAP_FLAG_SYNC in fiemap_prep Christoph Hellwig
2020-04-28  2:26   ` Amir Goldstein
2020-04-28 15:16   ` Darrick J. Wong
2020-05-01 22:52   ` Ritesh Harjani
2020-05-05 10:43     ` Christoph Hellwig
2020-04-27 18:19 ` [PATCH 10/11] fs: remove the access_ok() check in ioctl_fiemap Christoph Hellwig
2020-04-28 15:21   ` Darrick J. Wong
2020-05-05 10:44     ` Christoph Hellwig
2020-05-01 22:56   ` Ritesh Harjani
2020-04-27 18:19 ` [PATCH 11/11] ext4: remove the access_ok() check in ext4_ioctl_get_es_cache Christoph Hellwig
2020-05-01 22:56   ` Ritesh Harjani
2020-05-05 15:43 fix fiemap for ext4 bitmap files (+ cleanups) v3 Christoph Hellwig
2020-05-05 15:43 ` [PATCH 02/11] ext4: fix fiemap size checks for bitmap files Christoph Hellwig
2020-05-06  9:18   ` Jan Kara

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=20200427181957.1606257-3-hch@lst.de \
    --to=hch@lst.de \
    --cc=adilger@dilger.ca \
    --cc=amir73il@gmail.com \
    --cc=jack@suse.cz \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-unionfs@vger.kernel.org \
    --cc=riteshh@linux.ibm.com \
    --cc=tytso@mit.edu \
    --cc=viro@zeniv.linux.org.uk \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.