提交 a4656391 编写于 作者: N Nathan Scott

[XFS] Fix a 32 bit value wraparound when providing a mapping for a large

direct write.

SGI-PV: 944820
SGI-Modid: xfs-linux-melb:xfs-kern:24351a
Signed-off-by: NNathan Scott <nathans@sgi.com>
上级 f33c6797
...@@ -941,13 +941,12 @@ __linvfs_get_block( ...@@ -941,13 +941,12 @@ __linvfs_get_block(
int retpbbm = 1; int retpbbm = 1;
int error; int error;
if (blocks) {
offset = blocks << inode->i_blkbits; /* 64 bit goodness */
size = (ssize_t) min_t(xfs_off_t, offset, LONG_MAX);
} else {
size = 1 << inode->i_blkbits;
}
offset = (xfs_off_t)iblock << inode->i_blkbits; offset = (xfs_off_t)iblock << inode->i_blkbits;
if (blocks)
size = (ssize_t) min_t(xfs_off_t, LONG_MAX,
(xfs_off_t)blocks << inode->i_blkbits);
else
size = 1 << inode->i_blkbits;
VOP_BMAP(vp, offset, size, VOP_BMAP(vp, offset, size,
create ? flags : BMAPI_READ, &iomap, &retpbbm, error); create ? flags : BMAPI_READ, &iomap, &retpbbm, error);
...@@ -1007,7 +1006,7 @@ __linvfs_get_block( ...@@ -1007,7 +1006,7 @@ __linvfs_get_block(
ASSERT(iomap.iomap_bsize - iomap.iomap_delta > 0); ASSERT(iomap.iomap_bsize - iomap.iomap_delta > 0);
offset = min_t(xfs_off_t, offset = min_t(xfs_off_t,
iomap.iomap_bsize - iomap.iomap_delta, iomap.iomap_bsize - iomap.iomap_delta,
blocks << inode->i_blkbits); (xfs_off_t)blocks << inode->i_blkbits);
bh_result->b_size = (u32) min_t(xfs_off_t, UINT_MAX, offset); bh_result->b_size = (u32) min_t(xfs_off_t, UINT_MAX, offset);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册