Received: by 10.213.65.68 with SMTP id h4csp262162imn; Tue, 13 Mar 2018 03:38:34 -0700 (PDT) X-Google-Smtp-Source: AG47ELsr67wbJHXQa1Ed0FeGAoX/NdwqG0KNxPz3q38mSbtF8SEUt8frvnaM8BduYqCrVKFOzHgO X-Received: by 10.167.129.24 with SMTP id b24mr88254pfi.183.1520937514387; Tue, 13 Mar 2018 03:38:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1520937514; cv=none; d=google.com; s=arc-20160816; b=aOuok2RtxHRU+lAcdJBkOtEdhiWPIcsNPJW5BNRtBVuVIw63fh82Lzd+GAxdmjXzSW H9v2gRNE4AubgkggwGeiogJvcyPVvVEC+cWBPJdJNnDrhbt0rnS5vKWu+31WuLUIvRag 9IPUrO2Y9c8mKo9Rw6zrotlS3VKtLSpFMmBukK8yNjyIq5Vn0LpjW432T1OLjEVUbRLx NcDlWz9uctMQL5MGnK95UcSQfrPEum6wYHrIMbuHMYVVcvQQu0SWD/rC+rzOTQ71Tshs DGCp9lkOHGok84NOtTX2yosF/7G8e+2swF4ijTN5GHk4V9bl9+7VF9CrPARuvmqgTxxF 77jQ== 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:arc-authentication-results; bh=4XLRkh+TmDSX7x1vDHL+LHqR584MVdjo8Gys5Qsuz+8=; b=fPoA2EtvysikYxN9jnMA38fg3f2uSWDWfG9Bfy5dp+ScoPl7JrKZZ/ViaP3kRLivqb NE7ItfTj8ghCSshH2p1ZwKsR85/yuV8cXV/VFnKn8L5qOsEYjKnWkCp4VjRNIxyNXPNc PspnpNRuSD8i+zGhaiGM1jEFbAeYjKq4AjSucsD5/+fQ2NI86U6nLYfWqWLJg1K+qz6T dEGkUyj1nfq+6RZzERR9eqPE4qkn4jKYmyRFGADA4T0iyjIHAj1j/gWZIKiniI+shzik 0xteTgUSOTK/1rs/a9E1IXKjIqBX3A+QIb3MD/i4ZKbEFXGijgv8IBsIudl/YBlyeM5U u3mw== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s20-v6si45113plp.340.2018.03.13.03.38.19; Tue, 13 Mar 2018 03:38:34 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932856AbeCMKg2 (ORCPT + 99 others); Tue, 13 Mar 2018 06:36:28 -0400 Received: from victor.provo.novell.com ([137.65.250.26]:55113 "EHLO prv3-mh.provo.novell.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932828AbeCMKgV (ORCPT ); Tue, 13 Mar 2018 06:36:21 -0400 Received: from linux-l9pv.suse (prv-ext-foundry1int.gns.novell.com [137.65.251.240]) by prv3-mh.provo.novell.com with ESMTP (NOT encrypted); Tue, 13 Mar 2018 04:36:15 -0600 From: "Lee, Chun-Yi" To: David Howells Cc: linux-fs@vger.kernel.org, linux-efi@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/5] MODSIGN: print appropriate status message when getting UEFI certificates list Date: Tue, 13 Mar 2018 18:35:56 +0800 Message-Id: <20180313103559.13032-3-jlee@suse.com> X-Mailer: git-send-email 2.12.3 In-Reply-To: <20180313103559.13032-1-jlee@suse.com> References: <20180313103559.13032-1-jlee@suse.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When getting certificates list from UEFI variable, the original error message shows the state number from UEFI firmware. It's hard to be read by human. This patch changed the error message to show the appropriate string. The message will be showed as: [ 0.788529] MODSIGN: Couldn't get UEFI MokListRT: EFI_NOT_FOUND [ 0.788537] MODSIGN: Couldn't get UEFI MokListXRT: EFI_NOT_FOUND Cc: David Howells Cc: Josh Boyer Cc: James Bottomley Signed-off-by: Lee, Chun-Yi --- certs/load_uefi.c | 43 ++++++++++++++++++++++++++++++------------- include/linux/efi.h | 25 +++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 13 deletions(-) diff --git a/certs/load_uefi.c b/certs/load_uefi.c index d6de4d0..f2f372b 100644 --- a/certs/load_uefi.c +++ b/certs/load_uefi.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include "internal.h" @@ -32,6 +33,24 @@ static __init bool uefi_check_ignore_db(void) return status == EFI_SUCCESS; } +static __init void print_get_fail(efi_char16_t *char16_str, efi_status_t status) +{ + char *utf8_str; + unsigned long utf8_size; + + if (!char16_str) + return; + utf8_size = ucs2_utf8size(char16_str) + 1; + utf8_str = kmalloc(utf8_size, GFP_KERNEL); + if (!utf8_str) + return; + ucs2_as_utf8(utf8_str, char16_str, utf8_size); + + pr_info("MODSIGN: Couldn't get UEFI %s: %s\n", + utf8_str, efi_status_to_str(status)); + kfree(utf8_str); +} + /* * Get a certificate list blob from the named EFI variable. */ @@ -45,25 +64,29 @@ static __init void *get_cert_list(efi_char16_t *name, efi_guid_t *guid, status = efi.get_variable(name, guid, NULL, &lsize, &tmpdb); if (status != EFI_BUFFER_TOO_SMALL) { - pr_err("Couldn't get size: 0x%lx\n", status); - return NULL; + if (status != EFI_NOT_FOUND) + pr_err("Couldn't get size: 0x%lx\n", status); + goto err; } db = kmalloc(lsize, GFP_KERNEL); if (!db) { pr_err("Couldn't allocate memory for uefi cert list\n"); - return NULL; + goto err; } status = efi.get_variable(name, guid, NULL, &lsize, db); if (status != EFI_SUCCESS) { kfree(db); pr_err("Error reading db var: 0x%lx\n", status); - return NULL; + goto err; } *size = lsize; return db; +err: + print_get_fail(name, status); + return NULL; } /* @@ -153,9 +176,7 @@ static int __init load_uefi_certs(void) */ if (!uefi_check_ignore_db()) { db = get_cert_list(L"db", &secure_var, &dbsize); - if (!db) { - pr_err("MODSIGN: Couldn't get UEFI db list\n"); - } else { + if (db) { rc = parse_efi_signature_list("UEFI:db", db, dbsize, get_handler_for_db); if (rc) @@ -165,9 +186,7 @@ static int __init load_uefi_certs(void) } dbx = get_cert_list(L"dbx", &secure_var, &dbxsize); - if (!dbx) { - pr_info("MODSIGN: Couldn't get UEFI dbx list\n"); - } else { + if (dbx) { rc = parse_efi_signature_list("UEFI:dbx", dbx, dbxsize, get_handler_for_dbx); @@ -181,9 +200,7 @@ static int __init load_uefi_certs(void) return 0; mok = get_cert_list(L"MokListRT", &mok_var, &moksize); - if (!mok) { - pr_info("MODSIGN: Couldn't get UEFI MokListRT\n"); - } else { + if (mok) { rc = parse_efi_signature_list("UEFI:MokListRT", mok, moksize, get_handler_for_db); if (rc) diff --git a/include/linux/efi.h b/include/linux/efi.h index 2729d6f..c44946c 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h @@ -1600,4 +1600,29 @@ struct linux_efi_random_seed { u8 bits[]; }; +#define EFI_STATUS_STR(_status) \ + case EFI_##_status: \ + return "EFI_" __stringify(_status); \ + +static inline char * +efi_status_to_str(efi_status_t status) +{ + switch (status) { + EFI_STATUS_STR(SUCCESS) + EFI_STATUS_STR(LOAD_ERROR) + EFI_STATUS_STR(INVALID_PARAMETER) + EFI_STATUS_STR(UNSUPPORTED) + EFI_STATUS_STR(BAD_BUFFER_SIZE) + EFI_STATUS_STR(BUFFER_TOO_SMALL) + EFI_STATUS_STR(NOT_READY) + EFI_STATUS_STR(DEVICE_ERROR) + EFI_STATUS_STR(WRITE_PROTECTED) + EFI_STATUS_STR(OUT_OF_RESOURCES) + EFI_STATUS_STR(NOT_FOUND) + EFI_STATUS_STR(ABORTED) + EFI_STATUS_STR(SECURITY_VIOLATION) + } + + return ""; +} #endif /* _LINUX_EFI_H */ -- 2.10.2