summaryrefslogtreecommitdiff
path: root/lib/efi_loader/efi_unicode_collation.c
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2019-06-15 13:03:00 -0400
committerTom Rini <trini@konsulko.com>2019-06-15 13:03:00 -0400
commit77f6e2dd0551d8a825bab391a1bd6b838874bcd4 (patch)
tree757a1344868cc10d0c8ff181d76193cde55583de /lib/efi_loader/efi_unicode_collation.c
parentf681eacbfeb2598c135ef8e8ba8d5b9298a52a38 (diff)
parent3950f0f8563acab248214df36053bb6c57b91940 (diff)
downloadu-boot-77f6e2dd0551d8a825bab391a1bd6b838874bcd4.tar.gz
Merge tag 'efi-2019-07-rc5-2' of git://git.denx.de/u-boot-efi
Pull request for UEFI sub-system for v2019.07-rc5 (2) This pull request provides bug fixes for the UEFI sub-system. The most relevant one concerns the allocation of memory at address 0. It is needed for booting Linux on several boards via bootefi, e.g. the Asus TinkerBoard. An undefined reference bug in disk/part.c related to a division is resolved.
Diffstat (limited to 'lib/efi_loader/efi_unicode_collation.c')
-rw-r--r--lib/efi_loader/efi_unicode_collation.c69
1 files changed, 43 insertions, 26 deletions
diff --git a/lib/efi_loader/efi_unicode_collation.c b/lib/efi_loader/efi_unicode_collation.c
index f293b42397..243c51a8db 100644
--- a/lib/efi_loader/efi_unicode_collation.c
+++ b/lib/efi_loader/efi_unicode_collation.c
@@ -11,8 +11,8 @@
#include <cp437.h>
#include <efi_loader.h>
-/* Characters that may not be used in file names */
-static const char illegal[] = "<>:\"/\\|?*\x7f";
+/* Characters that may not be used in FAT 8.3 file names */
+static const char illegal[] = "+,<=>:;\"/\\|?*[]\x7f";
/*
* EDK2 assumes codepage 1250 when creating FAT 8.3 file names.
@@ -74,10 +74,21 @@ out:
}
/**
+ * next_lower() - get next codepoint converted to lower case
+ *
+ * @string: pointer to u16 string, on return advanced by one codepoint
+ * Return: first codepoint of string converted to lower case
+ */
+static s32 next_lower(const u16 **string)
+{
+ return utf_to_lower(utf16_get(string));
+}
+
+/**
* metai_match() - compare utf-16 string with a pattern string case-insenitively
*
- * @s: string to compare
- * @p: pattern string
+ * @string: string to compare
+ * @pattern: pattern string
*
* The pattern string may use these:
* - * matches >= 0 characters
@@ -93,61 +104,67 @@ out:
*
* Return: true if the string is matched.
*/
-static bool metai_match(const u16 *s, const u16 *p)
+static bool metai_match(const u16 *string, const u16 *pattern)
{
- u16 first;
+ s32 first, s, p;
+
+ for (; *string && *pattern;) {
+ const u16 *string_old = string;
+
+ s = next_lower(&string);
+ p = next_lower(&pattern);
- for (; *s && *p; ++s, ++p) {
- switch (*p) {
+ switch (p) {
case '*':
/* Match 0 or more characters */
- ++p;
- for (;; ++s) {
- if (metai_match(s, p))
+ for (;; s = next_lower(&string)) {
+ if (metai_match(string_old, pattern))
return true;
- if (!*s)
+ if (!s)
return false;
+ string_old = string;
}
case '?':
/* Match any one character */
break;
case '[':
/* Match any character in the set */
- ++p;
- first = *p;
+ p = next_lower(&pattern);
+ first = p;
if (first == ']')
/* Empty set */
return false;
- ++p;
- if (*p == '-') {
+ p = next_lower(&pattern);
+ if (p == '-') {
/* Range */
- ++p;
- if (*s < first || *s > *p)
+ p = next_lower(&pattern);
+ if (s < first || s > p)
return false;
- ++p;
- if (*p != ']')
+ p = next_lower(&pattern);
+ if (p != ']')
return false;
} else {
/* Set */
bool hit = false;
- if (*s == first)
+ if (s == first)
hit = true;
- for (; *p && *p != ']'; ++p) {
- if (*p == *s)
+ for (; p && p != ']';
+ p = next_lower(&pattern)) {
+ if (p == s)
hit = true;
}
- if (!hit || *p != ']')
+ if (!hit || p != ']')
return false;
}
break;
default:
/* Match one character */
- if (*p != *s)
+ if (p != s)
return false;
}
}
- if (!*p && !*s)
+ if (!*pattern && !*string)
return true;
return false;
}