From patchwork Mon Jan 29 18:54:23 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve McIntyre X-Patchwork-Id: 126189 Delivered-To: patch@linaro.org Received: by 10.46.84.92 with SMTP id y28csp2684573ljd; Mon, 29 Jan 2018 10:56:28 -0800 (PST) X-Google-Smtp-Source: AH8x224ga52WUqDL2PmE9CS6yVfn3A0yNgL2pubo8vZ5Q/8ycynAfA08IJEqvAlul7G6xojiqLjC X-Received: by 10.13.228.1 with SMTP id n1mr8529251ywe.6.1517252188059; Mon, 29 Jan 2018 10:56:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517252188; cv=none; d=google.com; s=arc-20160816; b=FXMDRwdSd1S1CK9Duaw0kC2QLFTEH2WE6karLaGzZ49F7Ie7vmgcsjwUG/Dzbu57I2 sqTVCj1xDut95aXn+Y+y6SxBT3It3p6xPLR4HYN1X7EfHGtI0mYn2Nc2p+a2gEN9Z+BS yAYBjwE+4nqjEBEjGpj1ADOAZ7KRzFHajS4doygnQtbbit91cyfG692HC39yZIW5bpnx FbxNMOE/LCxFW228gFHiNfyXn4GujNxqiTk1b6VWDyE/FRJJvUe95uPjDWshMiJJdAGQ msUylkO2fl06HciiutP/OoRi3UXbTpLA1/O8z/N+BT/E96J0EBg7uBxMuVsmMR4OPjs0 16/A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:references:in-reply-to:message-id:date:subject :to:from:arc-authentication-results; bh=egJX4grRpu4AkY3z385vhqfFnu7XW5RlJE83nuZvemQ=; b=o37ecse2cszhmCZaO/suV82vAbndkkMDtCLLMEFZUtGu0i3IB5zGpjK8ryvb/SrK6q VdIZsDf8b4He9yEq9geKPoDRxUBXz0IWrDzJebYbtEbr6oNZND5p9hPkORpRRTQe7256 BQJIPdcLCRZ+uto9mg2T1j74lXeQrYu6H1Ixz7Vudj8AC2j2HJBXI6mtSh8GJOgf5KN6 C85CiJxH1WHw2IIS7OiYHt/yjv6HLthBOO74KgN0UCj3RtMalCFfGAAqC42Rd/Fr0t03 V+VQLo1xLpBQLmu1flKm/hUc7C8TpyFSlAmWyVvnfGJmS5xtSLnXwbnKguUEE8fgYz1a S4pw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of grub-devel-bounces+patch=linaro.org@gnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom=grub-devel-bounces+patch=linaro.org@gnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id h185si4738613ybb.327.2018.01.29.10.56.27 for (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 29 Jan 2018 10:56:28 -0800 (PST) Received-SPF: pass (google.com: domain of grub-devel-bounces+patch=linaro.org@gnu.org designates 2001:4830:134:3::11 as permitted sender) client-ip=2001:4830:134:3::11; Authentication-Results: mx.google.com; spf=pass (google.com: domain of grub-devel-bounces+patch=linaro.org@gnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom=grub-devel-bounces+patch=linaro.org@gnu.org Received: from localhost ([::1]:58676 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1egEbT-0000Ed-Hb for patch@linaro.org; Mon, 29 Jan 2018 13:56:27 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42484) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1egEaO-0008GE-1t for grub-devel@gnu.org; Mon, 29 Jan 2018 13:55:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1egEaK-0000G7-2Z for grub-devel@gnu.org; Mon, 29 Jan 2018 13:55:20 -0500 Received: from cheddar.halon.org.uk ([93.93.131.118]:53004) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1egEaJ-0000DR-SD for grub-devel@gnu.org; Mon, 29 Jan 2018 13:55:15 -0500 Received: from bsmtp by cheddar.halon.org.uk with local-bsmtp (Exim 4.89) (envelope-from ) id 1egEaF-0006UO-2Y; Mon, 29 Jan 2018 18:55:11 +0000 Received: from steve by tack.local with local (Exim 4.89) (envelope-from ) id 1egEZm-0007uJ-Rg; Mon, 29 Jan 2018 18:54:42 +0000 From: Steve McIntyre To: Daniel Kiper , The development of GNU GRUB Subject: [PATCH] Make grub-install check for errors from efibootmgr Date: Mon, 29 Jan 2018 18:54:23 +0000 Message-Id: <20180129185423.29681-1-steve@einval.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180129181626.eaprvd3pfbevjwvq@tack.einval.com> References: <20180129181626.eaprvd3pfbevjwvq@tack.einval.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 93.93.131.118 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: The development of GNU GRUB Cc: Steve McIntyre <93sam@debian.org>, Steve McIntyre MIME-Version: 1.0 Errors-To: grub-devel-bounces+patch=linaro.org@gnu.org Sender: "Grub-devel" Code is currently ignoring errors from efibootmgr, giving users clearly bogus output like: Setting up grub-efi-amd64 (2.02~beta3-4) ... Installing for x86_64-efi platform. Could not delete variable: No space left on device Could not prepare Boot variable: No space left on device Installation finished. No error reported. and then potentially unbootable systems. If efibootmgr fails, grub-install should know that and report it! We've been using this patch in Debian now for some time, with no ill effects. Signed-off-by: Steve McIntyre <93sam@debian.org> --- grub-core/osdep/unix/platform.c | 25 +++++++++++++++---------- include/grub/util/install.h | 2 +- util/grub-install.c | 18 +++++++++++++----- 3 files changed, 29 insertions(+), 16 deletions(-) -- 2.11.0 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel diff --git a/grub-core/osdep/unix/platform.c b/grub-core/osdep/unix/platform.c index a3fcfcaca..b3a617e44 100644 --- a/grub-core/osdep/unix/platform.c +++ b/grub-core/osdep/unix/platform.c @@ -78,19 +78,20 @@ get_ofpathname (const char *dev) dev); } -static void +static int grub_install_remove_efi_entries_by_distributor (const char *efi_distributor) { int fd; pid_t pid = grub_util_exec_pipe ((const char * []){ "efibootmgr", NULL }, &fd); char *line = NULL; size_t len = 0; + int ret; if (!pid) { grub_util_warn (_("Unable to open stream from %s: %s"), "efibootmgr", strerror (errno)); - return; + return errno; } FILE *fp = fdopen (fd, "r"); @@ -98,14 +99,13 @@ grub_install_remove_efi_entries_by_distributor (const char *efi_distributor) { grub_util_warn (_("Unable to open stream from %s: %s"), "efibootmgr", strerror (errno)); - return; + return errno; } line = xmalloc (80); len = 80; while (1) { - int ret; char *bootnum; ret = getline (&line, &len, fp); if (ret == -1) @@ -119,23 +119,25 @@ grub_install_remove_efi_entries_by_distributor (const char *efi_distributor) bootnum = line + sizeof ("Boot") - 1; bootnum[4] = '\0'; if (!verbosity) - grub_util_exec ((const char * []){ "efibootmgr", "-q", + ret = grub_util_exec ((const char * []){ "efibootmgr", "-q", "-b", bootnum, "-B", NULL }); else - grub_util_exec ((const char * []){ "efibootmgr", + ret = grub_util_exec ((const char * []){ "efibootmgr", "-b", bootnum, "-B", NULL }); } free (line); + return ret; } -void +int grub_install_register_efi (grub_device_t efidir_grub_dev, const char *efifile_path, const char *efi_distributor) { const char * efidir_disk; int efidir_part; + int ret; efidir_disk = grub_util_biosdisk_get_osdev (efidir_grub_dev->disk); efidir_part = efidir_grub_dev->disk->partition ? efidir_grub_dev->disk->partition->number + 1 : 1; @@ -151,23 +153,26 @@ grub_install_register_efi (grub_device_t efidir_grub_dev, grub_util_exec ((const char * []){ "modprobe", "-q", "efivars", NULL }); #endif /* Delete old entries from the same distributor. */ - grub_install_remove_efi_entries_by_distributor (efi_distributor); + ret = grub_install_remove_efi_entries_by_distributor (efi_distributor); + if (ret) + return ret; char *efidir_part_str = xasprintf ("%d", efidir_part); if (!verbosity) - grub_util_exec ((const char * []){ "efibootmgr", "-q", + ret = grub_util_exec ((const char * []){ "efibootmgr", "-q", "-c", "-d", efidir_disk, "-p", efidir_part_str, "-w", "-L", efi_distributor, "-l", efifile_path, NULL }); else - grub_util_exec ((const char * []){ "efibootmgr", + ret = grub_util_exec ((const char * []){ "efibootmgr", "-c", "-d", efidir_disk, "-p", efidir_part_str, "-w", "-L", efi_distributor, "-l", efifile_path, NULL }); free (efidir_part_str); + return ret; } void diff --git a/include/grub/util/install.h b/include/grub/util/install.h index 5910b0c09..0dba8b67f 100644 --- a/include/grub/util/install.h +++ b/include/grub/util/install.h @@ -210,7 +210,7 @@ grub_install_create_envblk_file (const char *name); const char * grub_install_get_default_x86_platform (void); -void +int grub_install_register_efi (grub_device_t efidir_grub_dev, const char *efifile_path, const char *efi_distributor); diff --git a/util/grub-install.c b/util/grub-install.c index 5e4cdfd2b..690f180c5 100644 --- a/util/grub-install.c +++ b/util/grub-install.c @@ -1848,9 +1848,13 @@ main (int argc, char *argv[]) if (!removable && update_nvram) { /* Try to make this image bootable using the EFI Boot Manager, if available. */ - grub_install_register_efi (efidir_grub_dev, - "\\System\\Library\\CoreServices", - efi_distributor); + int ret; + ret = grub_install_register_efi (efidir_grub_dev, + "\\System\\Library\\CoreServices", + efi_distributor); + if (ret) + grub_util_error (_("efibootmgr failed to register the boot entry: %s"), + strerror (ret)); } grub_device_close (ins_dev); @@ -1871,6 +1875,7 @@ main (int argc, char *argv[]) { char * efifile_path; char * part; + int ret; /* Try to make this image bootable using the EFI Boot Manager, if available. */ if (!efi_distributor || efi_distributor[0] == '\0') @@ -1887,8 +1892,11 @@ main (int argc, char *argv[]) efidir_grub_dev->disk->name, (part ? ",": ""), (part ? : "")); grub_free (part); - grub_install_register_efi (efidir_grub_dev, - efifile_path, efi_distributor); + ret = grub_install_register_efi (efidir_grub_dev, + efifile_path, efi_distributor); + if (ret) + grub_util_error (_("efibootmgr failed to register the boot entry: %s"), + strerror (ret)); } break;