From 263195c6ddcc4a29a90e90a73c3fd0fd01b494ca Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 26 Dec 2017 09:35:35 +0900 Subject: [PATCH] bootspec: drop ".conf" from BootEntry.filename The boot loader systemd-boot removes ".conf" from file name of entry configs, and determine which entry is the default entry. However, bootspec, which is used by systemctl and bootctl did not remove ".conf", then sometimes bootctl marks wrong entry as default. This fixes the logic to choose the default entry in bootspec, to match the logic used in systemd-boot boot loader. Fixes #7727. --- src/shared/bootspec.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/shared/bootspec.c b/src/shared/bootspec.c index c0a1041..e97b5cd 100644 --- a/src/shared/bootspec.c +++ b/src/shared/bootspec.c @@ -52,22 +52,30 @@ void boot_entry_free(BootEntry *entry) { } int boot_entry_load(const char *path, BootEntry *entry) { + _cleanup_(boot_entry_free) BootEntry tmp = {}; _cleanup_fclose_ FILE *f = NULL; unsigned line = 1; - _cleanup_(boot_entry_free) BootEntry tmp = {}; + char *b, *c; int r; assert(path); assert(entry); - f = fopen(path, "re"); - if (!f) - return log_error_errno(errno, "Failed to open \"%s\": %m", path); + c = endswith_no_case(path, ".conf"); + if (!c) { + log_error("Invalid loader entry filename: %s", path); + return -EINVAL; + } - tmp.filename = strdup(basename(path)); + b = basename(path); + tmp.filename = strndup(b, c - b); if (!tmp.filename) return log_oom(); + f = fopen(path, "re"); + if (!f) + return log_error_errno(errno, "Failed to open \"%s\": %m", path); + for (;;) { _cleanup_free_ char *buf = NULL; char *p; -- 2.7.4