Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1397360

[PATCH v7 4/9] x86/KASLR: Return earliest overlap when avoiding regions

Path csiph.com!news.mixmin.net!aioe.org!bofh.it!news.nic.it!robomod
From Kees Cook <keescook@chromium.org>
Newsgroups linux.kernel
Subject [PATCH v7 4/9] x86/KASLR: Return earliest overlap when avoiding regions
Date Mon, 09 May 2016 22:30:02 +0200
Message-ID <rwZYu-4gl-19@gated-at.bofh.it> (permalink)
References <rwZYt-4gl-5@gated-at.bofh.it>
Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=AerBiiYx+K4cCngtyhStO88f1nUPn2Ix2kVczFMEhzI=; b=FVsrw/9mOwz726jBIlRF7yBIN8WTHDTtKa4gYvv+CAlIZSZWhfyjkE9nEsQDiMVb0F xnIaGjwe8QVd/hYVFQZk5Km+nzYpIg1q5It706/t2sY7s6HTeABIQ3uchhMpQcyymvcU M5evQM/26oMqJfTADxlE9cGtdjdeVr7xLk7d8=
X-Google-Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=AerBiiYx+K4cCngtyhStO88f1nUPn2Ix2kVczFMEhzI=; b=SUVuHh49Vpl/cLlz23dxnXhsnvAZqvmljqGkGsjz95JukqS5ykVmsTPRGAyZUlNtUN KW9Cldc2NyulG/vJtdiNch/bMbGVuScqlCuiYF9w9S/henZM8X/0NUF2LWXSuABWimoy P+M0HEJBNsJVInH9IJjYCGuPGiXSCOkGhZbM8y4/vmv34sl9eHNJHJhiSYqCAbhePPXS /1M/7emwOJiZz0f8ZvpuNfitiZTXIvq4fv9CPMvnWkTfgKbhrd0o6XvKM1TEGpDXHVUP 4oe0gCckkN8ZtPu3Xeo/38QBMAf16uDmjRTT8PQzsm5n2RAZ7hlrKKKoE7h+tFKIdyle OY6w==
X-Gm-Message-State AOPr4FUiiARj5kPgrwcdUnFlfLIO0jISdO7XKFqed4GPiufi59wX49qRCxlrqkaFh5b+HA==
X-Received by 10.66.41.107 with SMTP id e11mr53162315pal.15.1462825336791; Mon, 09 May 2016 13:22:16 -0700 (PDT)
X-Mailer git-send-email 2.6.3
Sender robomod@news.nic.it
List-ID <linux-kernel.vger.kernel.org>
X-Mailing-List linux-kernel@vger.kernel.org
Approved robomod@news.nic.it
Lines 84
Organization linux.* mail to news gateway
X-Original-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>
X-Original-Date Mon, 9 May 2016 13:22:07 -0700
X-Original-Message-ID <1462825332-10505-5-git-send-email-keescook@chromium.org>
X-Original-References <1462825332-10505-1-git-send-email-keescook@chromium.org>
X-Original-Sender linux-kernel-owner@vger.kernel.org
Xref csiph.com linux.kernel:1397360

Show key headers only | View raw


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

Back to linux.kernel | Previous | Next — Next in thread | Find similar | Unroll thread


Thread

[PATCH v7 4/9] x86/KASLR: Return earliest overlap when avoiding regions Kees Cook <keescook@chromium.org> - 2016-05-09 22:30 +0200
  [tip:x86/boot] x86/KASLR: Return earliest overlap when avoiding  regions tip-bot for Kees Cook <tipbot@zytor.com> - 2016-05-10 10:50 +0200

csiph-web