mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
[PATCH] fix possible PAGE_CACHE_SHIFT overflows
We've had two instances recently of overflows when doing 64_bit_value = (32_bit_value << PAGE_CACHE_SHIFT) I did a tree-wide grep of `<<.*PAGE_CACHE_SHIFT' and this is the result. - afs_rxfs_fetch_descriptor.offset is of type off_t, which seems broken. - jfs and jffs are limited to 4GB anyway. - reiserfs map_block_for_writepage() takes an unsigned long for the block - it should take sector_t. (It'll fail for huge filesystems with blocksize<PAGE_CACHE_SIZE) - cramfs_read() needs to use sector_t (I think cramsfs is busted on large filesystems anyway) - affs is limited in file size anyway. - I generally didn't fix 32-bit overflows in directory operations. - arm's __flush_dcache_page() is peculiar. What if the page lies beyond 4G? - gss_wrap_req_priv() needs checking (snd_buf->page_base) Cc: Oleg Drokin <[email protected]> Cc: David Howells <[email protected]> Cc: David Woodhouse <[email protected]> Cc: <[email protected]> Cc: Christoph Hellwig <[email protected]> Cc: Anton Altaparmakov <[email protected]> Cc: Jeff Dike <[email protected]> Cc: Paolo 'Blaisorblade' Giarrusso <[email protected]> Cc: Roman Zippel <[email protected]> Cc: <[email protected]> Cc: Miklos Szeredi <[email protected]> Cc: Russell King <[email protected]> Cc: Trond Myklebust <[email protected]> Cc: Neil Brown <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
676121fcb6
commit
54b21a7992
8 changed files with 17 additions and 17 deletions
|
|
@ -418,7 +418,7 @@ static int
|
|||
romfs_readpage(struct file *file, struct page * page)
|
||||
{
|
||||
struct inode *inode = page->mapping->host;
|
||||
unsigned long offset, avail, readlen;
|
||||
loff_t offset, avail, readlen;
|
||||
void *buf;
|
||||
int result = -EIO;
|
||||
|
||||
|
|
@ -429,8 +429,8 @@ romfs_readpage(struct file *file, struct page * page)
|
|||
goto err_out;
|
||||
|
||||
/* 32 bit warning -- but not for us :) */
|
||||
offset = page->index << PAGE_CACHE_SHIFT;
|
||||
if (offset < inode->i_size) {
|
||||
offset = page_offset(page);
|
||||
if (offset < i_size_read(inode)) {
|
||||
avail = inode->i_size-offset;
|
||||
readlen = min_t(unsigned long, avail, PAGE_SIZE);
|
||||
if (romfs_copyfrom(inode, buf, ROMFS_I(inode)->i_dataoffset+offset, readlen) == readlen) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue