]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
boot: Drop use of MetaiMatch
authorJan Janssen <medhefgo@web.de>
Thu, 9 Jun 2022 08:07:06 +0000 (10:07 +0200)
committerJan Janssen <medhefgo@web.de>
Thu, 9 Jun 2022 10:50:13 +0000 (12:50 +0200)
A future commit will add support for unicode collation protocol that
allows case folding and comparing strings with locale awareness. But it
only operates on whole strings, so fnmatch cannot use those without a
heavy cost. Instead we just case fold the patterns instead (the IDs we
try to match are already lower case).

man/loader.conf.xml
src/boot/efi/boot.c

index 509412ec9dcc6e03e2e7d40cbc82b1650af56be4..43a115dcad791949bf9a16ceb52948eaa93e9a73 100644 (file)
               </row>
             </tbody>
           </tgroup>
-        </table></listitem>
+        </table>
+
+        <para>Supported glob wilcard patterns are <literal>?</literal>, <literal>*</literal>, and
+        <literal>[…]</literal> (including ranges). Note that these patterns use the same syntax as
+        <citerefentry><refentrytitle>glob</refentrytitle><manvolnum>7</manvolnum></citerefentry>, but do not
+        support all features. In particular, set negation and named character classes are not supported. The
+        matching is done case-insensitively on the entry ID (as shown by <command>bootctl
+        list</command>).</para></listitem>
       </varlistentry>
 
       <varlistentry>
index 71f1227923120ca84e8ee2f643a148962d87b478..60e8786e3eed90bd56cd5ca8ceabfe574a0ccd9a 100644 (file)
@@ -1170,7 +1170,7 @@ static void config_defaults_load_from_file(Config *config, CHAR8 *content) {
                 }
 
                 if (streq8((char *) key, "default")) {
-                        if (value[0] == '@' && !streq8((char *) value, "@saved")) {
+                        if (value[0] == '@' && !strcaseeq8((char *) value, "@saved")) {
                                 log_error_stall(L"Unsupported special entry identifier: %a", value);
                                 continue;
                         }
@@ -1606,6 +1606,11 @@ static void config_load_defaults(Config *config, EFI_FILE *root_dir) {
 
         (void) efivar_get(LOADER_GUID, L"LoaderEntryDefault", &config->entry_default_efivar);
 
+        strtolower16(config->entry_default_config);
+        strtolower16(config->entry_default_efivar);
+        strtolower16(config->entry_oneshot);
+        strtolower16(config->entry_saved);
+
         config->use_saved_entry = streq16(config->entry_default_config, L"@saved");
         config->use_saved_entry_efivar = streq16(config->entry_default_efivar, L"@saved");
         if (config->use_saved_entry || config->use_saved_entry_efivar)
@@ -1710,14 +1715,16 @@ static int config_entry_compare(const ConfigEntry *a, const ConfigEntry *b) {
         return CMP(a->tries_done, b->tries_done);
 }
 
-static UINTN config_entry_find(Config *config, const CHAR16 *needle) {
+static UINTN config_entry_find(Config *config, const CHAR16 *pattern) {
         assert(config);
 
-        if (!needle)
+        /* We expect pattern and entry IDs to be already case folded. */
+
+        if (!pattern)
                 return IDX_INVALID;
 
         for (UINTN i = 0; i < config->entry_count; i++)
-                if (MetaiMatch(config->entries[i]->id, (CHAR16*) needle))
+                if (efi_fnmatch(pattern, config->entries[i]->id))
                         return i;
 
         return IDX_INVALID;