[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20180323012747.GV30836@localhost.localdomain>
Date: Fri, 23 Mar 2018 09:27:47 +0800
From: Eryu Guan <guaneryu@...il.com>
To: Jan Kara <jack@...e.cz>
Cc: Ted Tso <tytso@....edu>, linux-ext4@...r.kernel.org,
Jiri Slaby <jslaby@...e.cz>
Subject: Re: [PATCH] ext4: Fix offset overflow on 32-bit archs in
ext4_iomap_begin()
On Tue, Feb 20, 2018 at 06:23:07PM +0100, Jan Kara wrote:
> From: Jiri Slaby <jslaby@...e.cz>
>
> ext4_iomap_begin() has a bug where offset returned in the iomap
> structure will be truncated to unsigned long size. On 64-bit
> architectures this is fine but on 32-bit architectures obviously not.
> Not many places actually use the offset stored in the iomap structure
> but one of visible failures is in SEEK_HOLE / SEEK_DATA implementation.
> If we create a file like:
>
> dd if=/dev/urandom of=file bs=1k seek=8m count=1
>
> then
>
> lseek64("file", 0x100000000ULL, SEEK_DATA)
>
> wrongly returns 0x100000000 on unfixed kernel while it should return
> 0x200000000. Avoid the overflow by proper type cast.
It looks like a good candidate for a regression test in fstests :)
Thanks,
Eryu
>
> Fixes: 545052e9e35a ("ext4: Switch to iomap for SEEK_HOLE / SEEK_DATA")
> Signed-off-by: Jiri Slaby <jslaby@...e.cz>
> Signed-off-by: Jan Kara <jack@...e.cz>
> ---
> fs/ext4/inode.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> index c94780075b04..c07d6456b548 100644
> --- a/fs/ext4/inode.c
> +++ b/fs/ext4/inode.c
> @@ -3524,7 +3524,7 @@ static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
> iomap->flags |= IOMAP_F_DIRTY;
> iomap->bdev = inode->i_sb->s_bdev;
> iomap->dax_dev = sbi->s_daxdev;
> - iomap->offset = first_block << blkbits;
> + iomap->offset = (u64)first_block << blkbits;
> iomap->length = (u64)map.m_len << blkbits;
>
> if (ret == 0) {
> --
> 2.13.6
>
Powered by blists - more mailing lists