Skip to content

Commit

Permalink
Fix kernel version macros for revision numbers over 255
Browse files Browse the repository at this point in the history
The current comparison macros for kernel version shift minor number only
8 bits.  This can cause an unexpected result on kernels with revision
number over 255, e.g. Linux 4.14.314.

In fact, on Linux 4.14.314 for x86_64 without CONFIG_RANDOMIZE_BASE=y
(KASLR), the following condition became false in x86_64_init().

    ((THIS_KERNEL_VERSION >= LINUX(4,14,84)) &&
     (THIS_KERNEL_VERSION < LINUX(4,15,0)))

As a result, crash used a wrong hard-coded value for PAGE_OFFSET and
failed to start a session with the following seek error.

  crash: seek error: physical address: 200e000  type: "pud page"

Shift the major and minor number by 24 and 16 bits respectively to fix
this issue.

Reported-by: Luiz Capitulino <luizcap@amazon.com>
Tested-by: Luiz Capitulino <luizcap@amazon.com>
Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
  • Loading branch information
k-hagio committed May 15, 2023
1 parent 2505a65 commit 040a56e
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions defs.h
Expand Up @@ -807,10 +807,10 @@ struct kernel_table { /* kernel data */
} \
}

#define THIS_KERNEL_VERSION ((kt->kernel_version[0] << 16) + \
(kt->kernel_version[1] << 8) + \
#define THIS_KERNEL_VERSION ((kt->kernel_version[0] << 24) + \
(kt->kernel_version[1] << 16) + \
(kt->kernel_version[2]))
#define LINUX(x,y,z) (((uint)(x) << 16) + ((uint)(y) << 8) + (uint)(z))
#define LINUX(x,y,z) (((uint)(x) << 24) + ((uint)(y) << 16) + (uint)(z))

#define THIS_GCC_VERSION ((kt->gcc_version[0] << 16) + \
(kt->gcc_version[1] << 8) + \
Expand Down

0 comments on commit 040a56e

Please sign in to comment.