From: HATAYAMA Daisuke <d.hatay...@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

--
Crash-utility mailing list
Crash-utility@redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility

Reply via email to