From patchwork Mon Mar 12 08:44:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 131375 Delivered-To: patch@linaro.org Received: by 10.46.84.17 with SMTP id i17csp477797ljb; Mon, 12 Mar 2018 01:46:17 -0700 (PDT) X-Google-Smtp-Source: AG47ELufH2/y2teT7jPE62vV0dgBb31XTmMjvv0fokPPIJeNlA40M1gHxGKNRSnJ9LOhWupX9bQb X-Received: by 10.99.62.193 with SMTP id l184mr2643292pga.87.1520844377832; Mon, 12 Mar 2018 01:46:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1520844377; cv=none; d=google.com; s=arc-20160816; b=Qx9t26wTxwFRLruHq+q6Nc7Oz/mo3mrDaHgeQHJDf2nelfV+UpdEZWgAfTovf3kIXz f5rFfdpPOwPgn7H18LIzYCXBfs/ECjBwU9OWa0FVdEe4yDlX2BgrVxoNa4jWSWPpGo24 ZCYeBkslEqt2c9ekziIFVswBcTWUSuVtWuC6rIk/qW/3vze61i5QXM4kM/2iPdDslv4U 5oifhWhUsza48UCb0UqS+5/5zhM6AdPqNLOahzqohytZS1Ri9jB+EI+8OYpXZkICySnt w0tpvNhsNOdQGo1IF5f60+AkjacfIAH0Ygtjz9iBFXBBBXS4Vl0l68fUXtS7b6i2HXiu m28w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=qP3u6As7DueGEFQiyk696bVhrQjfVU2zrFvqrN7hcoQ=; b=rOqnJBkd6i8OB/w70yeLdr2sbOe3G0ZGSd5QzPXfS2KvBoYxESKYDlDgZkNb6FU1vB +KrLsYxKW2AwfMeHTyOhb1Yhx7DH+Pf8YyI9wyqK+EX7t8JBQCvHggHi82b1rMOx1WxA uCne9FzHXMVjEV9SRHKQFpZaUHFR8UPZJXB8bUD3kAkyorEJtvYWupDqDaK+9f63J09M ADxPMQQShNipUNea+DJuXdjHXFXqmjhbqAtIqrBDhCXDZDf88evx4mGQnN1Mj1MZPC+8 HnIE0JWPF9o90G7tU52qrFmXl+4/2h++c6wXExanYQVnWZuqUrCAoDbMmKhpXXheQuHv IF6Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=UJe/yOab; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y18si5524483pfa.9.2018.03.12.01.46.17; Mon, 12 Mar 2018 01:46:17 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=UJe/yOab; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752475AbeCLIqP (ORCPT + 28 others); Mon, 12 Mar 2018 04:46:15 -0400 Received: from mail-wr0-f195.google.com ([209.85.128.195]:37854 "EHLO mail-wr0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751911AbeCLIph (ORCPT ); Mon, 12 Mar 2018 04:45:37 -0400 Received: by mail-wr0-f195.google.com with SMTP id z12so14757596wrg.4 for ; Mon, 12 Mar 2018 01:45:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=qP3u6As7DueGEFQiyk696bVhrQjfVU2zrFvqrN7hcoQ=; b=UJe/yOaboJ0dA6K5oi2g8gCxSmMb0KNFWONLAOtu2W1V53z3lMkFDKLDy0MHlxEhAP PnKOlFX9xDzBF/ZCRpKJ4ypAa8CRtUPjn3sXgqIDEWCTJL104SRpg/m/TC3Bb+c+2vpS PitCKikyR1HOGLOMjWMybojZcU96GjyDPwoYA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=qP3u6As7DueGEFQiyk696bVhrQjfVU2zrFvqrN7hcoQ=; b=Q/yx/TT+wuosNpwZTAnxwhfOuxgj96cu6gOu/D/wDrc4EU+4m+eTIghOmRRuOeono1 BFCNvICpqGi4p2TPVqbOWq/RGzWgkMTGc5u6n4F2zZ+TxmlhePtUB4YIR9KIzD207gPc PrY/BEEIglE1bFwNxRH2bew+QJJn/45f4NUcmsCnV/wS5kt6KxckHCrsBYn1muq6Zywv T6i81XxCF69lkKTO+Czd32FUqbFBFy8GCUq03z+kj/e97myUWNqCrMmKWG6S3gF1MPKt ayVpUdncElF9+F+DB2SozmhOSf4q0gSLWFeUgeXf7BD2NO6vH4cwef5K4yKIRioE5BxQ 7Oxg== X-Gm-Message-State: AElRT7GBw6jiE9YuG6czNi+biCUdUwNqfvF9y3FiTR6/EAYNEUcqP5hC EC/vKo7JaBkhA/s12amqCmALlQ== X-Received: by 10.223.176.36 with SMTP id f33mr284464wra.75.1520844335992; Mon, 12 Mar 2018 01:45:35 -0700 (PDT) Received: from localhost.localdomain ([105.148.128.186]) by smtp.gmail.com with ESMTPSA id c1sm6544788wre.27.2018.03.12.01.45.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 Mar 2018 01:45:35 -0700 (PDT) From: Ard Biesheuvel To: linux-efi@vger.kernel.org, Ingo Molnar , Thomas Gleixner Cc: Ard Biesheuvel , linux-kernel@vger.kernel.org, Peter Jones Subject: [PATCH 4/5] efi/esrt: fix handling of early ESRT table mapping Date: Mon, 12 Mar 2018 08:44:59 +0000 Message-Id: <20180312084500.10764-5-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180312084500.10764-1-ard.biesheuvel@linaro.org> References: <20180312084500.10764-1-ard.biesheuvel@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org As reported by Tyler, efi_esrt_init() will return without releasing the ESRT table header mapping if it encounters a table with an unexpected version. Replacing the 'return' with 'goto err_memunmap' would fix this particular occurrence, but, as it turns out, the code is rather peculiar to begin with: - it never uses the header mapping after memcpy()'ing out its contents, - it maps and unmaps the entire table without ever looking at the contents. So let's refactor this code to unmap the table header right after the memcpy() so we can get rid of the error handling path altogether, and drop the second mapping entirely. Cc: Peter Jones Reported-by: Tyler Baicar Signed-off-by: Ard Biesheuvel --- drivers/firmware/efi/esrt.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) -- 2.15.1 diff --git a/drivers/firmware/efi/esrt.c b/drivers/firmware/efi/esrt.c index c47e0c6ec00f..1ab80e06e7c5 100644 --- a/drivers/firmware/efi/esrt.c +++ b/drivers/firmware/efi/esrt.c @@ -279,6 +279,7 @@ void __init efi_esrt_init(void) } memcpy(&tmpesrt, va, sizeof(tmpesrt)); + early_memunmap(va, size); if (tmpesrt.fw_resource_version == 1) { entry_size = sizeof (*v1_entries); @@ -291,7 +292,7 @@ void __init efi_esrt_init(void) if (tmpesrt.fw_resource_count > 0 && max - size < entry_size) { pr_err("ESRT memory map entry can only hold the header. (max: %zu size: %zu)\n", max - size, entry_size); - goto err_memunmap; + return; } /* @@ -304,7 +305,7 @@ void __init efi_esrt_init(void) if (tmpesrt.fw_resource_count > 128) { pr_err("ESRT says fw_resource_count has very large value %d.\n", tmpesrt.fw_resource_count); - goto err_memunmap; + return; } /* @@ -315,18 +316,10 @@ void __init efi_esrt_init(void) if (max < size + entries_size) { pr_err("ESRT does not fit on single memory map entry (size: %zu max: %zu)\n", size, max); - goto err_memunmap; + return; } - /* remap it with our (plausible) new pages */ - early_memunmap(va, size); size += entries_size; - va = early_memremap(efi.esrt, size); - if (!va) { - pr_err("early_memremap(%p, %zu) failed.\n", (void *)efi.esrt, - size); - return; - } esrt_data = (phys_addr_t)efi.esrt; esrt_data_size = size; @@ -336,8 +329,6 @@ void __init efi_esrt_init(void) efi_mem_reserve(esrt_data, esrt_data_size); pr_debug("esrt-init: loaded.\n"); -err_memunmap: - early_memunmap(va, size); } static int __init register_entries(void)