lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Wed, 03 Mar 2010 16:47:28 +0900 From: Akira Fujita <a-fujita@...jp.nec.com> To: "Theodore Ts'o" <tytso@....edu>, Leonard Michlmayr <leonard.michlmayr@...il.com> CC: Ext4 Developers List <linux-ext4@...r.kernel.org> Subject: Re: [PATCH 11/28] ext4: correctly calculate number of blocks for fiemap Hi, > From: Leonard Michlmayr<leonard.michlmayr@...il.com> > > ext4_fiemap() rounds the length of the requested range down to > blocksize, which is is not the true number of blocks that cover the > requested region. This problem is especially impressive if the user > requests only the first byte of a file: not a single extent will be > reported. <snip> > start_blk = start>> inode->i_sb->s_blocksize_bits; > - len_blks = len>> inode->i_sb->s_blocksize_bits; > + last_blk = (start + len - 1)>> inode->i_sb->s_blocksize_bits; > + len_blks = last_blk - start_blk + 1; In 1KB block size, the overflow occurs at above line. Since last_blk is set 0xffffffff when len is equal to s_maxbytes. Therefore ext4_fiemap() can not get correct extent information with 0 length. How about adding this change? Signed-off-by: Akira Fujita <a-fujita@...jp.nec.com> --- extents.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) --- linux-2.6.33-rc8-a/fs/ext4/extents.c 2010-03-03 14:53:49.000000000 +0900 +++ linux-2.6.33-rc8-b/fs/ext4/extents.c 2010-03-03 15:31:57.000000000 +0900 @@ -3912,7 +3912,8 @@ int ext4_fiemap(struct inode *inode, str start_blk = start >> inode->i_sb->s_blocksize_bits; last_blk = (start + len - 1) >> inode->i_sb->s_blocksize_bits; - len_blks = last_blk - start_blk + 1; + len_blks = (loff_t)last_blk - start_blk + 1 < EXT_MAX_BLOCK ? + last_blk - start_blk + 1 : EXT_MAX_BLOCK; /* * Walk the extent tree gathering extent information. (2010/03/03 3:18), Theodore Ts'o wrote: > From: Leonard Michlmayr<leonard.michlmayr@...il.com> > > ext4_fiemap() rounds the length of the requested range down to > blocksize, which is is not the true number of blocks that cover the > requested region. This problem is especially impressive if the user > requests only the first byte of a file: not a single extent will be > reported. > > We fix this by calculating the last block of the region and then > subtract to find the number of blocks in the extents. > > Signed-off-by: Leonard Michlmayr<leonard.michlmayr@...il.com> > Signed-off-by: "Theodore Ts'o"<tytso@....edu> > --- > fs/ext4/extents.c | 6 ++++-- > 1 files changed, 4 insertions(+), 2 deletions(-) > > diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c > index bd80891..bc9860f 100644 > --- a/fs/ext4/extents.c > +++ b/fs/ext4/extents.c > @@ -3768,7 +3768,6 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, > __u64 start, __u64 len) > { > ext4_lblk_t start_blk; > - ext4_lblk_t len_blks; > int error = 0; > > /* fallback to generic here if not in extents fmt */ > @@ -3782,8 +3781,11 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, > if (fieinfo->fi_flags& FIEMAP_FLAG_XATTR) { > error = ext4_xattr_fiemap(inode, fieinfo); > } else { > + ext4_lblk_t last_blk, len_blks; > + > start_blk = start>> inode->i_sb->s_blocksize_bits; > - len_blks = len>> inode->i_sb->s_blocksize_bits; > + last_blk = (start + len - 1)>> inode->i_sb->s_blocksize_bits; > + len_blks = last_blk - start_blk + 1; > > /* > * Walk the extent tree gathering extent information. -- Akira Fujita <a-fujita@...jp.nec.com> The First Fundamental Software Development Group, Software Development Division, NEC Software Tohoku, Ltd. --Separator@...ujita@...jp.nec.com: -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists