mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
kexec: fix segmentation fault in kimage_add_entry
A segmentation fault can occur in kimage_add_entry in kexec.c when loading a kernel image into memory. The fault occurs because a page is requested by calling kimage_alloc_page with gfp_mask GFP_KERNEL and the function may actually return a page with gfp_mask GFP_HIGHUSER. The high mem page is returned because it was swapped with the kernel page due to the kernel page being a page that will shortly be copied to. This patch ensures that kimage_alloc_page returns a page that was created with the correct gfp flags. I have verified the change and fixed the whitespace damage of the original patch. Jonathan did a great job of tracking this down after he hit the problem. -- Eric Signed-off-by: Jonathan Steel <jon.steel@esentire.com> Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Acked-by: Simon Horman <horms@verge.net.au> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
39f00c087d
commit
f9092f358b
1 changed files with 7 additions and 1 deletions
|
@ -753,8 +753,14 @@ static struct page *kimage_alloc_page(struct kimage *image,
|
||||||
*old = addr | (*old & ~PAGE_MASK);
|
*old = addr | (*old & ~PAGE_MASK);
|
||||||
|
|
||||||
/* The old page I have found cannot be a
|
/* The old page I have found cannot be a
|
||||||
* destination page, so return it.
|
* destination page, so return it if it's
|
||||||
|
* gfp_flags honor the ones passed in.
|
||||||
*/
|
*/
|
||||||
|
if (!(gfp_mask & __GFP_HIGHMEM) &&
|
||||||
|
PageHighMem(old_page)) {
|
||||||
|
kimage_free_pages(old_page);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
addr = old_addr;
|
addr = old_addr;
|
||||||
page = old_page;
|
page = old_page;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue