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
|
@ -753,8 +753,14 @@ static struct page *kimage_alloc_page(struct kimage *image,
|
|||
*old = addr | (*old & ~PAGE_MASK);
|
||||
|
||||
/* 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;
|
||||
page = old_page;
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue