diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/charset.c | 26 | ||||
-rw-r--r-- | lib/efi_loader/efi_boottime.c | 3 | ||||
-rw-r--r-- | lib/efi_loader/efi_capsule.c | 9 |
3 files changed, 35 insertions, 3 deletions
diff --git a/lib/charset.c b/lib/charset.c index bece498..b184275 100644 --- a/lib/charset.c +++ b/lib/charset.c @@ -351,6 +351,32 @@ s32 utf_to_upper(const s32 code) } /* + * u16_strcasecmp() - compare two u16 strings case insensitively + * + * @s1: first string to compare + * @s2: second string to compare + * @n: maximum number of u16 to compare + * Return: 0 if the first n u16 are the same in s1 and s2 + * < 0 if the first different u16 in s1 is less than the + * corresponding u16 in s2 + * > 0 if the first different u16 in s1 is greater than the + */ +int u16_strcasecmp(const u16 *s1, const u16 *s2) +{ + int ret = 0; + s32 c1, c2; + + for (;;) { + c1 = utf_to_upper(utf16_get(&s1)); + c2 = utf_to_upper(utf16_get(&s2)); + ret = c1 - c2; + if (ret || !c1 || c1 == -1 || c2 == -1) + break; + } + return ret; +} + +/* * u16_strncmp() - compare two u16 string * * @s1: first string to compare diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c index 253f9f7..e65ca6a 100644 --- a/lib/efi_loader/efi_boottime.c +++ b/lib/efi_loader/efi_boottime.c @@ -3956,8 +3956,11 @@ efi_status_t efi_initialize_system_table(void) * These entries will be set to NULL in ExitBootServices(). To avoid * relocation in SetVirtualAddressMap(), set them dynamically. */ + systab.con_in_handle = efi_root; systab.con_in = &efi_con_in; + systab.con_out_handle = efi_root; systab.con_out = &efi_con_out; + systab.stderr_handle = efi_root; systab.std_err = &efi_con_out; systab.boottime = &efi_boot_services; diff --git a/lib/efi_loader/efi_capsule.c b/lib/efi_loader/efi_capsule.c index 1163a2e..0997cd2 100644 --- a/lib/efi_loader/efi_capsule.c +++ b/lib/efi_loader/efi_capsule.c @@ -1108,10 +1108,13 @@ static efi_status_t efi_capsule_scan_dir(u16 ***files, unsigned int *num) /* ignore an error */ EFI_CALL((*dirh->close)(dirh)); - /* in ascii order */ - /* FIXME: u16 version of strcasecmp */ + /* + * Capsule files are applied in case insensitive alphabetic order + * + * TODO: special handling of rightmost period + */ qsort(tmp_files, count, sizeof(*tmp_files), - (int (*)(const void *, const void *))strcasecmp); + (int (*)(const void *, const void *))u16_strcasecmp); *files = tmp_files; *num = count; ret = EFI_SUCCESS; |