summaryrefslogtreecommitdiffstats
path: root/src/boot/efi
diff options
context:
space:
mode:
authorJan Janssen <medhefgo@web.de>2021-11-15 12:28:18 +0100
committerJan Janssen <medhefgo@web.de>2021-11-29 16:20:45 +0100
commitda76f890aab165ac194b21ac41289df70d0b6a3f (patch)
tree4b9866e615f274f70c005da98933c6bcba027280 /src/boot/efi
parentsd-boot: Add non-failing allocators (diff)
downloadsystemd-da76f890aab165ac194b21ac41289df70d0b6a3f.tar.xz
systemd-da76f890aab165ac194b21ac41289df70d0b6a3f.zip
sd-boot: Use non-failing allocators in boot.c
Diffstat (limited to 'src/boot/efi')
-rw-r--r--src/boot/efi/boot.c137
1 files changed, 55 insertions, 82 deletions
diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c
index 0bacfb4bbe..05aecabc8a 100644
--- a/src/boot/efi/boot.c
+++ b/src/boot/efi/boot.c
@@ -144,15 +144,11 @@ static BOOLEAN line_edit(
line_in = L"";
size = StrLen(line_in) + 1024;
- line = AllocatePool(size * sizeof(CHAR16));
- if (!line)
- return FALSE;
+ line = xnew(CHAR16, size);
StrCpy(line, line_in);
len = StrLen(line);
- print = AllocatePool((x_max+1) * sizeof(CHAR16));
- if (!print)
- return FALSE;
+ print = xnew(CHAR16, x_max + 1);
first = 0;
cursor = 0;
@@ -422,13 +418,13 @@ static CHAR16 *update_timeout_efivar(UINT32 *t, BOOLEAN inc) {
switch (*t) {
case TIMEOUT_UNSET:
- return StrDuplicate(L"Menu timeout defined by configuration file.");
+ return xstrdup(L"Menu timeout defined by configuration file.");
case TIMEOUT_MENU_FORCE:
- return StrDuplicate(L"Timeout disabled, menu will always be shown.");
+ return xstrdup(L"Timeout disabled, menu will always be shown.");
case TIMEOUT_MENU_HIDDEN:
- return StrDuplicate(L"Menu disabled. Hold down key at bootup to show menu.");
+ return xstrdup(L"Menu disabled. Hold down key at bootup to show menu.");
default:
- return PoolPrint(L"Menu timeout set to %u s.", *t);
+ return xpool_print(L"Menu timeout set to %u s.", *t);
}
}
@@ -656,21 +652,12 @@ static BOOLEAN menu_run(
clearline = mfree(clearline);
/* menu entries title lines */
- lines = AllocatePool((config->entry_count + 1) * sizeof(CHAR16 *));
- if (!lines) {
- log_oom();
- return FALSE;
- }
+ lines = xnew(CHAR16*, config->entry_count + 1);
for (UINTN i = 0; i < config->entry_count; i++) {
UINTN j, padding;
- lines[i] = AllocatePool(((line_width + 1) * sizeof(CHAR16)));
- if (!lines[i]) {
- log_oom();
- return FALSE;
- }
-
+ lines[i] = xnew(CHAR16, line_width + 1);
padding = (line_width - MIN(StrLen(config->entries[i]->title_show), line_width)) / 2;
for (j = 0; j < padding; j++)
@@ -685,12 +672,7 @@ static BOOLEAN menu_run(
}
lines[config->entry_count] = NULL;
- clearline = AllocatePool((x_max+1) * sizeof(CHAR16));
- if (!clearline) {
- log_oom();
- return FALSE;
- }
-
+ clearline = xnew(CHAR16, x_max + 1);
for (UINTN i = 0; i < x_max; i++)
clearline[i] = ' ';
clearline[x_max] = 0;
@@ -728,7 +710,7 @@ static BOOLEAN menu_run(
if (timeout_remain > 0) {
FreePool(status);
- status = PoolPrint(L"Boot in %u s.", timeout_remain);
+ status = xpool_print(L"Boot in %u s.", timeout_remain);
}
/* print status at last line of screen */
@@ -833,7 +815,7 @@ static BOOLEAN menu_run(
case KEYPRESS(0, 0, 'H'):
case KEYPRESS(0, 0, '?'):
/* This must stay below 80 characters! Q/v/Ctrl+l/f deliberately not advertised. */
- status = StrDuplicate(L"(d)efault (t/T)timeout (e)dit (r/R)resolution (p)rint (h)elp");
+ status = xstrdup(L"(d)efault (t/T)timeout (e)dit (r/R)resolution (p)rint (h)elp");
break;
case KEYPRESS(0, 0, 'Q'):
@@ -845,17 +827,13 @@ static BOOLEAN menu_run(
case KEYPRESS(0, 0, 'D'):
if (config->idx_default_efivar != (INTN)idx_highlight) {
FreePool(config->entry_default_efivar);
- config->entry_default_efivar = StrDuplicate(config->entries[idx_highlight]->id);
- if (!config->entry_default_efivar) {
- log_oom();
- return FALSE;
- }
+ config->entry_default_efivar = xstrdup(config->entries[idx_highlight]->id);
config->idx_default_efivar = idx_highlight;
- status = StrDuplicate(L"Default boot entry selected.");
+ status = xstrdup(L"Default boot entry selected.");
} else {
config->entry_default_efivar = mfree(config->entry_default_efivar);
config->idx_default_efivar = -1;
- status = StrDuplicate(L"Default boot entry cleared.");
+ status = xstrdup(L"Default boot entry cleared.");
}
config->use_saved_entry_efivar = FALSE;
refresh = TRUE;
@@ -887,9 +865,10 @@ static BOOLEAN menu_run(
break;
case KEYPRESS(0, 0, 'v'):
- status = PoolPrint(L"systemd-boot " GIT_VERSION " (" EFI_MACHINE_TYPE_NAME "), UEFI Specification %d.%02d, Vendor %s %d.%02d",
- ST->Hdr.Revision >> 16, ST->Hdr.Revision & 0xffff,
- ST->FirmwareVendor, ST->FirmwareRevision >> 16, ST->FirmwareRevision & 0xffff);
+ status = xpool_print(L"systemd-boot " GIT_VERSION " (" EFI_MACHINE_TYPE_NAME "), "
+ L"UEFI Specification %d.%02d, Vendor %s %d.%02d",
+ ST->Hdr.Revision >> 16, ST->Hdr.Revision & 0xffff,
+ ST->FirmwareVendor, ST->FirmwareRevision >> 16, ST->FirmwareRevision & 0xffff);
break;
case KEYPRESS(0, 0, 'p'):
@@ -906,10 +885,10 @@ static BOOLEAN menu_run(
case KEYPRESS(0, 0, 'r'):
err = console_set_mode(CONSOLE_MODE_NEXT);
if (EFI_ERROR(err))
- status = PoolPrint(L"Error changing console mode: %r", err);
+ status = xpool_print(L"Error changing console mode: %r", err);
else {
config->console_mode_efivar = ST->ConOut->Mode->Mode;
- status = PoolPrint(L"Console mode changed to %ld.", config->console_mode_efivar);
+ status = xpool_print(L"Console mode changed to %ld.", config->console_mode_efivar);
}
new_mode = TRUE;
break;
@@ -919,10 +898,10 @@ static BOOLEAN menu_run(
err = console_set_mode(config->console_mode == CONSOLE_MODE_KEEP ?
console_mode_initial : config->console_mode);
if (EFI_ERROR(err))
- status = PoolPrint(L"Error resetting console mode: %r", err);
+ status = xpool_print(L"Error resetting console mode: %r", err);
else
- status = PoolPrint(L"Console mode reset to %s default.",
- config->console_mode == CONSOLE_MODE_KEEP ? L"firmware" : L"configuration file");
+ status = xpool_print(L"Console mode reset to %s default.",
+ config->console_mode == CONSOLE_MODE_KEEP ? L"firmware" : L"configuration file");
new_mode = TRUE;
break;
@@ -935,9 +914,9 @@ static BOOLEAN menu_run(
if (FLAGS_SET(get_os_indications_supported(), EFI_OS_INDICATIONS_BOOT_TO_FW_UI)) {
firmware_setup = TRUE;
/* Let's make sure the user really wants to do this. */
- status = PoolPrint(L"Press Enter to reboot into firmware interface.");
+ status = xpool_print(L"Press Enter to reboot into firmware interface.");
} else
- status = PoolPrint(L"Reboot into firmware interface not supported.");
+ status = xpool_print(L"Reboot into firmware interface not supported.");
break;
default:
@@ -996,7 +975,7 @@ static void config_add_entry(Config *config, ConfigEntry *entry) {
if ((config->entry_count & 15) == 0) {
UINTN i = config->entry_count + 16;
- config->entries = ReallocatePool(
+ config->entries = xreallocate_pool(
config->entries,
sizeof(void *) * config->entry_count,
sizeof(void *) * i);
@@ -1301,16 +1280,16 @@ good:
entry->tries_left = left;
entry->tries_done = done;
- entry->path = StrDuplicate(path);
- entry->current_name = StrDuplicate(file);
+ entry->path = xstrdup(path);
+ entry->current_name = xstrdup(file);
next_left = left <= 0 ? 0 : left - 1;
next_done = done >= (UINTN) -2 ? (UINTN) -2 : done + 1;
- prefix = StrDuplicate(file);
+ prefix = xstrdup(file);
prefix[i] = 0;
- entry->next_name = PoolPrint(L"%s+%u-%u%s", prefix, next_left, next_done, suffix ?: L"");
+ entry->next_name = xpool_print(L"%s+%u-%u%s", prefix, next_left, next_done, suffix ?: L"");
}
static void config_entry_bump_counters(
@@ -1332,7 +1311,7 @@ static void config_entry_bump_counters(
if (!entry->path || !entry->current_name || !entry->next_name)
return;
- old_path = PoolPrint(L"%s\\%s", entry->path, entry->current_name);
+ old_path = xpool_print(L"%s\\%s", entry->path, entry->current_name);
err = root_dir->Open(root_dir, &handle, old_path, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, 0ULL);
if (EFI_ERROR(err))
@@ -1355,7 +1334,7 @@ static void config_entry_bump_counters(
/* Let's tell the OS that we renamed this file, so that it knows what to rename to the counter-less name on
* success */
- new_path = PoolPrint(L"%s\\%s", entry->path, entry->next_name);
+ new_path = xpool_print(L"%s\\%s", entry->path, entry->next_name);
efivar_set(LOADER_GUID, L"LoaderBootCountPath", new_path, 0);
/* If the file we just renamed is the loader path, then let's update that. */
@@ -1389,8 +1368,7 @@ static void config_entry_add_from_file(
assert(file);
assert(content);
- entry = AllocatePool(sizeof(ConfigEntry));
-
+ entry = xnew(ConfigEntry, 1);
*entry = (ConfigEntry) {
.tries_done = UINTN_MAX,
.tries_left = UINTN_MAX,
@@ -1458,11 +1436,11 @@ static void config_entry_add_from_file(
if (initrd) {
CHAR16 *s;
- s = PoolPrint(L"%s initrd=%s", initrd, new);
+ s = xpool_print(L"%s initrd=%s", initrd, new);
FreePool(initrd);
initrd = s;
} else
- initrd = PoolPrint(L"initrd=%s", new);
+ initrd = xpool_print(L"initrd=%s", new);
continue;
}
@@ -1474,7 +1452,7 @@ static void config_entry_add_from_file(
if (entry->options) {
CHAR16 *s;
- s = PoolPrint(L"%s %s", entry->options, new);
+ s = xpool_print(L"%s %s", entry->options, new);
FreePool(entry->options);
entry->options = s;
} else
@@ -1498,7 +1476,7 @@ static void config_entry_add_from_file(
if (entry->options) {
CHAR16 *s;
- s = PoolPrint(L"%s %s", initrd, entry->options);
+ s = xpool_print(L"%s %s", initrd, entry->options);
FreePool(entry->options);
entry->options = s;
} else
@@ -1506,7 +1484,7 @@ static void config_entry_add_from_file(
}
entry->device = device;
- entry->id = StrDuplicate(file);
+ entry->id = xstrdup(file);
StrLwr(entry->id);
config_add_entry(config, entry);
@@ -1735,7 +1713,7 @@ static void config_title_generate(Config *config) {
/* set title */
for (UINTN i = 0; i < config->entry_count; i++) {
FreePool(config->entries[i]->title_show);
- config->entries[i]->title_show = StrDuplicate(
+ config->entries[i]->title_show = xstrdup(
config->entries[i]->title ?: config->entries[i]->id);
}
@@ -1751,7 +1729,7 @@ static void config_title_generate(Config *config) {
if (!config->entries[i]->version)
continue;
- s = PoolPrint(L"%s (%s)", config->entries[i]->title_show, config->entries[i]->version);
+ s = xpool_print(L"%s (%s)", config->entries[i]->title_show, config->entries[i]->version);
FreePool(config->entries[i]->title_show);
config->entries[i]->title_show = s;
}
@@ -1769,9 +1747,9 @@ static void config_title_generate(Config *config) {
if (!config->entries[i]->machine_id)
continue;
- m = StrDuplicate(config->entries[i]->machine_id);
+ m = xstrdup(config->entries[i]->machine_id);
m[8] = '\0';
- s = PoolPrint(L"%s (%s)", config->entries[i]->title_show, m);
+ s = xpool_print(L"%s (%s)", config->entries[i]->title_show, m);
FreePool(config->entries[i]->title_show);
config->entries[i]->title_show = s;
}
@@ -1785,7 +1763,7 @@ static void config_title_generate(Config *config) {
if (!config->entries[i]->non_unique)
continue;
- s = PoolPrint(L"%s (%s)", config->entries[i]->title_show, config->entries[i]->id);
+ s = xpool_print(L"%s (%s)", config->entries[i]->title_show, config->entries[i]->id);
FreePool(config->entries[i]->title_show);
config->entries[i]->title_show = s;
config->entries[i]->non_unique = FALSE;
@@ -1805,10 +1783,10 @@ static BOOLEAN config_entry_add_call(
assert(title);
assert(call);
- entry = AllocatePool(sizeof(ConfigEntry));
+ entry = xnew(ConfigEntry, 1);
*entry = (ConfigEntry) {
- .id = StrDuplicate(id),
- .title = StrDuplicate(title),
+ .id = xstrdup(id),
+ .title = xstrdup(title),
.call = call,
.no_autoselect = TRUE,
.tries_done = UINTN_MAX,
@@ -1837,14 +1815,14 @@ static ConfigEntry *config_entry_add_loader(
assert(title);
assert(loader);
- entry = AllocatePool(sizeof(ConfigEntry));
+ entry = xnew(ConfigEntry, 1);
*entry = (ConfigEntry) {
.type = type,
- .title = StrDuplicate(title),
- .version = version ? StrDuplicate(version) : NULL,
+ .title = xstrdup(title),
+ .version = version ? xstrdup(version) : NULL,
.device = device,
- .loader = StrDuplicate(loader),
- .id = StrDuplicate(id),
+ .loader = xstrdup(loader),
+ .id = xstrdup(id),
.key = key,
.tries_done = UINTN_MAX,
.tries_left = UINTN_MAX,
@@ -2139,10 +2117,7 @@ static void config_entry_add_linux(
&good_version))
continue;
- path = PoolPrint(L"\\EFI\\Linux\\%s", f->FileName);
- if (!path)
- return (void) log_oom();
-
+ path = xpool_print(L"\\EFI\\Linux\\%s", f->FileName);
entry = config_entry_add_loader(
config,
device,
@@ -2152,8 +2127,6 @@ static void config_entry_add_linux(
good_name,
path,
good_version);
- if (!entry)
- return (void) log_oom();
config_entry_parse_tries(entry, L"\\EFI\\Linux", f->FileName, L".efi");
@@ -2273,7 +2246,7 @@ static void config_write_entries_to_variable(Config *config) {
for (UINTN i = 0; i < config->entry_count; i++)
sz += StrSize(config->entries[i]->id);
- p = buffer = AllocatePool(sz);
+ p = buffer = xallocate_pool(sz);
for (UINTN i = 0; i < config->entry_count; i++) {
UINTN l;
@@ -2338,10 +2311,10 @@ static void export_variables(
efivar_set_time_usec(LOADER_GUID, L"LoaderTimeInitUSec", init_usec);
efivar_set(LOADER_GUID, L"LoaderInfo", L"systemd-boot " GIT_VERSION, 0);
- infostr = PoolPrint(L"%s %d.%02d", ST->FirmwareVendor, ST->FirmwareRevision >> 16, ST->FirmwareRevision & 0xffff);
+ infostr = xpool_print(L"%s %d.%02d", ST->FirmwareVendor, ST->FirmwareRevision >> 16, ST->FirmwareRevision & 0xffff);
efivar_set(LOADER_GUID, L"LoaderFirmwareInfo", infostr, 0);
- typestr = PoolPrint(L"UEFI %d.%02d", ST->Hdr.Revision >> 16, ST->Hdr.Revision & 0xffff);
+ typestr = xpool_print(L"UEFI %d.%02d", ST->Hdr.Revision >> 16, ST->Hdr.Revision & 0xffff);
efivar_set(LOADER_GUID, L"LoaderFirmwareType", typestr, 0);
(void) efivar_set_uint64_le(LOADER_GUID, L"LoaderFeatures", loader_features, 0);