diff options
author | Bob Copeland <me@bobcopeland.com> | 2008-09-06 17:51:53 -0400 |
---|---|---|
committer | Bob Copeland <me@bobcopeland.com> | 2010-07-10 14:37:06 -0400 |
commit | f068272cb2f134a194b93e94a8e0672bfce48cd8 (patch) | |
tree | c6a2a67951646eee3d040b732b384fa5c98fe78c /fs/omfs/file.c | |
parent | 70d9e384aa7df681cfffd65947af72b22e86690e (diff) |
omfs: check bounds on block numbers before passing to sb_bread
In case of filesystem corruption, passing unchecked block numbers into
sb_bread can result in an infinite loop in __getblk(). Introduce a wrapper
function omfs_sbread() to check the block numbers and to also perform the
clus_to_blk() scaling.
Signed-off-by: Bob Copeland <me@bobcopeland.com>
Diffstat (limited to 'fs/omfs/file.c')
-rw-r--r-- | fs/omfs/file.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/fs/omfs/file.c b/fs/omfs/file.c index 6e7a3291bbe8..76bc21b91a8a 100644 --- a/fs/omfs/file.c +++ b/fs/omfs/file.c | |||
@@ -50,7 +50,7 @@ int omfs_shrink_inode(struct inode *inode) | |||
50 | if (inode->i_size != 0) | 50 | if (inode->i_size != 0) |
51 | goto out; | 51 | goto out; |
52 | 52 | ||
53 | bh = sb_bread(inode->i_sb, clus_to_blk(sbi, next)); | 53 | bh = omfs_bread(inode->i_sb, next); |
54 | if (!bh) | 54 | if (!bh) |
55 | goto out; | 55 | goto out; |
56 | 56 | ||
@@ -90,7 +90,7 @@ int omfs_shrink_inode(struct inode *inode) | |||
90 | if (next == ~0) | 90 | if (next == ~0) |
91 | break; | 91 | break; |
92 | 92 | ||
93 | bh = sb_bread(inode->i_sb, clus_to_blk(sbi, next)); | 93 | bh = omfs_bread(inode->i_sb, next); |
94 | if (!bh) | 94 | if (!bh) |
95 | goto out; | 95 | goto out; |
96 | oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); | 96 | oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); |
@@ -232,7 +232,7 @@ static int omfs_get_block(struct inode *inode, sector_t block, | |||
232 | int remain; | 232 | int remain; |
233 | 233 | ||
234 | ret = -EIO; | 234 | ret = -EIO; |
235 | bh = sb_bread(inode->i_sb, clus_to_blk(sbi, inode->i_ino)); | 235 | bh = omfs_bread(inode->i_sb, inode->i_ino); |
236 | if (!bh) | 236 | if (!bh) |
237 | goto out; | 237 | goto out; |
238 | 238 | ||
@@ -265,7 +265,7 @@ static int omfs_get_block(struct inode *inode, sector_t block, | |||
265 | break; | 265 | break; |
266 | 266 | ||
267 | brelse(bh); | 267 | brelse(bh); |
268 | bh = sb_bread(inode->i_sb, clus_to_blk(sbi, next)); | 268 | bh = omfs_bread(inode->i_sb, next); |
269 | if (!bh) | 269 | if (!bh) |
270 | goto out; | 270 | goto out; |
271 | oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); | 271 | oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); |