Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 30f04a4e authored by Paolo 'Blaisorblade' Giarrusso's avatar Paolo 'Blaisorblade' Giarrusso Committed by Linus Torvalds
Browse files

[PATCH] uml: hostfs - fix possible PAGE_CACHE_SHIFT overflows



Prevent page->index << PAGE_CACHE_SHIFT from overflowing.

There is a casting there, but was added without care, so it's at the wrong
place. Note the extra parens around the shift - "+" is higher precedence than
"<<", leading to a GCC warning which saved all us.

Signed-off-by: default avatarPaolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 3d0a07e3
Loading
Loading
Loading
Loading
+6 −1
Original line number Original line Diff line number Diff line
@@ -501,11 +501,16 @@ int hostfs_commit_write(struct file *file, struct page *page, unsigned from,
	long long start;
	long long start;
	int err = 0;
	int err = 0;


	start = (long long) (page->index << PAGE_CACHE_SHIFT) + from;
	start = (((long long) page->index) << PAGE_CACHE_SHIFT) + from;
	buffer = kmap(page);
	buffer = kmap(page);
	err = write_file(FILE_HOSTFS_I(file)->fd, &start, buffer + from,
	err = write_file(FILE_HOSTFS_I(file)->fd, &start, buffer + from,
			 to - from);
			 to - from);
	if(err > 0) err = 0;
	if(err > 0) err = 0;

	/* Actually, if !err, write_file has added to-from to start, so, despite
	 * the appearance, we are comparing i_size against the _last_ written
	 * location, as we should. */

	if(!err && (start > inode->i_size))
	if(!err && (start > inode->i_size))
		inode->i_size = start;
		inode->i_size = start;