mirror of
https://github.com/systemd/systemd
synced 2026-04-12 18:14:51 +02:00
Compare commits
No commits in common. "ed3abbfbde674bd163cb1c64d9e31dd24e352f85" and "3f3d4b4167228571ee01bd7f9513248233bca517" have entirely different histories.
ed3abbfbde
...
3f3d4b4167
@ -501,10 +501,10 @@
|
||||
considered 'good' from then on.</para>
|
||||
|
||||
<para>The boot menu takes the 'tries left' counter into account when sorting the menu entries: entries in 'bad'
|
||||
state are ordered towards the end of the list, and entries in 'good' or 'indeterminate' towards the beginning.
|
||||
The user can freely choose to boot any entry of the menu, including those already marked 'bad'. If the menu entry
|
||||
to boot is automatically determined, this means that 'good' or 'indeterminate' entries are generally preferred as
|
||||
boot entries are tried in sort order, and 'bad' entries will only be considered if there are no 'good' or
|
||||
state are ordered at the beginning of the list, and entries in 'good' or 'indeterminate' at the end. The user can
|
||||
freely choose to boot any entry of the menu, including those already marked 'bad'. If the menu entry to boot is
|
||||
automatically determined, this means that 'good' or 'indeterminate' entries are generally preferred (as the bottom
|
||||
item of the menu is the one booted by default), and 'bad' entries will only be considered if there are no 'good' or
|
||||
'indeterminate' entries left.</para>
|
||||
|
||||
<para>The <citerefentry><refentrytitle>kernel-install</refentrytitle><manvolnum>8</manvolnum></citerefentry> kernel
|
||||
|
||||
@ -1492,6 +1492,7 @@ static void config_entry_add_from_file(
|
||||
|
||||
entry->device = device;
|
||||
entry->id = xstrdup(file);
|
||||
StrLwr(entry->id);
|
||||
|
||||
config_add_entry(config, entry);
|
||||
|
||||
@ -1577,7 +1578,7 @@ static void config_load_entries(
|
||||
_cleanup_freepool_ CHAR8 *content = NULL;
|
||||
|
||||
err = readdir_harder(entries_dir, &f, &f_size);
|
||||
if (EFI_ERROR(err) || !f)
|
||||
if (f_size == 0 || EFI_ERROR(err))
|
||||
break;
|
||||
|
||||
if (f->FileName[0] == '.')
|
||||
@ -1602,24 +1603,13 @@ static INTN config_entry_compare(const ConfigEntry *a, const ConfigEntry *b) {
|
||||
assert(a);
|
||||
assert(b);
|
||||
|
||||
/* Order entries that have no tries left towards the end of the list. They have
|
||||
* proven to be bad and should not be selected automatically. */
|
||||
/* Order entries that have no tries left to the beginning of the list */
|
||||
if (a->tries_left != 0 && b->tries_left == 0)
|
||||
return -1;
|
||||
if (a->tries_left == 0 && b->tries_left != 0)
|
||||
return 1;
|
||||
if (a->tries_left == 0 && b->tries_left != 0)
|
||||
return -1;
|
||||
|
||||
r = strcasecmp_ptr(a->title ?: a->id, b->title ?: b->id);
|
||||
if (r != 0)
|
||||
return r;
|
||||
|
||||
/* Sort by machine id now so that different installations don't interleave their versions. */
|
||||
r = strcasecmp_ptr(a->machine_id, b->machine_id);
|
||||
if (r != 0)
|
||||
return r;
|
||||
|
||||
/* Reverse version comparison order so that higher versions are preferred. */
|
||||
r = strverscmp_improved(b->version, a->version);
|
||||
r = strverscmp_improved(a->id, b->id);
|
||||
if (r != 0)
|
||||
return r;
|
||||
|
||||
@ -1627,20 +1617,19 @@ static INTN config_entry_compare(const ConfigEntry *a, const ConfigEntry *b) {
|
||||
b->tries_left == UINTN_MAX)
|
||||
return 0;
|
||||
|
||||
/* If both items have boot counting, and otherwise are identical, put the entry with more tries left first */
|
||||
/* If both items have boot counting, and otherwise are identical, put the entry with more tries left last */
|
||||
if (a->tries_left > b->tries_left)
|
||||
return -1;
|
||||
if (a->tries_left < b->tries_left)
|
||||
return 1;
|
||||
if (a->tries_left < b->tries_left)
|
||||
return -1;
|
||||
|
||||
/* If they have the same number of tries left, then let the one win which was tried fewer times so far */
|
||||
if (a->tries_done < b->tries_done)
|
||||
return -1;
|
||||
if (a->tries_done > b->tries_done)
|
||||
return 1;
|
||||
if (a->tries_done > b->tries_done)
|
||||
return -1;
|
||||
|
||||
/* As a last resort, use the id (file name). */
|
||||
return strverscmp_improved(a->id, b->id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static UINTN config_entry_find(Config *config, const CHAR16 *needle) {
|
||||
@ -1649,7 +1638,7 @@ static UINTN config_entry_find(Config *config, const CHAR16 *needle) {
|
||||
if (!needle)
|
||||
return IDX_INVALID;
|
||||
|
||||
for (UINTN i = 0; i < config->entry_count; i++)
|
||||
for (INTN i = config->entry_count - 1; i >= 0; i--)
|
||||
if (MetaiMatch(config->entries[i]->id, (CHAR16*) needle))
|
||||
return i;
|
||||
|
||||
@ -1684,8 +1673,9 @@ static void config_default_entry_select(Config *config) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Select the first suitable entry. */
|
||||
for (i = 0; i < config->entry_count; i++) {
|
||||
/* select the last suitable entry */
|
||||
i = config->entry_count;
|
||||
while (i--) {
|
||||
if (config->entries[i]->type == LOADER_AUTO || config->entries[i]->call)
|
||||
continue;
|
||||
config->idx_default = i;
|
||||
@ -1840,6 +1830,8 @@ static ConfigEntry *config_entry_add_loader(
|
||||
.tries_left = UINTN_MAX,
|
||||
};
|
||||
|
||||
StrLwr(entry->id);
|
||||
|
||||
config_add_entry(config, entry);
|
||||
return entry;
|
||||
}
|
||||
@ -2019,7 +2011,7 @@ static void config_entry_add_linux(
|
||||
CHAR8 *key, *value;
|
||||
|
||||
err = readdir_harder(linux_dir, &f, &f_size);
|
||||
if (EFI_ERROR(err) || !f)
|
||||
if (f_size == 0 || EFI_ERROR(err))
|
||||
break;
|
||||
|
||||
if (f->FileName[0] == '.')
|
||||
@ -2334,14 +2326,12 @@ static void config_load_all_entries(
|
||||
/* Similar, but on any XBOOTLDR partition */
|
||||
config_load_xbootldr(config, loaded_image->DeviceHandle);
|
||||
|
||||
/* Add these now, so they get sorted with the rest. */
|
||||
config_entry_add_osx(config);
|
||||
config_entry_add_windows(config, loaded_image->DeviceHandle, root_dir);
|
||||
|
||||
/* sort entries after version number */
|
||||
sort_pointer_array((void **) config->entries, config->entry_count, (compare_pointer_func_t) config_entry_compare);
|
||||
|
||||
/* if we find some well-known loaders, add them to the end of the list */
|
||||
config_entry_add_osx(config);
|
||||
config_entry_add_windows(config, loaded_image->DeviceHandle, root_dir);
|
||||
config_entry_add_loader_auto(config, loaded_image->DeviceHandle, root_dir, NULL,
|
||||
L"auto-efi-shell", 's', L"EFI Shell", L"\\shell" EFI_MACHINE_TYPE_NAME ".efi");
|
||||
config_entry_add_loader_auto(config, loaded_image->DeviceHandle, root_dir, loaded_image_path,
|
||||
|
||||
@ -592,12 +592,7 @@ EFI_STATUS readdir_harder(
|
||||
* the specified buffer needs to be freed by caller, after final use. */
|
||||
|
||||
if (!*buffer) {
|
||||
/* Some broken firmware violates the EFI spec by still advancing the readdir
|
||||
* position when returning EFI_BUFFER_TOO_SMALL, effectively skipping over any files when
|
||||
* the buffer was too small. Therefore, start with a buffer that should handle FAT32 max
|
||||
* file name length.
|
||||
* As a side effect, most readdir_harder() calls will now be slightly faster. */
|
||||
sz = sizeof(EFI_FILE_INFO) + 256 * sizeof(CHAR16);
|
||||
sz = offsetof(EFI_FILE_INFO, FileName) /* + 256 */;
|
||||
*buffer = xallocate_pool(sz);
|
||||
*buffer_size = sz;
|
||||
} else
|
||||
|
||||
@ -45,11 +45,10 @@ static bool bpf_can_link_lsm_program(struct bpf_program *prog) {
|
||||
assert(prog);
|
||||
|
||||
link = sym_bpf_program__attach_lsm(prog);
|
||||
if (!link)
|
||||
return -ENOMEM;
|
||||
|
||||
/* If bpf_program__attach_lsm fails the resulting value stores libbpf error code instead of memory
|
||||
* pointer. That is the case when the helper is called on architectures where BPF trampoline (hence
|
||||
* BPF_LSM_MAC attach type) is not supported. */
|
||||
return sym_libbpf_get_error(link) == 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int prepare_restrict_fs_bpf(struct restrict_fs_bpf **ret_obj) {
|
||||
@ -167,9 +166,9 @@ int lsm_bpf_supported(void) {
|
||||
if (r < 0)
|
||||
return supported = 0;
|
||||
|
||||
if (!bpf_can_link_lsm_program(obj->progs.restrict_filesystems)) {
|
||||
log_warning_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
|
||||
"Failed to link BPF program. Assuming BPF is not available");
|
||||
r = bpf_can_link_lsm_program(obj->progs.restrict_filesystems);
|
||||
if (r < 0) {
|
||||
log_warning_errno(r, "Failed to link BPF program. Assuming BPF is not available: %m");
|
||||
return supported = 0;
|
||||
}
|
||||
|
||||
|
||||
@ -32,11 +32,11 @@ int bpf_serialize_link(FILE *f, FDSet *fds, const char *key, struct bpf_link *li
|
||||
}
|
||||
|
||||
struct bpf_link *bpf_link_free(struct bpf_link *link) {
|
||||
/* If libbpf wasn't dlopen()ed, sym_bpf_link__destroy might be unresolved (NULL), so let's not try to
|
||||
* call it if link is NULL. link might also be a non-null "error pointer", but such a value can only
|
||||
* originate from a call to libbpf, but that means that libbpf is available, and we can let
|
||||
* bpf_link__destroy() handle it. */
|
||||
if (link)
|
||||
|
||||
/* Avoid a useless dlopen() if link == NULL */
|
||||
if (!link)
|
||||
return NULL;
|
||||
|
||||
(void) sym_bpf_link__destroy(link);
|
||||
|
||||
return NULL;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user