From patchwork Thu Jun 7 17:35:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Javier Martinez Canillas X-Patchwork-Id: 926483 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 411t9h6Jrqz9s1b for ; Fri, 8 Jun 2018 03:40:40 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 411t9h52kczF0fX for ; Fri, 8 Jun 2018 03:40:40 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=redhat.com X-Original-To: petitboot@lists.ozlabs.org Delivered-To: petitboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=redhat.com (client-ip=74.125.82.68; helo=mail-wm0-f68.google.com; envelope-from=javierm@redhat.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=redhat.com Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 411t3z26FXzF35D for ; Fri, 8 Jun 2018 03:35:42 +1000 (AEST) Received: by mail-wm0-f68.google.com with SMTP id p126-v6so19535387wmb.2 for ; Thu, 07 Jun 2018 10:35:42 -0700 (PDT) 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=/XIYaFgzlacDQ37gLlztX7Z+l9VknPE58ppez60Lw7U=; b=XRsQ6aZOAxGiLZ76JJUgypc+DAKzrtKfmTgBMpjssI9WD/v9/PbM66IFSI8NlL+QwJ vFUrx8d0VXhfGaPt8QzTE7WelOd7lXx9nI5XwWMkkW14D0CxAS6Kx4yy+RMD6Hd8GnCA poN/y8BeCWJbPoS+1EG9M/zaaBI0hWXopoGX565O3vMp/yppoULM/UhYqQWGvgivHuhc hmj8BtBmaC6XjKXvedhyq64rJ9b+1YESQMUGySb8HM4yLcb+Dw0qgtOBQiPPw2xrp64Y KGNxvnfi7VskvNrE9Xa6olKBTuz5CyF95j2Fn0kAEmgSTH769izfPjC3CcjMCd0Rfhug sk2w== X-Gm-Message-State: APt69E2g6EPDeXbx5m4OuJprCHWeavI4a0EeHuhp5Ee4j3NkMB07SKwj aPAddC1+z7ZppZzDcvVZh8H9WxipD/w= X-Google-Smtp-Source: ADUXVKJOKGVMBQ/YsntttYTC1w9gWAz72shl64cuPLxS6+nbvzEebaLIjs+Old+hWlF5NNYNg7UYaQ== X-Received: by 2002:a1c:9bd0:: with SMTP id d199-v6mr2295463wme.16.1528392939488; Thu, 07 Jun 2018 10:35:39 -0700 (PDT) Received: from minerva.redhat.com ([195.166.127.210]) by smtp.gmail.com with ESMTPSA id e13-v6sm44322856wrm.45.2018.06.07.10.35.38 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 07 Jun 2018 10:35:38 -0700 (PDT) From: Javier Martinez Canillas To: petitboot@lists.ozlabs.org Subject: [PATCH v2 1/3] test/parser: Make parser_scandir() ignore files with path len less than dir Date: Thu, 7 Jun 2018 19:35:33 +0200 Message-Id: <20180607173535.20629-2-javierm@redhat.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180607173535.20629-1-javierm@redhat.com> References: <20180607173535.20629-1-javierm@redhat.com> X-BeenThere: petitboot@lists.ozlabs.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: Petitboot bootloader development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jan Hlavac , Peter Jones , Javier Martinez Canillas , Samuel Mendoza-Jonas MIME-Version: 1.0 Errors-To: petitboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Petitboot" Both the test files and directories added into the test harness are stored into the same file list. So the parser_scandir() stub compares the absolute file path of the files and the directory to scan, to know if a file belongs to the directory. Files whose absolute file path length isn't bigger than the directory to scan should just be ignored, since it means they can't be from that dir. Signed-off-by: Javier Martinez Canillas --- test/parser/utils.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/parser/utils.c b/test/parser/utils.c index 394efb3b209..c6d1a170a9b 100644 --- a/test/parser/utils.c +++ b/test/parser/utils.c @@ -325,6 +325,9 @@ int parser_scandir(struct discover_context *ctx, const char *dirname, if (f->dev != ctx->device) continue; + if (strlen(f->name) <= strlen(dirname)) + continue; + filename = strrchr(f->name, '/'); if (!filename) continue; From patchwork Thu Jun 7 17:35:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Javier Martinez Canillas X-Patchwork-Id: 926484 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 411t9r0RzZz9s1b for ; Fri, 8 Jun 2018 03:40:48 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 411t9q6LjrzF35p for ; Fri, 8 Jun 2018 03:40:47 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=redhat.com X-Original-To: petitboot@lists.ozlabs.org Delivered-To: petitboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=redhat.com (client-ip=74.125.82.65; helo=mail-wm0-f65.google.com; envelope-from=javierm@redhat.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=redhat.com Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 411t403rL5zF34x for ; Fri, 8 Jun 2018 03:35:44 +1000 (AEST) Received: by mail-wm0-f65.google.com with SMTP id j15-v6so20923402wme.0 for ; Thu, 07 Jun 2018 10:35:44 -0700 (PDT) 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=mdVavhruy6lyq1OKhzKMSAoBa7qRkzc0eu+JgQ98RrI=; b=HShohKJ42keupGYtzv26dyMlt0jETTaX4RueNVF1QG5HCWNpA7PjzQgCv1d6hM/zn/ efv/RGy66Gcpj/Tr8ZEgK+Z1WWVyM5XYyQhGIwWwb0GcWhqXlYlhEdQDuYn3rCSMhT8W EOOdEp6ab4jmXi9rwMw8sVEk65ugu3ZVxgCTc7lLrB42ArTE6AGS/+z10cIDVIZQB7OV wizU8bGp9xKS7XP3V/TBbqX8zUzx7g+Xs0mdeDCu5nhvQqEqheiCZMjNUWU14NClHF0x LJJB2Fxs1+JP6gQdHAsHEZ91a5//a6ctsiT7oYvIZDt0ScOxPpYKaUiVzCSH75/sWro3 ZdMA== X-Gm-Message-State: APt69E1d1uO8Cwosp9b1vjgbhfik7swdhyh5HmhyP+HdAUP+lpVpHNyC zzz912BUDzAgHLIsaH77hv/JqmetnPk= X-Google-Smtp-Source: ADUXVKKvl8jeqrpQlRJ4rHjXk9HWH7/oc/UE+iIUEx2XHQ+aLQGzmx9XFr8/SE4pwwGsGJGumSNQlA== X-Received: by 2002:a1c:228b:: with SMTP id i133-v6mr2400954wmi.92.1528392940698; Thu, 07 Jun 2018 10:35:40 -0700 (PDT) Received: from minerva.redhat.com ([195.166.127.210]) by smtp.gmail.com with ESMTPSA id e13-v6sm44322856wrm.45.2018.06.07.10.35.39 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 07 Jun 2018 10:35:40 -0700 (PDT) From: Javier Martinez Canillas To: petitboot@lists.ozlabs.org Subject: [PATCH v2 2/3] discover/grub: Use different paths to search for the BLS directory Date: Thu, 7 Jun 2018 19:35:34 +0200 Message-Id: <20180607173535.20629-3-javierm@redhat.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180607173535.20629-1-javierm@redhat.com> References: <20180607173535.20629-1-javierm@redhat.com> X-BeenThere: petitboot@lists.ozlabs.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: Petitboot bootloader development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jan Hlavac , Peter Jones , Javier Martinez Canillas , Samuel Mendoza-Jonas MIME-Version: 1.0 Errors-To: petitboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Petitboot" Currenlty the BLS fragments are only searched in the /loader/entries directory, but this assumes that there is a boot partition mounted in /boot. This may not always be the case, /boot may not be a mount point and just a directory inside the root partition. To cover this case, Petitboot tries to find a GRUB 2 config file in different paths. So let's do the same for the BLS files directory. Also change some of the unit tests to use /boot/loader/entries as a BLS directory instead of /loader/entries. Signed-off-by: Javier Martinez Canillas --- discover/grub2/blscfg.c | 22 ++++++++++++++++--- .../test-grub2-blscfg-default-filename.c | 8 ++++--- test/parser/test-grub2-blscfg-default-index.c | 14 +++++++----- test/parser/test-grub2-blscfg-default-title.c | 8 ++++--- test/parser/test-grub2-blscfg-multiple-bls.c | 2 ++ test/parser/test-grub2-blscfg-opts-config.c | 2 ++ test/parser/test-grub2-blscfg-opts-grubenv.c | 2 ++ 7 files changed, 43 insertions(+), 15 deletions(-) diff --git a/discover/grub2/blscfg.c b/discover/grub2/blscfg.c index 78086ee9fb0..a3813064a0a 100644 --- a/discover/grub2/blscfg.c +++ b/discover/grub2/blscfg.c @@ -15,7 +15,11 @@ #include "discover/parser-conf.h" #include "discover/parser.h" -#define BLS_DIR "/loader/entries" +static const char *const bls_dirs[] = { + "/loader/entries", + "/boot/loader/entries", + NULL +}; struct bls_state { struct discover_boot_option *opt; @@ -195,8 +199,10 @@ int builtin_blscfg(struct grub2_script *script, struct conf_context *conf; struct bls_state *state; char *buf, *filename; + const char * const *dir; const char *blsdir; int n, len, rc = -1; + struct stat statbuf; conf = talloc_zero(dc, struct conf_context); if (!conf) @@ -209,7 +215,17 @@ int builtin_blscfg(struct grub2_script *script, blsdir = script_env_get(script, "blsdir"); if (!blsdir) - blsdir = BLS_DIR; + for (dir = bls_dirs; *dir; dir++) + if (!parser_stat_path(dc, dc->device, *dir, &statbuf)) { + blsdir = *dir; + break; + } + + if (!blsdir) { + device_handler_status_dev_info(dc->handler, dc->device, + _("BLS directory wasn't found")); + goto err; + } n = parser_scandir(dc, blsdir, &bls_entries, bls_filter, bls_sort); if (n <= 0) @@ -249,7 +265,7 @@ int builtin_blscfg(struct grub2_script *script, if (n > 0) { device_handler_status_dev_info(dc->handler, dc->device, _("Scanning %s failed"), - BLS_DIR); + blsdir); do { free(bls_entries[n]); } while (n-- > 0); diff --git a/test/parser/test-grub2-blscfg-default-filename.c b/test/parser/test-grub2-blscfg-default-filename.c index fb740599d1b..80a0e224406 100644 --- a/test/parser/test-grub2-blscfg-default-filename.c +++ b/test/parser/test-grub2-blscfg-default-filename.c @@ -10,11 +10,13 @@ void run_test(struct parser_test *test) struct discover_boot_option *opt; struct discover_context *ctx; + test_add_dir(test, test->ctx->device, "/boot/loader/entries"); + test_add_file_string(test, test->ctx->device, - "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf", + "/boot/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf", "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n" - "linux /vmlinuz-4.15.2-302.fc28.x86_64\n" - "initrd /initramfs-4.15.2-302.fc28.x86_64.img\n" + "linux /boot/vmlinuz-4.15.2-302.fc28.x86_64\n" + "initrd /boot/initramfs-4.15.2-302.fc28.x86_64.img\n" "options root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n"); test_read_conf_embedded(test, "/boot/grub2/grub.cfg"); diff --git a/test/parser/test-grub2-blscfg-default-index.c b/test/parser/test-grub2-blscfg-default-index.c index 4ef3e2e68bc..b792d86381d 100644 --- a/test/parser/test-grub2-blscfg-default-index.c +++ b/test/parser/test-grub2-blscfg-default-index.c @@ -17,18 +17,20 @@ void run_test(struct parser_test *test) struct discover_boot_option *opt; struct discover_context *ctx; + test_add_dir(test, test->ctx->device, "/boot/loader/entries"); + test_add_file_string(test, test->ctx->device, - "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-300.fc28.x86_64.conf", + "/boot/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-300.fc28.x86_64.conf", "title Fedora (4.15.2-300.fc28.x86_64) 28 (Twenty Eight)\n" - "linux /vmlinuz-4.15.2-300.fc28.x86_64\n" - "initrd /initramfs-4.15.2-300.fc28.x86_64.img\n" + "linux /boot/vmlinuz-4.15.2-300.fc28.x86_64\n" + "initrd /boot/initramfs-4.15.2-300.fc28.x86_64.img\n" "options root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n\n"); test_add_file_string(test, test->ctx->device, - "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.14.18-300.fc28.x86_64.conf", + "/boot/loader/entries/6c063c8e48904f2684abde8eea303f41-4.14.18-300.fc28.x86_64.conf", "title Fedora (4.14.18-300.fc28.x86_64) 28 (Twenty Eight)\n" - "linux /vmlinuz-4.14.18-300.fc28.x86_64\n" - "initrd /initramfs-4.14.18-300.fc28.x86_64.img\n" + "linux /boot/vmlinuz-4.14.18-300.fc28.x86_64\n" + "initrd /boot/initramfs-4.14.18-300.fc28.x86_64.img\n" "options root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n"); test_read_conf_embedded(test, "/boot/grub2/grub.cfg"); diff --git a/test/parser/test-grub2-blscfg-default-title.c b/test/parser/test-grub2-blscfg-default-title.c index 94acf80bd54..778dcc0579a 100644 --- a/test/parser/test-grub2-blscfg-default-title.c +++ b/test/parser/test-grub2-blscfg-default-title.c @@ -11,6 +11,8 @@ void run_test(struct parser_test *test) struct discover_boot_option *opt; struct discover_context *ctx; + test_add_dir(test, test->ctx->device, "/boot/loader/entries"); + test_add_file_string(test, test->ctx->device, "/boot/grub2/grubenv", "# GRUB Environment Block\n" @@ -18,10 +20,10 @@ void run_test(struct parser_test *test) "kernelopts=root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n"); test_add_file_string(test, test->ctx->device, - "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf", + "/boot/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf", "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n" - "linux /vmlinuz-4.15.2-302.fc28.x86_64\n" - "initrd /initramfs-4.15.2-302.fc28.x86_64.img\n" + "linux /boot/vmlinuz-4.15.2-302.fc28.x86_64\n" + "initrd /boot/initramfs-4.15.2-302.fc28.x86_64.img\n" "options $kernelopts\n"); test_read_conf_embedded(test, "/boot/grub2/grub.cfg"); diff --git a/test/parser/test-grub2-blscfg-multiple-bls.c b/test/parser/test-grub2-blscfg-multiple-bls.c index 8fd218c371e..94f40d191fa 100644 --- a/test/parser/test-grub2-blscfg-multiple-bls.c +++ b/test/parser/test-grub2-blscfg-multiple-bls.c @@ -9,6 +9,8 @@ void run_test(struct parser_test *test) struct discover_boot_option *opt; struct discover_context *ctx; + test_add_dir(test, test->ctx->device, "/loader/entries"); + test_add_file_string(test, test->ctx->device, "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf", "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n" diff --git a/test/parser/test-grub2-blscfg-opts-config.c b/test/parser/test-grub2-blscfg-opts-config.c index 856aae2adf5..fdce2294b0e 100644 --- a/test/parser/test-grub2-blscfg-opts-config.c +++ b/test/parser/test-grub2-blscfg-opts-config.c @@ -10,6 +10,8 @@ void run_test(struct parser_test *test) struct discover_boot_option *opt; struct discover_context *ctx; + test_add_dir(test, test->ctx->device, "/loader/entries"); + test_add_file_string(test, test->ctx->device, "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf", "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n" diff --git a/test/parser/test-grub2-blscfg-opts-grubenv.c b/test/parser/test-grub2-blscfg-opts-grubenv.c index c77c589b770..544a5de4d23 100644 --- a/test/parser/test-grub2-blscfg-opts-grubenv.c +++ b/test/parser/test-grub2-blscfg-opts-grubenv.c @@ -10,6 +10,8 @@ void run_test(struct parser_test *test) struct discover_boot_option *opt; struct discover_context *ctx; + test_add_dir(test, test->ctx->device, "/loader/entries"); + test_add_file_string(test, test->ctx->device, "/boot/grub2/grubenv", "# GRUB Environment Block\n" From patchwork Thu Jun 7 17:35:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Javier Martinez Canillas X-Patchwork-Id: 926485 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 411t9x66lJz9s1b for ; Fri, 8 Jun 2018 03:40:53 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 411t9x4jGczF32M for ; Fri, 8 Jun 2018 03:40:53 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=redhat.com X-Original-To: petitboot@lists.ozlabs.org Delivered-To: petitboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=redhat.com (client-ip=74.125.82.67; helo=mail-wm0-f67.google.com; envelope-from=javierm@redhat.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=redhat.com Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 411t4209DJzF34c for ; Fri, 8 Jun 2018 03:35:45 +1000 (AEST) Received: by mail-wm0-f67.google.com with SMTP id p11-v6so20760433wmc.4 for ; Thu, 07 Jun 2018 10:35:45 -0700 (PDT) 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=XUEiuL360emAF+NEp64M++ZrugdSKPXN7cA8onaNaIs=; b=a/YjRb1Tm0yiqqOxlPlEFq7g38A4EXQhgGfaRCeqo/mx0bUb2nj25Jczk5s+tbOuOC +QQmdFgviRIuHQEaas2DBf+yA8pEM1JFUvfXmyISey8g7/+PQyfqWDX9ZEZiIfwKU8Cc eJUlLQBGs3rVNdUeXsZ6M+vLkiMzsvyFXfeLaErtu0Ln0CMpxZ2flK19KGZj+szlShRX Txwke60SMl7+Mfrh7MNtnLQiswxxy7xRIdC3CdhbNhN2wYUetxBf8Eied34BryI3Gg/o SnnjHXTRI076MK4Qx52TQN87rLs7Y5qWstj7lUJZFY61cmqlgciYdlyvtMWc1RzCrBpU Xenw== X-Gm-Message-State: APt69E38l/vNCvW+dh4bjqn4jUyqqSRa+/0KI1dxIzGDTKnfgefhD92X 6QMRQsOTROvnEHjcTh+khOFfA3LzPHA= X-Google-Smtp-Source: ADUXVKL2BtPc46aTgA0Ej+aUCiRtrgaMjOFL/MFxX9PzYTRiMLgMxLLpcaRX0wrDqz3LzdYc8ojVXA== X-Received: by 2002:a1c:e0c6:: with SMTP id x189-v6mr2426860wmg.52.1528392942037; Thu, 07 Jun 2018 10:35:42 -0700 (PDT) Received: from minerva.redhat.com ([195.166.127.210]) by smtp.gmail.com with ESMTPSA id e13-v6sm44322856wrm.45.2018.06.07.10.35.40 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 07 Jun 2018 10:35:41 -0700 (PDT) From: Javier Martinez Canillas To: petitboot@lists.ozlabs.org Subject: [PATCH v2 3/3] discover/grub: Improve BLS grub environment variables expansion Date: Thu, 7 Jun 2018 19:35:35 +0200 Message-Id: <20180607173535.20629-4-javierm@redhat.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180607173535.20629-1-javierm@redhat.com> References: <20180607173535.20629-1-javierm@redhat.com> X-BeenThere: petitboot@lists.ozlabs.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: Petitboot bootloader development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jan Hlavac , Peter Jones , Javier Martinez Canillas , Samuel Mendoza-Jonas MIME-Version: 1.0 Errors-To: petitboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Petitboot" The fields from a BootLoaderSpec file can contain environment variables, in GRUB 2 these are show verbatim and are evaluated later when an entry is selected. But on Petitboot these have to be expanded before creating the GRUB 2 resources and show in the UI the values after the evaluation. The current blscfg handler had a very limited support for variables, it only had support for the options field and also didn't take into account that variables could be mixed with literal values. So for example the following fields were not expanded correctly: linux $bootprefix/vmlinuz options $kernelopts foo=bar options foo=bar $kernelopts options $kernelopts $debugopts Also change some of the tests to cover mixing variables and literals. Signed-off-by: Javier Martinez Canillas --- discover/grub2/blscfg.c | 86 ++++++++++++++++---- test/parser/test-grub2-blscfg-multiple-bls.c | 5 +- test/parser/test-grub2-blscfg-opts-grubenv.c | 4 +- 3 files changed, 75 insertions(+), 20 deletions(-) diff --git a/discover/grub2/blscfg.c b/discover/grub2/blscfg.c index a3813064a0a..fdbe2468952 100644 --- a/discover/grub2/blscfg.c +++ b/discover/grub2/blscfg.c @@ -2,6 +2,7 @@ #define _GNU_SOURCE #include +#include #include #include #include @@ -34,54 +35,107 @@ struct bls_state { const char *dtb; }; +static char *field_append(struct bls_state *state, int type, char *buffer, + char *start, char *end) +{ + char *temp = talloc_strndup(state, start, end - start + 1); + temp[end - start + 1] = '\0'; + const char *field = temp; + + if (type == GRUB2_WORD_VAR) { + field = script_env_get(state->script, temp); + if (!field) + return buffer; + } + + if (!buffer) + buffer = talloc_strdup(state->opt, field); + else + buffer = talloc_asprintf_append(buffer, "%s", field); + + return buffer; +} + +static char *expand_field(struct bls_state *state, char *value) +{ + char *buffer = NULL; + char *start = value; + char *end = value; + int type = GRUB2_WORD_TEXT; + + while (*value) { + if (*value == '$') { + if (start != end) { + buffer = field_append(state, type, buffer, + start, end); + if (!buffer) + return NULL; + } + + type = GRUB2_WORD_VAR; + start = value + 1; + } else if (type == GRUB2_WORD_VAR) { + if (!isalnum(*value) && *value != '_') { + buffer = field_append(state, type, buffer, + start, end); + type = GRUB2_WORD_TEXT; + start = value; + } + } + + end = value; + value++; + } + + if (start != end) { + buffer = field_append(state, type, buffer, + start, end); + if (!buffer) + return NULL; + } + + return buffer; +} + static void bls_process_pair(struct conf_context *conf, const char *name, char *value) { struct bls_state *state = conf->parser_info; struct discover_boot_option *opt = state->opt; struct boot_option *option = opt->option; - const char *boot_args; if (streq(name, "title")) { - state->title = talloc_strdup(state, value); + state->title = expand_field(state, value); return; } if (streq(name, "version")) { - state->version = talloc_strdup(state, value); + state->version = expand_field(state, value); return; } if (streq(name, "machine-id")) { - state->machine_id = talloc_strdup(state, value); + state->machine_id = expand_field(state, value); return; } if (streq(name, "linux")) { - state->image = talloc_strdup(state, value); + state->image = expand_field(state, value); return; } if (streq(name, "initrd")) { - state->initrd = talloc_strdup(state, value); + state->initrd = expand_field(state, value); return; } if (streq(name, "devicetree")) { - state->dtb = talloc_strdup(state, value); + state->dtb = expand_field(state, value); return; } if (streq(name, "options")) { - if (value[0] == '$') { - boot_args = script_env_get(state->script, value + 1); - if (!boot_args) - return; - - option->boot_args = talloc_strdup(opt, boot_args); - } else { - option->boot_args = talloc_strdup(opt, value); - } + option->boot_args = expand_field(state, value); return; } } diff --git a/test/parser/test-grub2-blscfg-multiple-bls.c b/test/parser/test-grub2-blscfg-multiple-bls.c index 94f40d191fa..d15fb24fd7e 100644 --- a/test/parser/test-grub2-blscfg-multiple-bls.c +++ b/test/parser/test-grub2-blscfg-multiple-bls.c @@ -1,6 +1,7 @@ #include "parser-test.h" #if 0 /* PARSER_EMBEDDED_CONFIG */ +set os_name=Fedora blscfg #endif @@ -13,14 +14,14 @@ void run_test(struct parser_test *test) test_add_file_string(test, test->ctx->device, "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.15.2-302.fc28.x86_64.conf", - "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n" + "title $os_name (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n" "linux /vmlinuz-4.15.2-302.fc28.x86_64\n" "initrd /initramfs-4.15.2-302.fc28.x86_64.img\n" "options root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n\n"); test_add_file_string(test, test->ctx->device, "/loader/entries/6c063c8e48904f2684abde8eea303f41-4.14.18-300.fc28.x86_64.conf", - "title Fedora (4.14.18-300.fc28.x86_64) 28 (Twenty Eight)\n" + "title $os_name (4.14.18-300.fc28.x86_64) 28 (Twenty Eight)\n" "linux /vmlinuz-4.14.18-300.fc28.x86_64\n" "initrd /initramfs-4.14.18-300.fc28.x86_64.img\n" "options root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root\n"); diff --git a/test/parser/test-grub2-blscfg-opts-grubenv.c b/test/parser/test-grub2-blscfg-opts-grubenv.c index 544a5de4d23..2dffd1b730c 100644 --- a/test/parser/test-grub2-blscfg-opts-grubenv.c +++ b/test/parser/test-grub2-blscfg-opts-grubenv.c @@ -22,7 +22,7 @@ void run_test(struct parser_test *test) "title Fedora (4.15.2-302.fc28.x86_64) 28 (Twenty Eight)\n" "linux /vmlinuz-4.15.2-302.fc28.x86_64\n" "initrd /initramfs-4.15.2-302.fc28.x86_64.img\n" - "options $kernelopts\n"); + "options $kernelopts debug\n"); test_read_conf_embedded(test, "/boot/grub2/grub.cfg"); @@ -32,5 +32,5 @@ void run_test(struct parser_test *test) opt = get_boot_option(ctx, 0); - check_args(opt, "root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root"); + check_args(opt, "root=/dev/mapper/fedora-root ro rd.lvm.lv=fedora/root debug"); }