summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/x86/boot/compressed/kaslr.c20
-rw-r--r--arch/x86/boot/compressed/misc.h10
2 files changed, 19 insertions, 11 deletions
diff --git a/arch/x86/boot/compressed/kaslr.c b/arch/x86/boot/compressed/kaslr.c
index f1818d95d726..2072d82c1911 100644
--- a/arch/x86/boot/compressed/kaslr.c
+++ b/arch/x86/boot/compressed/kaslr.c
@@ -305,12 +305,21 @@ static unsigned long find_random_addr(unsigned long minimum,
return slots_fetch_random();
}
-unsigned char *choose_random_location(unsigned char *input,
+unsigned char *choose_random_location(unsigned char *input_ptr,
unsigned long input_size,
- unsigned char *output,
+ unsigned char *output_ptr,
unsigned long output_size)
{
- unsigned long choice = (unsigned long)output;
+ /*
+ * The caller of choose_random_location() uses unsigned char * for
+ * buffer pointers since it performs decompression, elf parsing, etc.
+ * Since this code examines addresses much more numerically,
+ * unsigned long is used internally here. Instead of sprinkling
+ * more casts into extract_kernel, do them here and at return.
+ */
+ unsigned long input = (unsigned long)input_ptr;
+ unsigned long output = (unsigned long)output_ptr;
+ unsigned long choice = output;
unsigned long random_addr;
#ifdef CONFIG_HIBERNATION
@@ -328,11 +337,10 @@ unsigned char *choose_random_location(unsigned char *input,
boot_params->hdr.loadflags |= KASLR_FLAG;
/* Record the various known unsafe memory ranges. */
- mem_avoid_init((unsigned long)input, input_size,
- (unsigned long)output, output_size);
+ mem_avoid_init(input, input_size, output, output_size);
/* Walk e820 and find a random address. */
- random_addr = find_random_addr(choice, output_size);
+ random_addr = find_random_addr(output, output_size);
if (!random_addr) {
warn("KASLR disabled: could not find suitable E820 region!");
goto out;
diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h
index 9887e0d4aaeb..1f23d022d241 100644
--- a/arch/x86/boot/compressed/misc.h
+++ b/arch/x86/boot/compressed/misc.h
@@ -67,20 +67,20 @@ int cmdline_find_option_bool(const char *option);
#if CONFIG_RANDOMIZE_BASE
/* kaslr.c */
-unsigned char *choose_random_location(unsigned char *input,
+unsigned char *choose_random_location(unsigned char *input_ptr,
unsigned long input_size,
- unsigned char *output,
+ unsigned char *output_ptr,
unsigned long output_size);
/* cpuflags.c */
bool has_cpuflag(int flag);
#else
static inline
-unsigned char *choose_random_location(unsigned char *input,
+unsigned char *choose_random_location(unsigned char *input_ptr,
unsigned long input_size,
- unsigned char *output,
+ unsigned char *output_ptr,
unsigned long output_size)
{
- return output;
+ return output_ptr;
}
#endif