Skip to content

Commit 0eb1a8a

Browse files
nivedita76ingomolnar
authored andcommitted
x86/kaslr: Make local variables 64-bit
Change the type of local variables/fields that store mem_vector addresses to u64 to make it less likely that 32-bit overflow will cause issues on 32-bit. Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu> Signed-off-by: Ingo Molnar <mingo@kernel.org> Link: https://lore.kernel.org/r/20200728225722.67457-21-nivedita@alum.mit.edu
1 parent 3a06699 commit 0eb1a8a

1 file changed

Lines changed: 7 additions & 6 deletions

File tree

arch/x86/boot/compressed/kaslr.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ static bool mem_avoid_overlap(struct mem_vector *img,
461461
{
462462
int i;
463463
struct setup_data *ptr;
464-
unsigned long earliest = img->start + img->size;
464+
u64 earliest = img->start + img->size;
465465
bool is_overlapping = false;
466466

467467
for (i = 0; i < MEM_AVOID_MAX; i++) {
@@ -506,7 +506,7 @@ static bool mem_avoid_overlap(struct mem_vector *img,
506506
}
507507

508508
struct slot_area {
509-
unsigned long addr;
509+
u64 addr;
510510
unsigned long num;
511511
};
512512

@@ -537,7 +537,8 @@ static void store_slot_info(struct mem_vector *region, unsigned long image_size)
537537
static void
538538
process_gb_huge_pages(struct mem_vector *region, unsigned long image_size)
539539
{
540-
unsigned long pud_start, pud_end, gb_huge_pages;
540+
u64 pud_start, pud_end;
541+
unsigned long gb_huge_pages;
541542
struct mem_vector tmp;
542543

543544
if (!IS_ENABLED(CONFIG_X86_64) || !max_gb_huge_pages) {
@@ -579,7 +580,7 @@ process_gb_huge_pages(struct mem_vector *region, unsigned long image_size)
579580
}
580581
}
581582

582-
static unsigned long slots_fetch_random(void)
583+
static u64 slots_fetch_random(void)
583584
{
584585
unsigned long slot;
585586
unsigned int i;
@@ -595,7 +596,7 @@ static unsigned long slots_fetch_random(void)
595596
slot -= slot_areas[i].num;
596597
continue;
597598
}
598-
return slot_areas[i].addr + slot * CONFIG_PHYSICAL_ALIGN;
599+
return slot_areas[i].addr + ((u64)slot * CONFIG_PHYSICAL_ALIGN);
599600
}
600601

601602
if (i == slot_area_index)
@@ -608,7 +609,7 @@ static void __process_mem_region(struct mem_vector *entry,
608609
unsigned long image_size)
609610
{
610611
struct mem_vector region, overlap;
611-
unsigned long region_end;
612+
u64 region_end;
612613

613614
/* Enforce minimum and memory limit. */
614615
region.start = max_t(u64, entry->start, minimum);

0 commit comments

Comments
 (0)