linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Kees Cook <keescook@chromium.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: Kees Cook <keescook@chromium.org>, Borislav Petkov <bp@suse.de>,
	Baoquan He <bhe@redhat.com>, Yinghai Lu <yinghai@kernel.org>,
	Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
	Borislav Petkov <bp@alien8.de>, Vivek Goyal <vgoyal@redhat.com>,
	Andy Lutomirski <luto@kernel.org>,
	lasse.collin@tukaani.org,
	Andrew Morton <akpm@linux-foundation.org>,
	Dave Young <dyoung@redhat.com>,
	kernel-hardening@lists.openwall.com,
	LKML <linux-kernel@vger.kernel.org>
Subject: [PATCH v7 4/9] x86/KASLR: Return earliest overlap when avoiding regions
Date: Mon,  9 May 2016 13:22:07 -0700	[thread overview]
Message-ID: <1462825332-10505-5-git-send-email-keescook@chromium.org> (raw)
In-Reply-To: <1462825332-10505-1-git-send-email-keescook@chromium.org>

In preparation for being able to detect where to split up contiguous
memory regions that overlap with memory regions to avoid, we need to
pass back what the earliest overlapping region was. This modifies the
overlap checker to return that information.

Based on a separate mem_min_overlap() implementation by Baoquan He.

Signed-off-by: Kees Cook <keescook@chromium.org>
---
 arch/x86/boot/compressed/kaslr.c | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/arch/x86/boot/compressed/kaslr.c b/arch/x86/boot/compressed/kaslr.c
index 89f0148e3e84..1c02f07ce55a 100644
--- a/arch/x86/boot/compressed/kaslr.c
+++ b/arch/x86/boot/compressed/kaslr.c
@@ -279,15 +279,24 @@ static void mem_avoid_init(unsigned long input, unsigned long input_size,
 #endif
 }
 
-/* Does this memory vector overlap a known avoided area? */
-static bool mem_avoid_overlap(struct mem_vector *img)
+/*
+ * Does this memory vector overlap a known avoided area? If so, record the
+ * overlap region with the lowest address.
+ */
+static bool mem_avoid_overlap(struct mem_vector *img,
+			      struct mem_vector *overlap)
 {
 	int i;
 	struct setup_data *ptr;
+	unsigned long earliest = img->start + img->size;
+	bool is_overlapping = false;
 
 	for (i = 0; i < MEM_AVOID_MAX; i++) {
-		if (mem_overlaps(img, &mem_avoid[i]))
-			return true;
+		if (mem_overlaps(img, &mem_avoid[i]) &&
+		    mem_avoid[i].start < earliest) {
+			*overlap = mem_avoid[i];
+			is_overlapping = true;
+		}
 	}
 
 	/* Avoid all entries in the setup_data linked list. */
@@ -298,13 +307,15 @@ static bool mem_avoid_overlap(struct mem_vector *img)
 		avoid.start = (unsigned long)ptr;
 		avoid.size = sizeof(*ptr) + ptr->len;
 
-		if (mem_overlaps(img, &avoid))
-			return true;
+		if (mem_overlaps(img, &avoid) && (avoid.start < earliest)) {
+			*overlap = avoid;
+			is_overlapping = true;
+		}
 
 		ptr = (struct setup_data *)(unsigned long)ptr->next;
 	}
 
-	return false;
+	return is_overlapping;
 }
 
 static unsigned long slots[KERNEL_IMAGE_SIZE / CONFIG_PHYSICAL_ALIGN];
@@ -361,7 +372,7 @@ static void process_e820_entry(struct e820entry *entry,
 			       unsigned long minimum,
 			       unsigned long image_size)
 {
-	struct mem_vector region, img;
+	struct mem_vector region, img, overlap;
 
 	/* Skip non-RAM entries. */
 	if (entry->type != E820_RAM)
@@ -400,7 +411,7 @@ static void process_e820_entry(struct e820entry *entry,
 	for (img.start = region.start, img.size = image_size ;
 	     mem_contains(&region, &img) ;
 	     img.start += CONFIG_PHYSICAL_ALIGN) {
-		if (mem_avoid_overlap(&img))
+		if (mem_avoid_overlap(&img, &overlap))
 			continue;
 		slots_append(img.start);
 	}
-- 
2.6.3

  parent reply	other threads:[~2016-05-09 20:22 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-09 20:22 [PATCH v7 0/9] x86/KASLR: Randomize virtual address separately Kees Cook
2016-05-09 20:22 ` [PATCH v7 1/9] x86/KASLR: Initialize mapping_info every time Kees Cook
2016-05-09 22:01   ` Yinghai Lu
2016-05-09 22:23     ` Yinghai Lu
2016-05-09 22:27       ` Yinghai Lu
2016-05-09 22:23     ` Kees Cook
2016-05-09 22:28       ` Yinghai Lu
2016-05-10  5:58         ` Ingo Molnar
2016-05-10 11:21           ` Borislav Petkov
2016-05-10  8:40   ` [tip:x86/boot] " tip-bot for Kees Cook
2016-05-09 20:22 ` [PATCH v7 2/9] x86/boot: Add missing file header comments Kees Cook
2016-05-10  8:41   ` [tip:x86/boot] " tip-bot for Kees Cook
2016-05-09 20:22 ` [PATCH v7 3/9] x86/KASLR: Add slot_area to manage random_addr slots Kees Cook
2016-05-10  8:41   ` [tip:x86/boot] x86/KASLR: Add 'struct slot_area' " tip-bot for Baoquan He
2016-05-09 20:22 ` Kees Cook [this message]
2016-05-10  8:42   ` [tip:x86/boot] x86/KASLR: Return earliest overlap when avoiding regions tip-bot for Kees Cook
2016-05-09 20:22 ` [PATCH v7 5/9] x86/KASLR: Add virtual address choosing function Kees Cook
2016-05-10  8:42   ` [tip:x86/boot] " tip-bot for Baoquan He
2016-05-09 20:22 ` [PATCH v7 6/9] x86/KASLR: Clarify purpose of each get_random_long() Kees Cook
2016-05-10  8:42   ` [tip:x86/boot] " tip-bot for Kees Cook
2016-05-09 20:22 ` [PATCH v7 7/9] x86/KASLR: Randomize virtual address separately Kees Cook
2016-05-09 20:22 ` [PATCH v7 8/9] x86/KASLR: Add physical address randomization >4G Kees Cook
2016-05-09 20:22 ` [PATCH v7 9/9] x86/KASLR: Allow randomization below load address Kees Cook

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1462825332-10505-5-git-send-email-keescook@chromium.org \
    --to=keescook@chromium.org \
    --cc=akpm@linux-foundation.org \
    --cc=bhe@redhat.com \
    --cc=bp@alien8.de \
    --cc=bp@suse.de \
    --cc=dyoung@redhat.com \
    --cc=hpa@zytor.com \
    --cc=kernel-hardening@lists.openwall.com \
    --cc=lasse.collin@tukaani.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=mingo@kernel.org \
    --cc=mingo@redhat.com \
    --cc=vgoyal@redhat.com \
    --cc=yinghai@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).