From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752047AbcEJInL (ORCPT ); Tue, 10 May 2016 04:43:11 -0400 Received: from terminus.zytor.com ([198.137.202.10]:46904 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751349AbcEJInH (ORCPT ); Tue, 10 May 2016 04:43:07 -0400 Date: Tue, 10 May 2016 01:42:01 -0700 From: tip-bot for Kees Cook Message-ID: Cc: dyoung@redhat.com, linux-kernel@vger.kernel.org, hpa@zytor.com, brgerst@gmail.com, bhe@redhat.com, peterz@infradead.org, akpm@linux-foundation.org, luto@amacapital.net, keescook@chromium.org, luto@kernel.org, vgoyal@redhat.com, dvlasenk@redhat.com, bp@alien8.de, tglx@linutronix.de, mingo@kernel.org, yinghai@kernel.org, bp@suse.de, torvalds@linux-foundation.org Reply-To: bhe@redhat.com, peterz@infradead.org, akpm@linux-foundation.org, dyoung@redhat.com, linux-kernel@vger.kernel.org, hpa@zytor.com, brgerst@gmail.com, tglx@linutronix.de, mingo@kernel.org, yinghai@kernel.org, bp@suse.de, torvalds@linux-foundation.org, luto@amacapital.net, keescook@chromium.org, luto@kernel.org, vgoyal@redhat.com, dvlasenk@redhat.com, bp@alien8.de In-Reply-To: <1462825332-10505-5-git-send-email-keescook@chromium.org> References: <1462825332-10505-5-git-send-email-keescook@chromium.org> To: linux-tip-commits@vger.kernel.org Subject: [tip:x86/boot] x86/KASLR: Return earliest overlap when avoiding regions Git-Commit-ID: 06486d6c97cebc2433a40a979f3849cd68184de9 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 06486d6c97cebc2433a40a979f3849cd68184de9 Gitweb: http://git.kernel.org/tip/06486d6c97cebc2433a40a979f3849cd68184de9 Author: Kees Cook AuthorDate: Mon, 9 May 2016 13:22:07 -0700 Committer: Ingo Molnar CommitDate: Tue, 10 May 2016 10:12:04 +0200 x86/KASLR: Return earliest overlap when avoiding regions 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 Cc: Andrew Morton Cc: Andy Lutomirski Cc: Andy Lutomirski Cc: Baoquan He Cc: Borislav Petkov Cc: Borislav Petkov Cc: Brian Gerst Cc: Dave Young Cc: Denys Vlasenko Cc: H. Peter Anvin Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: Vivek Goyal Cc: Yinghai Lu Cc: kernel-hardening@lists.openwall.com Cc: lasse.collin@tukaani.org Link: http://lkml.kernel.org/r/1462825332-10505-5-git-send-email-keescook@chromium.org Signed-off-by: Ingo Molnar --- 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 81edf99..e55ebcb 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(®ion, &img) ; img.start += CONFIG_PHYSICAL_ALIGN) { - if (mem_avoid_overlap(&img)) + if (mem_avoid_overlap(&img, &overlap)) continue; slots_append(img.start); }