[Crash-utility] [PATCH 3/4] kaslr: cleanup how to set values to the arguments of calc_kaslr_offset()

HATAYAMA Daisuke d.hatayama at fujitsu.com
Thu Jul 9 12:11:04 UTC 2020


From: HATAYAMA Daisuke <d.hatayama at jp.fujitsu.com>

Setting values of the arguments of calc_kaslr_offset() should be done
at the end of the function. Currently, they are set in the middle
where their values could still be changed according to
get_kaslr_offset_from_vmcoreinfo(). This behavior will be problematic
in the later commits when we implement a trial-and-error approach
because the value of kaslr_offset could be passed to the outside of
calc_kaslr_offset() unexpectedly. Thus, fix this first.
---
 kaslr_helper.c | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/kaslr_helper.c b/kaslr_helper.c
index fe5909c..acbb5c2 100644
--- a/kaslr_helper.c
+++ b/kaslr_helper.c
@@ -394,10 +394,11 @@ quit:
 #define PTI_USER_PGTABLE_MASK	(1 << PTI_USER_PGTABLE_BIT)
 #define CR3_PCID_MASK		0xFFFull
 int
-calc_kaslr_offset(ulong *kaslr_offset, ulong *phys_base)
+calc_kaslr_offset(ulong *ko, ulong *pb)
 {
 	uint64_t cr3 = 0, idtr = 0, pgd = 0, idtr_paddr;
 	ulong divide_error_vmcore;
+	ulong kaslr_offset, phys_base;
 	ulong kaslr_offset_kdump, phys_base_kdump;
 	int ret = FALSE;
 	int verbose = CRASHDEBUG(1)? 1: 0;
@@ -445,9 +446,9 @@ calc_kaslr_offset(ulong *kaslr_offset, ulong *phys_base)
 
 	/* Now we can calculate kaslr_offset and phys_base */
 	divide_error_vmcore = get_vec0_addr(idtr_paddr);
-	*kaslr_offset = divide_error_vmcore - st->divide_error_vmlinux;
-	*phys_base = idtr_paddr -
-		(st->idt_table_vmlinux + *kaslr_offset - __START_KERNEL_map);
+	kaslr_offset = divide_error_vmcore - st->divide_error_vmlinux;
+	phys_base = idtr_paddr -
+		(st->idt_table_vmlinux + kaslr_offset - __START_KERNEL_map);
 
 	if (CRASHDEBUG(1)) {
 		fprintf(fp, "calc_kaslr_offset: idtr=%lx\n", idtr);
@@ -465,9 +466,9 @@ calc_kaslr_offset(ulong *kaslr_offset, ulong *phys_base)
 	 * from vmcoreinfo
 	 */
 	if (get_kaslr_offset_from_vmcoreinfo(
-		*kaslr_offset, &kaslr_offset_kdump, &phys_base_kdump)) {
-		*kaslr_offset =  kaslr_offset_kdump;
-		*phys_base =  phys_base_kdump;
+		kaslr_offset, &kaslr_offset_kdump, &phys_base_kdump)) {
+		kaslr_offset =  kaslr_offset_kdump;
+		phys_base =  phys_base_kdump;
 	} else if (CRASHDEBUG(1)) {
 		fprintf(fp, "kaslr_helper: failed to determine which kernel was running at crash,\n");
 		fprintf(fp, "kaslr_helper: asssuming the kdump 1st kernel.\n");
@@ -475,10 +476,13 @@ calc_kaslr_offset(ulong *kaslr_offset, ulong *phys_base)
 
 	if (CRASHDEBUG(1)) {
 		fprintf(fp, "calc_kaslr_offset: kaslr_offset=%lx\n",
-			*kaslr_offset);
-		fprintf(fp, "calc_kaslr_offset: phys_base=%lx\n", *phys_base);
+			kaslr_offset);
+		fprintf(fp, "calc_kaslr_offset: phys_base=%lx\n", phys_base);
 	}
 
+	*ko = kaslr_offset;
+	*pb = phys_base;
+
 	ret = TRUE;
 quit:
 	vt->kernel_pgd[0] = 0;
-- 
1.8.3.1




More information about the Crash-utility mailing list