From: Yu Watanabe Date: Wed, 19 Jun 2024 07:11:23 +0000 (+0900) Subject: bootctl: do not fail when the same file is updated multiple times X-Git-Tag: v258-rc1~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7107cfbf4f0bcb377f533f0dbc5b5a5ea41b41c0;p=thirdparty%2Fsystemd.git bootctl: do not fail when the same file is updated multiple times In the second or later trial, copy_file_with_version_check() -> version_check() fails with -ESRCH. Let's ignore the failure. This also adds missing assertions in update_efi_boot_binaries(), and drop redundant version check in update_efi_boot_binaries(), as version will be anyway checked later. Fixes a regression caused by 929f41c6528fb630753d4e2f588a8eb6c2f6a609. Fixes #33392. --- diff --git a/src/bootctl/bootctl-install.c b/src/bootctl/bootctl-install.c index f751914b58d..ddeed5ecf10 100644 --- a/src/bootctl/bootctl-install.c +++ b/src/bootctl/bootctl-install.c @@ -340,6 +340,9 @@ static int update_efi_boot_binaries(const char *esp_path, const char *source_pat _cleanup_free_ char *p = NULL; int r, ret = 0; + assert(esp_path); + assert(source_path); + r = chase_and_opendir("/EFI/BOOT", esp_path, CHASE_PREFIX_ROOT|CHASE_PROHIBIT_SYMLINKS, &p, &d); if (r == -ENOENT) return 0; @@ -348,7 +351,6 @@ static int update_efi_boot_binaries(const char *esp_path, const char *source_pat FOREACH_DIRENT(de, d, break) { _cleanup_close_ int fd = -EBADF; - _cleanup_free_ char *v = NULL; if (!endswith_no_case(de->d_name, ".efi")) continue; @@ -365,19 +367,14 @@ static int update_efi_boot_binaries(const char *esp_path, const char *source_pat if (r == 0) continue; - r = get_file_version(fd, &v); - if (r == -ESRCH) - continue; /* No version information */ - if (r < 0) - return r; - if (!startswith(v, "systemd-boot ")) - continue; - _cleanup_free_ char *dest_path = path_join(p, de->d_name); if (!dest_path) return log_oom(); - RET_GATHER(ret, copy_file_with_version_check(source_path, dest_path, /* force = */ false)); + r = copy_file_with_version_check(source_path, dest_path, /* force = */ false); + if (IN_SET(r, -ESTALE, -ESRCH)) + continue; + RET_GATHER(ret, r); } return ret;