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 929f41c652.
Fixes #33392.
This commit is contained in:
committed by
Luca Boccassi
parent
a00078e8c8
commit
7107cfbf4f
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user