Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.5:Update
makedumpfile.14460
makedumpfile-x86_64-fix-get_kaslr_offset_x86_64...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File makedumpfile-x86_64-fix-get_kaslr_offset_x86_64-to-return-k.patch of Package makedumpfile.14460
From 3222d4ad04c663d5754d9a1317d64590c9d35449 Mon Sep 17 00:00:00 2001 From: Kazuhito Hagio <k-hagio@ab.jp.nec.com> Date: Fri, 24 May 2019 12:03:13 -0400 Subject: x86_64: fix get_kaslr_offset_x86_64() to return kaslr_offset correctly References: bsc#1141895 Upstream: merged Git-commit: 3222d4ad04c663d5754d9a1317d64590c9d35449 Currently, the get_kaslr_offset_x86_64() function has the following condition to return info->kaslr_offset, but it is wrong, and it can return 0 for kernel text addresses if info->kaslr_offset is small. if (vaddr >= __START_KERNEL_map && vaddr < __START_KERNEL_map + info->kaslr_offset) Consequently, kernel text symbols in erase config could be resolved wrongly, and makedumpfile fails to vtop with the following message or erases unintended data. __vtop4_x86_64: Can't get a valid pmd_pte. To fix this, use NUMBER(KERNEL_IMAGE_SIZE) in vmcoreinfo if any, otherwise use the hard-coded value (1 GiB) for KASLR, which has not been changed from the initial KASLR implementation. Signed-off-by: Kazuhito Hagio <k-hagio@ab.jp.nec.com> Acked-by: Petr Tesarik <ptesarik@suse.com> --- arch/x86_64.c | 11 ++++++++++- makedumpfile.c | 2 ++ makedumpfile.h | 2 ++ 3 files changed, 14 insertions(+), 1 deletion(-) --- a/arch/x86_64.c +++ b/arch/x86_64.c @@ -38,6 +38,7 @@ get_kaslr_offset_x86_64(unsigned long va { unsigned int i; char buf[BUFSIZE_FGETS], *endp; + unsigned long kernel_image_size; if (!info->kaslr_offset && info->file_vmcoreinfo) { if (fseek(info->file_vmcoreinfo, 0, SEEK_SET) < 0) { @@ -58,8 +59,16 @@ get_kaslr_offset_x86_64(unsigned long va strtoul(buf+strlen(STR_KERNELOFFSET),&endp,16); } } + if (!info->kaslr_offset) + return 0; + + if (NUMBER(KERNEL_IMAGE_SIZE) != NOT_FOUND_NUMBER) + kernel_image_size = NUMBER(KERNEL_IMAGE_SIZE); + else + kernel_image_size = KERNEL_IMAGE_SIZE_KASLR_ORIG; + if (vaddr >= __START_KERNEL_map && - vaddr < __START_KERNEL_map + info->kaslr_offset) + vaddr < __START_KERNEL_map + kernel_image_size) return info->kaslr_offset; else /* --- a/makedumpfile.c +++ b/makedumpfile.c @@ -2304,6 +2304,7 @@ write_vmcoreinfo_data(void) WRITE_NUMBER("PAGE_OFFLINE_MAPCOUNT_VALUE", PAGE_OFFLINE_MAPCOUNT_VALUE); WRITE_NUMBER("phys_base", phys_base); + WRITE_NUMBER("KERNEL_IMAGE_SIZE", KERNEL_IMAGE_SIZE); WRITE_NUMBER("HUGETLB_PAGE_DTOR", HUGETLB_PAGE_DTOR); #ifdef __aarch64__ @@ -2706,6 +2707,7 @@ read_vmcoreinfo(void) READ_NUMBER("PAGE_BUDDY_MAPCOUNT_VALUE", PAGE_BUDDY_MAPCOUNT_VALUE); READ_NUMBER("PAGE_OFFLINE_MAPCOUNT_VALUE", PAGE_OFFLINE_MAPCOUNT_VALUE); READ_NUMBER("phys_base", phys_base); + READ_NUMBER("KERNEL_IMAGE_SIZE", KERNEL_IMAGE_SIZE); #ifdef __aarch64__ READ_NUMBER("VA_BITS", VA_BITS); READ_NUMBER_UNSIGNED("PHYS_OFFSET", PHYS_OFFSET); --- a/makedumpfile.h +++ b/makedumpfile.h @@ -593,6 +593,7 @@ unsigned long get_kvbase_arm64(void); #define VMEMMAP_END_2_6_31 (0xffffeaffffffffff) /* 2.6.31, or later */ #define __START_KERNEL_map (0xffffffff80000000) +#define KERNEL_IMAGE_SIZE_KASLR_ORIG (1024*1024*1024) /* 3.14, or later */ #define KVBASE PAGE_OFFSET #define _SECTION_SIZE_BITS (27) #define _MAX_PHYSMEM_BITS_ORIG (40) @@ -1880,6 +1881,7 @@ struct number_table { long MAX_PHYSMEM_BITS; long HUGETLB_PAGE_DTOR; long phys_base; + long KERNEL_IMAGE_SIZE; #ifdef __aarch64__ long VA_BITS; unsigned long PHYS_OFFSET;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor