]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
File type for fine-grained signature-verification controlling
authorVladimir Serbinenko <phcoder@gmail.com>
Wed, 20 Nov 2013 01:28:29 +0000 (02:28 +0100)
committerVladimir Serbinenko <phcoder@gmail.com>
Wed, 20 Nov 2013 01:28:29 +0000 (02:28 +0100)
58 files changed:
grub-core/commands/acpi.c
grub-core/commands/blocklist.c
grub-core/commands/cat.c
grub-core/commands/cmp.c
grub-core/commands/efi/loadbios.c
grub-core/commands/hashsum.c
grub-core/commands/hexdump.c
grub-core/commands/i386/nthibr.c
grub-core/commands/i386/pc/play.c
grub-core/commands/keylayouts.c
grub-core/commands/legacycfg.c
grub-core/commands/loadenv.c
grub-core/commands/ls.c
grub-core/commands/minicmd.c
grub-core/commands/nativedisk.c
grub-core/commands/parttool.c
grub-core/commands/search.c
grub-core/commands/test.c
grub-core/commands/testload.c
grub-core/commands/testspeed.c
grub-core/commands/verify.c
grub-core/disk/loopback.c
grub-core/font/font.c
grub-core/fs/zfs/zfscrypt.c
grub-core/gettext/gettext.c
grub-core/gfxmenu/theme_loader.c
grub-core/io/bufio.c
grub-core/io/gzio.c
grub-core/io/lzopio.c
grub-core/io/offset.c
grub-core/io/xzio.c
grub-core/kern/dl.c
grub-core/kern/elf.c
grub-core/kern/file.c
grub-core/loader/efi/chainloader.c
grub-core/loader/i386/bsd.c
grub-core/loader/i386/linux.c
grub-core/loader/i386/pc/linux.c
grub-core/loader/i386/xnu.c
grub-core/loader/linux.c
grub-core/loader/macho.c
grub-core/loader/multiboot.c
grub-core/loader/xnu.c
grub-core/loader/xnu_resume.c
grub-core/normal/autofs.c
grub-core/normal/crypto.c
grub-core/normal/dyncmd.c
grub-core/normal/main.c
grub-core/normal/term.c
grub-core/video/readers/jpeg.c
grub-core/video/readers/png.c
grub-core/video/readers/tga.c
include/grub/bufio.h
include/grub/elfload.h
include/grub/file.h
include/grub/machoload.h
util/grub-fstest.c
util/grub-mount.c

index 14f639c6dd0750c3a01bd3c56cb2fd139ed5b48e..4290d60bed93eb625a8a6491087cc0070ced5f90 100644 (file)
@@ -639,7 +639,7 @@ grub_cmd_acpi (struct grub_extcmd_context *ctxt, int argc, char **args)
       grub_size_t size;
       char *buf;
 
-      file = grub_file_open (args[i]);
+      file = grub_file_open (args[i], GRUB_FILE_TYPE_ACPI_TABLE);
       if (! file)
        {
          free_tables ();
index d1a47b504bf25258a32beeecdab237fd6696e3d5..944449b77d4bdb6fc26b7906853e47e142ffb2d8 100644 (file)
@@ -121,8 +121,8 @@ grub_cmd_blocklist (grub_command_t cmd __attribute__ ((unused)),
   if (argc < 1)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
 
-  grub_file_filter_disable_compression ();
-  file = grub_file_open (args[0]);
+  file = grub_file_open (args[0], GRUB_FILE_TYPE_PRINT_BLOCKLIST
+                        | GRUB_FILE_TYPE_NO_DECOMPRESS);
   if (! file)
     return grub_errno;
 
index 8a7f1af78444bd830fa912ea34bee53dd79d082f..778fab9c3328578d284a9c82594191e5f7dcff7f 100644 (file)
@@ -56,7 +56,7 @@ grub_cmd_cat (grub_extcmd_context_t ctxt, int argc, char **args)
   if (argc != 1)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
 
-  file = grub_file_open (args[0]);
+  file = grub_file_open (args[0], GRUB_FILE_TYPE_CAT);
   if (! file)
     return grub_errno;
 
index cc23ee67ea372c6c0fc4014ce9cfaf56e3924545..e9c3b25d34cb6a472292611903d91bd9281e2507 100644 (file)
@@ -45,8 +45,8 @@ grub_cmd_cmp (grub_command_t cmd __attribute__ ((unused)),
   grub_printf_ (N_("Compare file `%s' with `%s':\n"), args[0],
                args[1]);
 
-  file1 = grub_file_open (args[0]);
-  file2 = grub_file_open (args[1]);
+  file1 = grub_file_open (args[0], GRUB_FILE_TYPE_CMP);
+  file2 = grub_file_open (args[1], GRUB_FILE_TYPE_CMP);
   if (! file1 || ! file2)
     goto cleanup;
 
index 214adc3d2e205d756a07235ffac56e0f3e6573a5..f83f8c62a8744623502e2511318bbe65dc6136b4 100644 (file)
@@ -169,7 +169,7 @@ grub_cmd_loadbios (grub_command_t cmd __attribute__ ((unused)),
 
   if (argc > 1)
     {
-      file = grub_file_open (argv[1]);
+      file = grub_file_open (argv[1], GRUB_FILE_TYPE_VBE_DUMP);
       if (! file)
        return grub_errno;
 
@@ -183,7 +183,7 @@ grub_cmd_loadbios (grub_command_t cmd __attribute__ ((unused)),
        return grub_errno;
     }
 
-  file = grub_file_open (argv[0]);
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_VBE_DUMP);
   if (! file)
     return grub_errno;
 
index d18687351a57ef9b95097f24d51dc0c68b79f52a..0f18f2cc16f2ed545e82087bd142dc0fda32cadc 100644 (file)
@@ -113,7 +113,7 @@ check_list (const gcry_md_spec_t *hash, const char *hashfilename,
   if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
     return grub_error (GRUB_ERR_BUG, "mdlen is too long");
 
-  hashlist = grub_file_open (hashfilename);
+  hashlist = grub_file_open (hashfilename, GRUB_FILE_TYPE_HASHLIST);
   if (!hashlist)
     return grub_errno;
   
@@ -141,17 +141,15 @@ check_list (const gcry_md_spec_t *hash, const char *hashfilename,
          filename = grub_xasprintf ("%s/%s", prefix, p);
          if (!filename)
            return grub_errno;
-         if (!uncompress)
-           grub_file_filter_disable_compression ();
-         file = grub_file_open (filename);
+         file = grub_file_open (filename, GRUB_FILE_TYPE_TO_HASH
+                                | (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
+                                   : 0));
          grub_free (filename);
        }
       else
-       {
-         if (!uncompress)
-           grub_file_filter_disable_compression ();
-         file = grub_file_open (p);
-       }
+       file = grub_file_open (p, GRUB_FILE_TYPE_TO_HASH
+                              | (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
+                                 : 0));
       if (!file)
        {
          grub_file_close (hashlist);
@@ -242,9 +240,9 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt,
       grub_file_t file;
       grub_err_t err;
       unsigned j;
-      if (!uncompress)
-       grub_file_filter_disable_compression ();
-      file = grub_file_open (args[i]);
+      file = grub_file_open (args[i], GRUB_FILE_TYPE_TO_HASH
+                            | (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
+                               : 0));
       if (!file)
        {
          if (!keep)
index 4c884b3a19a47fc7470eafb4489b1e6fde1224b9..eaa12465bb381c5de0475175289e3e6c0e0bea7e 100644 (file)
@@ -90,7 +90,7 @@ grub_cmd_hexdump (grub_extcmd_context_t ctxt, int argc, char **args)
     {
       grub_file_t file;
 
-      file = grub_file_open (args[0]);
+      file = grub_file_open (args[0], GRUB_FILE_TYPE_HEXCAT);
       if (! file)
        return 0;
 
index 92ce629d9f6bdeaabfbf4356678ef36d597f01c8..b33f41e01545fe48c3abd92c587328e9106a9c14 100644 (file)
@@ -39,7 +39,7 @@ grub_cmd_nthibr (grub_command_t cmd __attribute__ ((unused)),
   if (argc != 1)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
 
-  hibr_file = grub_file_open (args[0]);
+  hibr_file = grub_file_open (args[0], GRUB_FILE_TYPE_FILE_ID);
   if (!hibr_file)
     return grub_errno;
 
index 40798c96c8138830667d5c24ba71d00cb95afdbc..75da73fba25a791b422a42c0998f527f041efa60 100644 (file)
@@ -93,7 +93,7 @@ grub_cmd_play (grub_command_t cmd __attribute__ ((unused)),
       grub_uint32_t tempo;
       grub_file_t file;
 
-      file = grub_file_open (args[0]);
+      file = grub_file_open (args[0], GRUB_FILE_TYPE_AUDIO);
 
       if (! file)
         return grub_errno;
index da04389e31712f5e5363f25d20ffa6c803a4f3c5..9ce28f2f7e125f191d1cf83d3e3fb6b7e592e722 100644 (file)
@@ -218,7 +218,7 @@ grub_cmd_keymap (struct grub_command *cmd __attribute__ ((unused)),
   else
     filename = argv[0];
 
-  file = grub_file_open (filename);
+  file = grub_file_open (filename, GRUB_FILE_TYPE_KEYBOARD_LAYOUT);
   if (! file)
     goto fail;
 
index f429a5d1b9b6d13c44a4cf041b28108080fe005b..5fe1d16f0cfe2c31091eb0222790765a7cb5c629 100644 (file)
@@ -55,7 +55,7 @@ legacy_file (const char *filename)
   if (!suffix)
     return grub_errno;
 
-  file = grub_file_open (filename);
+  file = grub_file_open (filename, GRUB_FILE_TYPE_CONFIG);
   if (! file)
     return grub_errno;
 
index de6da26160038fc559797d3310d742f3d22c70ef..ff38b063ed05fb335a43076bacc30b814fa5b2b2 100644 (file)
@@ -44,7 +44,8 @@ static const struct grub_arg_option options[] =
    PUBKEY filter (that insists upon properly signed files) as well.  PUBKEY
    filter is restored before the function returns. */
 static grub_file_t
-open_envblk_file (char *filename, int untrusted)
+open_envblk_file (char *filename,
+                 enum grub_file_type type)
 {
   grub_file_t file;
   char *buf = 0;
@@ -72,13 +73,7 @@ open_envblk_file (char *filename, int untrusted)
       grub_strcpy (filename + len + 1, GRUB_ENVBLK_DEFCFG);
     }
 
-  /* The filters that are disabled will be re-enabled by the call to
-     grub_file_open() after this particular file is opened. */
-  grub_file_filter_disable_compression ();
-  if (untrusted)
-    grub_file_filter_disable_pubkey ();
-
-  file = grub_file_open (filename);
+  file = grub_file_open (filename, type);
 
   grub_free (buf);
   return file;
@@ -171,7 +166,10 @@ grub_cmd_load_env (grub_extcmd_context_t ctxt, int argc, char **args)
   whitelist.list = args;
 
   /* state[0] is the -f flag; state[1] is the --skip-sig flag */
-  file = open_envblk_file ((state[0].set) ? state[0].arg : 0, state[1].set);
+  file = open_envblk_file ((state[0].set) ? state[0].arg : 0,
+                          GRUB_FILE_TYPE_LOADENV
+                          | (state[1].set
+                             ? GRUB_FILE_TYPE_SKIP_SIGNATURE : 0));
   if (! file)
     return grub_errno;
 
@@ -206,7 +204,10 @@ grub_cmd_list_env (grub_extcmd_context_t ctxt,
   grub_file_t file;
   grub_envblk_t envblk;
 
-  file = open_envblk_file ((state[0].set) ? state[0].arg : 0, 0);
+  file = open_envblk_file ((state[0].set) ? state[0].arg : 0,
+                          GRUB_FILE_TYPE_LOADENV
+                          | (state[1].set
+                             ? GRUB_FILE_TYPE_SKIP_SIGNATURE : 0));
   if (! file)
     return grub_errno;
 
@@ -399,7 +400,8 @@ grub_cmd_save_env (grub_extcmd_context_t ctxt, int argc, char **args)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, "no variable is specified");
 
   file = open_envblk_file ((state[0].set) ? state[0].arg : 0,
-                           1 /* allow untrusted */);
+                          GRUB_FILE_TYPE_SAVEENV
+                          | GRUB_FILE_TYPE_SKIP_SIGNATURE);
   if (! file)
     return grub_errno;
 
index 0eaf836527944ba69d499050ad080f919d3e57ef..f0d3c1caec4431832c4f21ad14ae936d146f57e1 100644 (file)
@@ -129,8 +129,8 @@ print_files_long (const char *filename, const struct grub_dirhook_info *info,
 
       /* XXX: For ext2fs symlinks are detected as files while they
         should be reported as directories.  */
-      grub_file_filter_disable_compression ();
-      file = grub_file_open (pathname);
+      file = grub_file_open (pathname, GRUB_FILE_TYPE_GET_SIZE
+                            | GRUB_FILE_TYPE_NO_DECOMPRESS);
       if (! file)
        {
          grub_errno = 0;
@@ -225,8 +225,8 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
          struct grub_dirhook_info info;
          grub_errno = 0;
 
-         grub_file_filter_disable_compression ();
-         file = grub_file_open (dirname);
+         file = grub_file_open (dirname, GRUB_FILE_TYPE_GET_SIZE
+                                | GRUB_FILE_TYPE_NO_DECOMPRESS);
          if (! file)
            goto fail;
 
index 344ea7c183dd0199a5fad76c41cf5b9e71ad084b..21aca5f426f901f4511c2916aec37d965b842b2f 100644 (file)
@@ -43,7 +43,7 @@ grub_mini_cmd_cat (struct grub_command *cmd __attribute__ ((unused)),
   if (argc < 1)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
 
-  file = grub_file_open (argv[0]);
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_CAT);
   if (! file)
     return grub_errno;
 
index 33b6b99eaaf4b204179e1b8114c3f5237cf27fa9..c810ffadbbd6032382923af44cd3417074b376dd 100644 (file)
@@ -234,7 +234,8 @@ grub_cmd_nativedisk (grub_command_t cmd __attribute__ ((unused)),
       if (! filename)
        goto fail;
 
-      file = grub_file_open (filename);
+      file = grub_file_open (filename,
+                            GRUB_FILE_TYPE_GRUB_MODULE);
       grub_free (filename);
       if (! file)
        goto fail;
index f144c511b0f18de4b487f31ff59ae571d8b34142..bfa44ac5bad4adf4252eb0bf414ebaa6a1b7fde1 100644 (file)
@@ -193,7 +193,7 @@ grub_cmd_parttool (grub_command_t cmd __attribute__ ((unused)),
          {
            grub_file_t file;
 
-           file = grub_file_open (filename);
+           file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
            if (file)
              {
                char *buf = 0;
index 16143a34c83345d9e0b278f49f957d3a697a2b40..aa67923326a4c11acca52377b5a16531a2f43281 100644 (file)
@@ -81,8 +81,8 @@ iterate_device (const char *name, void *data)
       if (! buf)
        return 1;
 
-      grub_file_filter_disable_compression ();
-      file = grub_file_open (buf);
+      file = grub_file_open (buf, GRUB_FILE_TYPE_FS_SEARCH
+                            | GRUB_FILE_TYPE_NO_DECOMPRESS);
       if (file)
        {
          found = 1;
index c98c13d8c24c1aa906b2c09ba38322fb63a15cc2..4212ae4b5461fa551ed61750e0904d652605e205 100644 (file)
@@ -355,8 +355,8 @@ test_parse (char **args, int *argn, int argc)
          if (grub_strcmp (args[*argn], "-s") == 0)
            {
              grub_file_t file;
-             grub_file_filter_disable_compression ();
-             file = grub_file_open (args[*argn + 1]);
+             file = grub_file_open (args[*argn + 1], GRUB_FILE_TYPE_GET_SIZE
+                                    | GRUB_FILE_TYPE_NO_DECOMPRESS);
              update_val (file && (grub_file_size (file) != 0), &ctx);
              if (file)
                grub_file_close (file);
index cfab6763dc3f63faeefb99d71b9b53e35a81ddbb..ff01a0516dd71fb9a0ea87436bc3de4caa654db0 100644 (file)
@@ -57,7 +57,7 @@ grub_cmd_testload (struct grub_command *cmd __attribute__ ((unused)),
   if (argc < 1)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
 
-  file = grub_file_open (argv[0]);
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_TESTLOAD);
   if (! file)
     return grub_errno;
 
index 042645f8d26424695c525a1607fc3c61b28e2b5d..c13a9b8d8d2235e7c7b37e76f025556f19085093 100644 (file)
@@ -61,7 +61,7 @@ grub_cmd_testspeed (grub_extcmd_context_t ctxt, int argc, char **args)
   if (buffer == NULL)
     return grub_errno;
 
-  file = grub_file_open (args[0]);
+  file = grub_file_open (args[0], GRUB_FILE_TYPE_TESTLOAD);
   if (file == NULL)
     goto quit;
 
index dbe7e83c02326696cca88b51d8949d273288df3e..b620b11fe21306b2d0cc67a18bb42ba98befacbb 100644 (file)
@@ -667,10 +667,12 @@ grub_cmd_trust (grub_extcmd_context_t ctxt,
   if (argc < 1)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
 
-  grub_file_filter_disable_compression ();
-  if (ctxt->state[OPTION_SKIP_SIG].set)
-    grub_file_filter_disable_pubkey ();
-  pkf = grub_file_open (args[0]);
+  pkf = grub_file_open (args[0],
+                       GRUB_FILE_TYPE_PUBLIC_KEY_TRUST
+                       | GRUB_FILE_TYPE_NO_DECOMPRESS
+                       | (ctxt->state[OPTION_SKIP_SIG].set
+                          ? GRUB_FILE_TYPE_SKIP_SIGNATURE
+                          : 0));
   if (!pkf)
     return grub_errno;
   pk = grub_load_public_key (pkf);
@@ -758,10 +760,12 @@ grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
   if (argc > 2)
     {
       grub_file_t pkf;
-      grub_file_filter_disable_compression ();
-      if (ctxt->state[OPTION_SKIP_SIG].set)
-       grub_file_filter_disable_pubkey ();
-      pkf = grub_file_open (args[2]);
+      pkf = grub_file_open (args[2],
+                           GRUB_FILE_TYPE_PUBLIC_KEY
+                           | GRUB_FILE_TYPE_NO_DECOMPRESS
+                           | (ctxt->state[OPTION_SKIP_SIG].set
+                              ? GRUB_FILE_TYPE_SKIP_SIGNATURE
+                              : 0));
       if (!pkf)
        return grub_errno;
       pk = grub_load_public_key (pkf);
@@ -773,16 +777,16 @@ grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
       grub_file_close (pkf);
     }
 
-  grub_file_filter_disable_all ();
-  f = grub_file_open (args[0]);
+  f = grub_file_open (args[0], GRUB_FILE_TYPE_VERIFY_SIGNATURE);
   if (!f)
     {
       err = grub_errno;
       goto fail;
     }
 
-  grub_file_filter_disable_all ();
-  sig = grub_file_open (args[1]);
+  sig = grub_file_open (args[1],
+                       GRUB_FILE_TYPE_SIGNATURE
+                       | GRUB_FILE_TYPE_NO_DECOMPRESS);
   if (!sig)
     {
       err = grub_errno;
@@ -825,30 +829,29 @@ struct grub_fs verified_fs =
 };
 
 static grub_file_t
-grub_pubkey_open (grub_file_t io, const char *filename)
+grub_pubkey_open (grub_file_t io, enum grub_file_type type)
 {
   grub_file_t sig;
   char *fsuf, *ptr;
   grub_err_t err;
-  grub_file_filter_t curfilt[GRUB_FILE_FILTER_MAX];
   grub_file_t ret;
 
+  if ((type & GRUB_FILE_TYPE_MASK) == GRUB_FILE_TYPE_SIGNATURE
+      || (type & GRUB_FILE_TYPE_MASK) == GRUB_FILE_TYPE_VERIFY_SIGNATURE
+      || (type & GRUB_FILE_TYPE_SKIP_SIGNATURE))
+    return io;
+
   if (!sec)
     return io;
   if (io->device->disk && io->device->disk->id == GRUB_DISK_DEVICE_MEMDISK_ID)
     return io;
-  fsuf = grub_malloc (grub_strlen (filename) + sizeof (".sig"));
+  fsuf = grub_malloc (grub_strlen (io->name) + sizeof (".sig"));
   if (!fsuf)
     return NULL;
-  ptr = grub_stpcpy (fsuf, filename);
+  ptr = grub_stpcpy (fsuf, io->name);
   grub_memcpy (ptr, ".sig", sizeof (".sig"));
 
-  grub_memcpy (curfilt, grub_file_filters_enabled,
-              sizeof (curfilt));
-  grub_file_filter_disable_all ();
-  sig = grub_file_open (fsuf);
-  grub_memcpy (grub_file_filters_enabled, curfilt,
-              sizeof (curfilt));
+  sig = grub_file_open (fsuf, GRUB_FILE_TYPE_SIGNATURE);
   grub_free (fsuf);
   if (!sig)
     return NULL;
@@ -876,7 +879,7 @@ grub_pubkey_open (grub_file_t io, const char *filename)
     {
       if (!grub_errno)
        grub_error (GRUB_ERR_FILE_READ_ERROR, N_("premature end of file %s"),
-                   filename);
+                   io->name);
       return NULL;
     }
 
index d9fa1f3c57df219042579fad2f15d887eb0592be..019f8a5fc38a7c42f08fd17eb6bcd560492effde 100644 (file)
@@ -90,7 +90,8 @@ grub_cmd_loopback (grub_extcmd_context_t ctxt, int argc, char **args)
   if (argc < 2)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
 
-  file = grub_file_open (args[1]);
+  file = grub_file_open (args[1], GRUB_FILE_TYPE_LOOPBACK
+                        | GRUB_FILE_TYPE_NO_DECOMPRESS);
   if (! file)
     return grub_errno;
 
index d603dbe0448dea2b71d5320182888077369dbe70..7e89de47d50b97f209e2d3df33ac944436aebe7b 100644 (file)
@@ -418,7 +418,7 @@ grub_font_load (const char *filename)
 #endif
 
   if (filename[0] == '(' || filename[0] == '/' || filename[0] == '+')
-    file = grub_buffile_open (filename, 1024);
+    file = grub_buffile_open (filename, GRUB_FILE_TYPE_FONT, 1024);
   else
     {
       const char *prefix = grub_env_get ("prefix");
@@ -438,7 +438,7 @@ grub_font_load (const char *filename)
       ptr = grub_stpcpy (ptr, filename);
       ptr = grub_stpcpy (ptr, ".pf2");
       *ptr = 0;
-      file = grub_buffile_open (fullname, 1024);
+      file = grub_buffile_open (fullname, GRUB_FILE_TYPE_FONT, 1024);
       grub_free (fullname);
     }
   if (!file)
index 88dae72efc4d83435773c5690bb3678650ee9b70..81eb7227ff5f1944d11df041215c765867483e03 100644 (file)
@@ -418,7 +418,7 @@ grub_cmd_zfs_key (grub_extcmd_context_t ctxt, int argc, char **args)
   if (argc > 0)
     {
       grub_file_t file;
-      file = grub_file_open (args[0]);
+      file = grub_file_open (args[0], GRUB_FILE_TYPE_ZFS_ENCRYPTION_KEY);
       if (!file)
        return grub_errno;
       real_size = grub_file_read (file, buf, 1024);
index 4880cefe3f8af2c83fbb84ae06258b4e3a485872..4d02e62c10995f283c1b0db5f1eaede816362bc9 100644 (file)
@@ -291,7 +291,7 @@ grub_mofile_open (struct grub_gettext_context *ctx,
   /* Using fd_mo and not another variable because
      it's needed for grub_gettext_get_info.  */
 
-  fd = grub_file_open (filename);
+  fd = grub_file_open (filename, GRUB_FILE_TYPE_GETTEXT_CATALOG);
 
   if (!fd)
     return grub_errno;
index 8a7945816114c50d8af27cb7d74e38391456296d..aa9cbaf17ea88372de21f9c414403246d8dd5837 100644 (file)
@@ -743,7 +743,7 @@ grub_gfxmenu_view_load_theme (grub_gfxmenu_view_t view, const char *theme_path)
   p.view = view;
   p.theme_dir = grub_get_dirname (theme_path);
 
-  file = grub_file_open (theme_path);
+  file = grub_file_open (theme_path, GRUB_FILE_TYPE_THEME);
   if (! file)
     {
       grub_free (p.theme_dir);
index 22438277d7456358dfc6bcbb51317fd704987738..1049f5fbc8da6d3808da9e853ae30cd57338e95d 100644 (file)
@@ -43,7 +43,8 @@ typedef struct grub_bufio *grub_bufio_t;
 static struct grub_fs grub_bufio_fs;
 
 grub_file_t
-grub_bufio_open (grub_file_t io, int size)
+grub_bufio_open (grub_file_t io,
+                grub_size_t size)
 {
   grub_file_t file;
   grub_bufio_t bufio = 0;
@@ -57,7 +58,7 @@ grub_bufio_open (grub_file_t io, int size)
   else if (size > GRUB_BUFIO_MAX_SIZE)
     size = GRUB_BUFIO_MAX_SIZE;
 
-  if ((size < 0) || ((unsigned) size > io->size))
+  if (size > io->size)
     size = ((io->size > GRUB_BUFIO_MAX_SIZE) ? GRUB_BUFIO_MAX_SIZE :
             io->size);
 
@@ -81,11 +82,12 @@ grub_bufio_open (grub_file_t io, int size)
 }
 
 grub_file_t
-grub_buffile_open (const char *name, int size)
+grub_buffile_open (const char *name, enum grub_file_type type,
+                  grub_size_t size)
 {
   grub_file_t io, file;
 
-  io = grub_file_open (name);
+  io = grub_file_open (name, type);
   if (! io)
     return 0;
 
index 59ad6daffc428b4d3f215ba9ab467d20a50968ff..959a0fbc7127106c294715513542e0cba7154b69 100644 (file)
@@ -1125,11 +1125,14 @@ initialize_tables (grub_gzio_t gzio)
    even if IO does not contain data compressed by gzip, return a valid file
    object. Note that this function won't close IO, even if an error occurs.  */
 static grub_file_t
-grub_gzio_open (grub_file_t io, const char *name __attribute__ ((unused)))
+grub_gzio_open (grub_file_t io, enum grub_file_type type)
 {
   grub_file_t file;
   grub_gzio_t gzio = 0;
 
+  if (type & GRUB_FILE_TYPE_NO_DECOMPRESS)
+    return io;
+
   file = (grub_file_t) grub_zalloc (sizeof (*file));
   if (! file)
     return 0;
index 2895e2102a67947666377d145e4733e747ff81b9..56a02299499ea81cf2c52f70063be6f9384270a7 100644 (file)
@@ -409,12 +409,14 @@ CORRUPTED:
 }
 
 static grub_file_t
-grub_lzopio_open (grub_file_t io,
-                 const char *name __attribute__ ((unused)))
+grub_lzopio_open (grub_file_t io, enum grub_file_type type)
 {
   grub_file_t file;
   grub_lzopio_t lzopio;
 
+  if (type & GRUB_FILE_TYPE_NO_DECOMPRESS)
+    return io;
+
   file = (grub_file_t) grub_zalloc (sizeof (*file));
   if (!file)
     return 0;
index ebed0ebe63e127e2849a7a3e66cc339310f6d202..ec8e2320871d0d849cfda0dc08cabc011bf97848 100644 (file)
@@ -69,7 +69,8 @@ grub_file_offset_close (grub_file_t file)
 }
 
 grub_file_t
-grub_file_offset_open (grub_file_t parent, grub_off_t start, grub_off_t size)
+grub_file_offset_open (grub_file_t parent, enum grub_file_type type,
+                      grub_off_t start, grub_off_t size)
 {
   struct grub_offset_file *off_data;
   grub_file_t off_file, last_off_file;
@@ -95,10 +96,10 @@ grub_file_offset_open (grub_file_t parent, grub_off_t start, grub_off_t size)
   last_off_file = NULL;
   for (filter = GRUB_FILE_FILTER_COMPRESSION_FIRST;
        off_file && filter <= GRUB_FILE_FILTER_COMPRESSION_LAST; filter++)
-    if (grub_file_filters_enabled[filter])
+    if (grub_file_filters[filter])
       {
        last_off_file = off_file;
-       off_file = grub_file_filters_enabled[filter] (off_file, parent->name);
+       off_file = grub_file_filters[filter] (off_file, type);
       }
 
   if (!off_file)
index bcce242903a1a74a5dcc01a977a87c0597f65a31..932f098aadab3bd9bb22530e917b50aa0fabc4e6 100644 (file)
@@ -169,12 +169,14 @@ ERROR:
 }
 
 static grub_file_t
-grub_xzio_open (grub_file_t io,
-               const char *name __attribute__ ((unused)))
+grub_xzio_open (grub_file_t io, enum grub_file_type type)
 {
   grub_file_t file;
   grub_xzio_t xzio;
 
+  if (type & GRUB_FILE_TYPE_NO_DECOMPRESS)
+    return io;
+
   file = (grub_file_t) grub_zalloc (sizeof (*file));
   if (!file)
     return 0;
index ccbd5bac4418b1650bf8b917a601470807bd2301..74168caf518761ec8afed1047d4d49a7a13c044a 100644 (file)
@@ -653,7 +653,7 @@ grub_dl_load_file (const char *filename)
   void *core = 0;
   grub_dl_t mod = 0;
 
-  file = grub_file_open (filename);
+  file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE);
   if (! file)
     return 0;
 
index 5f99c43cc81a1b5458343f68ebbf9303e79bbd7b..e6c9cc762d7e35358117a27a667e39359761d3fe 100644 (file)
@@ -100,12 +100,12 @@ fail:
 }
 
 grub_elf_t
-grub_elf_open (const char *name)
+grub_elf_open (const char *name, enum grub_file_type type)
 {
   grub_file_t file;
   grub_elf_t elf;
 
-  file = grub_file_open (name);
+  file = grub_file_open (name, type);
   if (! file)
     return 0;
 
index 24da12bb99d12bbde0e2e4673e85ad78ce793558..3f3425b74f1902ac3f2b9350fc3d517b2ecbd520 100644 (file)
@@ -28,8 +28,7 @@
 
 void (*EXPORT_VAR (grub_grubnet_fini)) (void);
 
-grub_file_filter_t grub_file_filters_all[GRUB_FILE_FILTER_MAX];
-grub_file_filter_t grub_file_filters_enabled[GRUB_FILE_FILTER_MAX];
+grub_file_filter_t grub_file_filters[GRUB_FILE_FILTER_MAX];
 
 /* Get the device part of the filename NAME. It is enclosed by parentheses.  */
 char *
@@ -59,7 +58,7 @@ grub_file_get_device_name (const char *name)
 }
 
 grub_file_t
-grub_file_open (const char *name)
+grub_file_open (const char *name, enum grub_file_type type)
 {
   grub_device_t device = 0;
   grub_file_t file = 0, last_file = 0;
@@ -105,18 +104,20 @@ grub_file_open (const char *name)
   file->name = grub_strdup (name);
   grub_errno = GRUB_ERR_NONE;
 
-  for (filter = 0; file && filter < ARRAY_SIZE (grub_file_filters_enabled);
+  for (filter = 0; file && filter < ARRAY_SIZE (grub_file_filters);
        filter++)
-    if (grub_file_filters_enabled[filter])
+    if (grub_file_filters[filter])
       {
        last_file = file;
-       file = grub_file_filters_enabled[filter] (file, name);
+       file = grub_file_filters[filter] (file, type);
+       if (file && file != last_file)
+         {
+           file->name = grub_strdup (name);
+           grub_errno = GRUB_ERR_NONE;
+         }
       }
   if (!file)
     grub_file_close (last_file);
-    
-  grub_memcpy (grub_file_filters_enabled, grub_file_filters_all,
-              sizeof (grub_file_filters_enabled));
 
   return file;
 
@@ -128,9 +129,6 @@ grub_file_open (const char *name)
 
   grub_free (file);
 
-  grub_memcpy (grub_file_filters_enabled, grub_file_filters_all,
-              sizeof (grub_file_filters_enabled));
-
   return 0;
 }
 
index c0fed8068bcf3b71c74b28c945a16ec54197dcd3..1cb6a2d93b4002595060f89fe451e5425620a479 100644 (file)
@@ -218,7 +218,7 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
 
   b = grub_efi_system_table->boot_services;
 
-  file = grub_file_open (filename);
+  file = grub_file_open (filename, GRUB_FILE_TYPE_EFI_CHAINLOADED_IMAGE);
   if (! file)
     goto fail;
 
index 006632e56d0681f31ec9f368ab6cb62445771928..922de0fb0093163f2631fdd595779b59eaf5c01c 100644 (file)
@@ -1448,7 +1448,7 @@ grub_bsd_load (int argc, char *argv[])
       goto fail;
     }
 
-  file = grub_file_open (argv[0]);
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_BSD_KERNEL);
   if (!file)
     goto fail;
 
@@ -1525,7 +1525,7 @@ grub_cmd_freebsd (grub_extcmd_context_t ctxt, int argc, char *argv[])
          if (err)
            return err;
 
-         file = grub_file_open (argv[0]);
+         file = grub_file_open (argv[0], GRUB_FILE_TYPE_BSD_KERNEL);
          if (! file)
            return grub_errno;
 
@@ -1682,7 +1682,7 @@ grub_cmd_netbsd (grub_extcmd_context_t ctxt, int argc, char *argv[])
        {
          grub_file_t file;
 
-         file = grub_file_open (argv[0]);
+         file = grub_file_open (argv[0], GRUB_FILE_TYPE_BSD_KERNEL);
          if (! file)
            return grub_errno;
 
@@ -1791,7 +1791,7 @@ grub_cmd_freebsd_loadenv (grub_command_t cmd __attribute__ ((unused)),
       goto fail;
     }
 
-  file = grub_file_open (argv[0]);
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_FREEBSD_ENV);
   if ((!file) || (!file->size))
     goto fail;
 
@@ -1892,7 +1892,7 @@ grub_cmd_freebsd_module (grub_command_t cmd __attribute__ ((unused)),
       return 0;
     }
 
-  file = grub_file_open (argv[0]);
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_FREEBSD_MODULE);
   if ((!file) || (!file->size))
     goto fail;
 
@@ -1943,7 +1943,7 @@ grub_netbsd_module_load (char *filename, grub_uint32_t type)
   void *src;
   grub_err_t err;
 
-  file = grub_file_open (filename);
+  file = grub_file_open (filename, GRUB_FILE_TYPE_NETBSD_MODULE);
   if ((!file) || (!file->size))
     goto fail;
 
@@ -2029,7 +2029,7 @@ grub_cmd_freebsd_module_elf (grub_command_t cmd __attribute__ ((unused)),
       return 0;
     }
 
-  file = grub_file_open (argv[0]);
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_FREEBSD_MODULE_ELF);
   if (!file)
     return grub_errno;
   if (!file->size)
@@ -2065,7 +2065,7 @@ grub_cmd_openbsd_ramdisk (grub_command_t cmd __attribute__ ((unused)),
   if (!openbsd_ramdisk.max_size)
     return grub_error (GRUB_ERR_BAD_OS, "your kOpenBSD doesn't support ramdisk");
 
-  file = grub_file_open (args[0]);
+  file = grub_file_open (args[0], GRUB_FILE_TYPE_OPENBSD_RAMDISK);
   if (! file)
     return grub_errno;
 
index 7b63e257994171fde5cec03345fc3ceed4bd2a10..d766fe5f2bf94e77ec58e46f711b3dcc8a78160a 100644 (file)
@@ -694,7 +694,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
       goto fail;
     }
 
-  file = grub_file_open (argv[0]);
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_LINUX_KERNEL);
   if (! file)
     goto fail;
 
index 672c013e74d26520f7f8abc84a413019e5d0b4aa..a91157612b0ee081caa0b932b5a6cf689198c6d4 100644 (file)
@@ -139,7 +139,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
       goto fail;
     }
 
-  file = grub_file_open (argv[0]);
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_LINUX_KERNEL);
   if (! file)
     goto fail;
 
index 1b22bed9edd6a339d485d3856f8c5465b8d64cfb..9cc2657006c673fda61a4a9b796a9952ae847185 100644 (file)
@@ -484,7 +484,7 @@ grub_cmd_devprop_load (grub_command_t cmd __attribute__ ((unused)),
   if (argc != 1)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
 
-  file = grub_file_open (args[0]);
+  file = grub_file_open (args[0], GRUB_FILE_XNU_DEVPROP);
   if (! file)
     return grub_errno;
   size = grub_file_size (file);
index af067a5a4a64e542e95aeced7e1993c0083c634b..231aa415ecb436692210f50130e53d908002d843 100644 (file)
@@ -170,7 +170,6 @@ grub_initrd_init (int argc, char *argv[],
          eptr = grub_strchr (ptr, ':');
          if (eptr)
            {
-             grub_file_filter_disable_compression ();
              initrd_ctx->components[i].newc_name = grub_strndup (ptr, eptr - ptr);
              if (!initrd_ctx->components[i].newc_name)
                {
@@ -195,8 +194,9 @@ grub_initrd_init (int argc, char *argv[],
          root = 0;
          newc = 0;
        }
-      grub_file_filter_disable_compression ();
-      initrd_ctx->components[i].file = grub_file_open (fname);
+      initrd_ctx->components[i].file = grub_file_open (fname,
+                                                      GRUB_FILE_TYPE_LINUX_INITRD
+                                                      | GRUB_FILE_TYPE_NO_DECOMPRESS);
       if (!initrd_ctx->components[i].file)
        {
          grub_initrd_close (initrd_ctx);
index bf0bf74f78f2cea634e387b18f8744c93b57f33a..922ecc77218fc116d833fba17db52ce0b95723be 100644 (file)
@@ -184,12 +184,12 @@ fail:
 }
 
 grub_macho_t
-grub_macho_open (const char *name, int is_64bit)
+grub_macho_open (const char *name, enum grub_file_type type, int is_64bit)
 {
   grub_file_t file;
   grub_macho_t macho;
 
-  file = grub_file_open (name);
+  file = grub_file_open (name, type);
   if (! file)
     return 0;
 
index 54e4d240858d27bdb270e8df94026c777c6b63da..b2b28465c3cce820e32fdcb4b9cdd5d72896b0f3 100644 (file)
@@ -259,7 +259,7 @@ grub_cmd_multiboot (grub_command_t cmd __attribute__ ((unused)),
   if (argc == 0)
     return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
 
-  file = grub_file_open (argv[0]);
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_MULTIBOOT_KERNEL);
   if (! file)
     return grub_errno;
 
@@ -325,10 +325,8 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)),
     return grub_error (GRUB_ERR_BAD_ARGUMENT,
                       N_("you need to load the kernel first"));
 
-  if (nounzip)
-    grub_file_filter_disable_compression ();
-
-  file = grub_file_open (argv[0]);
+  file = grub_file_open (argv[0], GRUB_FILE_TYPE_MULTIBOOT_MODULE
+                        | (nounzip ? GRUB_FILE_TYPE_NO_DECOMPRESS : 0));
   if (! file)
     return grub_errno;
 
index cdd9715ceddc584e65a04ef911c55d29ccae51e1..c00947af2a51c87b6cdbca11430033db634496b4 100644 (file)
@@ -351,7 +351,7 @@ grub_cmd_xnu_kernel (grub_command_t cmd __attribute__ ((unused)),
 
   grub_xnu_unload ();
 
-  macho = grub_macho_open (args[0], 0);
+  macho = grub_macho_open (args[0], GRUB_FILE_TYPE_XNU_KERNEL, 0);
   if (! macho)
     return grub_errno;
 
@@ -456,7 +456,7 @@ grub_cmd_xnu_kernel64 (grub_command_t cmd __attribute__ ((unused)),
 
   grub_xnu_unload ();
 
-  macho = grub_macho_open (args[0], 1);
+  macho = grub_macho_open (args[0], GRUB_FILE_TYPE_XNU_KERNEL, 1);
   if (! macho)
     return grub_errno;
 
@@ -674,7 +674,7 @@ grub_xnu_load_driver (char *infoplistname, grub_file_t binaryfile,
     macho = 0;
 
   if (infoplistname)
-    infoplist = grub_file_open (infoplistname);
+    infoplist = grub_file_open (infoplistname, GRUB_FILE_TYPE_XNU_INFO_PLIST);
   else
     infoplist = 0;
   grub_errno = GRUB_ERR_NONE;
@@ -770,7 +770,7 @@ grub_cmd_xnu_mkext (grub_command_t cmd __attribute__ ((unused)),
   if (! grub_xnu_heap_size)
     return grub_error (GRUB_ERR_BAD_OS, N_("you need to load the kernel first"));
 
-  file = grub_file_open (args[0]);
+  file = grub_file_open (args[0], GRUB_FILE_TYPE_XNU_MKEXT);
   if (! file)
     return grub_errno;
 
@@ -884,7 +884,7 @@ grub_cmd_xnu_ramdisk (grub_command_t cmd __attribute__ ((unused)),
   if (! grub_xnu_heap_size)
     return grub_error (GRUB_ERR_BAD_OS, N_("you need to load the kernel first"));
 
-  file = grub_file_open (args[0]);
+  file = grub_file_open (args[0], GRUB_FILE_TYPE_XNU_RAMDISK);
   if (! file)
     return grub_errno;
 
@@ -924,7 +924,7 @@ grub_xnu_check_os_bundle_required (char *plistname,
   if (binname)
     *binname = 0;
 
-  file = grub_file_open (plistname);
+  file = grub_file_open (plistname, GRUB_FILE_TYPE_XNU_INFO_PLIST);
   if (! file)
     return 0;
 
@@ -1209,7 +1209,7 @@ grub_xnu_load_kext_from_dir (char *dirname, const char *osbundlerequired,
                grub_strcpy (binname + grub_strlen (binname), "/");
              grub_strcpy (binname + grub_strlen (binname), binsuffix);
              grub_dprintf ("xnu", "%s:%s\n", ctx.plistname, binname);
-             binfile = grub_file_open (binname);
+             binfile = grub_file_open (binname, GRUB_FILE_TYPE_XNU_KEXT);
              if (! binfile)
                grub_errno = GRUB_ERR_NONE;
 
@@ -1252,7 +1252,7 @@ grub_cmd_xnu_kext (grub_command_t cmd __attribute__ ((unused)),
       /* User explicitly specified plist and binary. */
       if (grub_strcmp (args[1], "-") != 0)
        {
-         binfile = grub_file_open (args[1]);
+         binfile = grub_file_open (args[1], GRUB_FILE_TYPE_XNU_KEXT);
          if (! binfile)
            return grub_errno;
        }
index 534a74438b2b1ff2223f44067a58fc94fe7d6635..8089804d4822a00a1d8b4ab331069386f0db8c97 100644 (file)
@@ -53,8 +53,8 @@ grub_xnu_resume (char *imagename)
   grub_addr_t target_image;
   grub_err_t err;
 
-  grub_file_filter_disable_compression ();
-  file = grub_file_open (imagename);
+  file = grub_file_open (imagename, GRUB_FILE_TYPE_XNU_HIBERNATE_IMAGE
+                        | GRUB_FILE_TYPE_NO_DECOMPRESS);
   if (! file)
     return 0;
 
index 721b9c3256db793da31ab9c51ed7a3d688baf91e..7a7cf2b0f7e3d72cb70b849c33b57f4c5784e540 100644 (file)
@@ -33,12 +33,6 @@ autoload_fs_module (void)
 {
   grub_named_list_t p;
   int ret = 0;
-  grub_file_filter_t grub_file_filters_was[GRUB_FILE_FILTER_MAX];
-
-  grub_memcpy (grub_file_filters_was, grub_file_filters_enabled,
-              sizeof (grub_file_filters_enabled));
-  grub_memcpy (grub_file_filters_enabled, grub_file_filters_all,
-              sizeof (grub_file_filters_enabled));
 
   while ((p = fs_module_list) != NULL)
     {
@@ -56,9 +50,6 @@ autoload_fs_module (void)
       grub_free (p);
     }
 
-  grub_memcpy (grub_file_filters_enabled, grub_file_filters_was,
-              sizeof (grub_file_filters_enabled));
-
   return ret;
 }
 
@@ -82,7 +73,7 @@ read_fs_list (const char *prefix)
          tmp_autoload_hook = grub_fs_autoload_hook;
          grub_fs_autoload_hook = NULL;
 
-         file = grub_file_open (filename);
+         file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
          if (file)
            {
              /* Override previous fs.lst.  */
index 2bfd67c8ef388097701a7415df3cd7321c6a1e57..d5443380284a4af92270c474b91be0575bee7015 100644 (file)
@@ -94,7 +94,7 @@ read_crypto_list (const char *prefix)
       return;
     }
 
-  file = grub_file_open (filename);
+  file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
   grub_free (filename);
   if (!file)
     {
index 169c126f5080dda6599c8059823bb9dc1d134f56..719ebf477f2f6178c7a5667f76c3595a646251f9 100644 (file)
@@ -106,7 +106,7 @@ read_command_list (const char *prefix)
        {
          grub_file_t file;
 
-         file = grub_file_open (filename);
+         file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
          if (file)
            {
              char *buf = NULL;
index ad3627351f8f7acd7cc1c28dcfb5951127460e60..4d908b6cdfc56e32412e747c50000f5b57f2a8b6 100644 (file)
@@ -180,7 +180,7 @@ read_config_file (const char *config)
     }
 
   /* Try to open the config file.  */
-  file = grub_file_open (config);
+  file = grub_file_open (config, GRUB_FILE_TYPE_CONFIG);
   if (! file)
     return 0;
 
index 4c2238b25894eab7768690bbddb5cad342991daa..85e04d43d86d7d2434e4cf409d3b6b54e09ec968 100644 (file)
@@ -331,7 +331,7 @@ read_terminal_list (const char *prefix)
       return;
     }
 
-  file = grub_file_open (filename);
+  file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
   grub_free (filename);
   if (!file)
     {
index 2dc2ee10e54f81797aa768e9618f834bfad894c0..59086b3b1623d09012a7ad4af56382cd5b1296ef 100644 (file)
@@ -768,7 +768,7 @@ grub_video_reader_jpeg (struct grub_video_bitmap **bitmap,
   grub_file_t file;
   struct grub_jpeg_data *data;
 
-  file = grub_buffile_open (filename, 0);
+  file = grub_buffile_open (filename, GRUB_FILE_TYPE_PIXMAP, 0);
   if (!file)
     return grub_errno;
 
index 1f03f88d3965bf11f796b58e523f93d1d11488de..416f56fd6a01c93fa0fcfa97a3676490ca1d6f77 100644 (file)
@@ -1075,7 +1075,7 @@ grub_video_reader_png (struct grub_video_bitmap **bitmap,
   grub_file_t file;
   struct grub_png_data *data;
 
-  file = grub_buffile_open (filename, 0);
+  file = grub_buffile_open (filename, GRUB_FILE_TYPE_PIXMAP, 0);
   if (!file)
     return grub_errno;
 
index 6295a5d2a773026005ef7e64f099b3f476782576..0aaeaa7c46d8efe9f98f6a1c7076dcd6897603fd 100644 (file)
@@ -297,7 +297,7 @@ grub_video_reader_tga (struct grub_video_bitmap **bitmap,
 
   grub_memset (&data, 0, sizeof (data));
 
-  data.file = grub_buffile_open (filename, 0);
+  data.file = grub_buffile_open (filename, GRUB_FILE_TYPE_PIXMAP, 0);
   if (! data.file)
     return grub_errno;
 
index acdd0c882c6b882485136fcc6108b5bec3fc2fbc..0ff72d1033c1e389b7e265785a7131625380cefd 100644 (file)
@@ -22,7 +22,9 @@
 
 #include <grub/file.h>
 
-grub_file_t EXPORT_FUNC (grub_bufio_open) (grub_file_t io, int size);
-grub_file_t EXPORT_FUNC (grub_buffile_open) (const char *name, int size);
+grub_file_t EXPORT_FUNC (grub_bufio_open) (grub_file_t io, grub_size_t size);
+grub_file_t EXPORT_FUNC (grub_buffile_open) (const char *name,
+                                            enum grub_file_type type,
+                                            grub_size_t size);
 
 #endif /* ! GRUB_BUFIO_H */
index 9a7ae4ebb30a7ac15d481b06d1f37f63b77fd9fe..dbb609c9b207864c050b4ebbf3005204836d1a74 100644 (file)
@@ -42,7 +42,7 @@ typedef int (*grub_elf32_phdr_iterate_hook_t)
 typedef int (*grub_elf64_phdr_iterate_hook_t)
   (grub_elf_t elf, Elf64_Phdr *phdr, void *arg);
 
-grub_elf_t grub_elf_open (const char *);
+grub_elf_t grub_elf_open (const char *, enum grub_file_type type);
 grub_elf_t grub_elf_file (grub_file_t file, const char *filename);
 grub_err_t grub_elf_close (grub_elf_t);
 
index 739488cbe59aaa044b37611d00fb2c6c615e2c31..dc3471901518e0e1b8d93209ac638c767afb075a 100644 (file)
 #include <grub/fs.h>
 #include <grub/disk.h>
 
+enum grub_file_type
+  {
+    /* GRUB module to be loaded.  */
+    GRUB_FILE_TYPE_GRUB_MODULE,
+    /* Loopback file to be represented as disk.  */
+    GRUB_FILE_TYPE_LOOPBACK,
+    /* Linux kernel to be loaded.  */
+    GRUB_FILE_TYPE_LINUX_KERNEL,
+    /* Linux initrd.  */
+    GRUB_FILE_TYPE_LINUX_INITRD,
+
+    /* Multiboot kernel.  */
+    GRUB_FILE_TYPE_MULTIBOOT_KERNEL,
+    /* Multiboot module.  */
+    GRUB_FILE_TYPE_MULTIBOOT_MODULE,
+
+    GRUB_FILE_TYPE_BSD_KERNEL,
+    GRUB_FILE_TYPE_FREEBSD_ENV,
+    GRUB_FILE_TYPE_FREEBSD_MODULE,
+    GRUB_FILE_TYPE_FREEBSD_MODULE_ELF,
+    GRUB_FILE_TYPE_NETBSD_MODULE,
+    GRUB_FILE_TYPE_OPENBSD_RAMDISK,
+
+    GRUB_FILE_TYPE_XNU_INFO_PLIST,
+    GRUB_FILE_TYPE_XNU_MKEXT,
+    GRUB_FILE_TYPE_XNU_KEXT,
+    GRUB_FILE_TYPE_XNU_KERNEL,
+    GRUB_FILE_TYPE_XNU_RAMDISK,
+    GRUB_FILE_TYPE_XNU_HIBERNATE_IMAGE,
+    GRUB_FILE_XNU_DEVPROP,
+
+    GRUB_FILE_TYPE_EFI_CHAINLOADED_IMAGE,
+
+    /* File holding signature.  */
+    GRUB_FILE_TYPE_SIGNATURE,
+    /* File holding public key to verify signature once.  */
+    GRUB_FILE_TYPE_PUBLIC_KEY,
+    /* File holding public key to add to trused keys.  */
+    GRUB_FILE_TYPE_PUBLIC_KEY_TRUST,
+    /* File of which we intend to print a blocklist to the user.  */
+    GRUB_FILE_TYPE_PRINT_BLOCKLIST,
+    /* File we intend to use for test loading or testing speed.  */
+    GRUB_FILE_TYPE_TESTLOAD,
+    /* File we open only to get its size. E.g. in ls output.  */
+    GRUB_FILE_TYPE_GET_SIZE,
+    /* Font file.  */
+    GRUB_FILE_TYPE_FONT,
+    /* File holding encryption key for encrypted ZFS.  */
+    GRUB_FILE_TYPE_ZFS_ENCRYPTION_KEY,
+    /* File we open n grub-fstest.  */
+    GRUB_FILE_TYPE_FSTEST,
+    /* File we open n grub-mount.  */
+    GRUB_FILE_TYPE_MOUNT,
+    /* File which we attempt to identify the type of.  */
+    GRUB_FILE_TYPE_FILE_ID,
+    /* File holding ACPI table.  */
+    GRUB_FILE_TYPE_ACPI_TABLE,
+    /* File we intend show to user.  */
+    GRUB_FILE_TYPE_CAT,
+    GRUB_FILE_TYPE_HEXCAT,
+    /* One of pair of files we intend to compare.  */
+    GRUB_FILE_TYPE_CMP,
+    /* List of hashes for hashsum.  */
+    GRUB_FILE_TYPE_HASHLIST,
+    /* File hashed by hashsum.  */
+    GRUB_FILE_TYPE_TO_HASH,
+    /* Keyboard layout.  */
+    GRUB_FILE_TYPE_KEYBOARD_LAYOUT,
+    /* Picture file.  */
+    GRUB_FILE_TYPE_PIXMAP,
+    /* *.lst shipped by GRUB.  */
+    GRUB_FILE_TYPE_GRUB_MODULE_LIST,
+    /* config file.  */
+    GRUB_FILE_TYPE_CONFIG,
+    GRUB_FILE_TYPE_THEME,
+    GRUB_FILE_TYPE_GETTEXT_CATALOG,
+    GRUB_FILE_TYPE_FS_SEARCH,
+    GRUB_FILE_TYPE_AUDIO,
+    GRUB_FILE_TYPE_VBE_DUMP,
+
+    GRUB_FILE_TYPE_LOADENV,
+    GRUB_FILE_TYPE_SAVEENV,
+
+    GRUB_FILE_TYPE_VERIFY_SIGNATURE,
+
+    GRUB_FILE_TYPE_MASK = 0xff,
+
+    /* --skip-sig is specified.  */
+    GRUB_FILE_TYPE_SKIP_SIGNATURE = 0x100,
+    GRUB_FILE_TYPE_NO_DECOMPRESS = 0x200,
+  };
+
 /* File description.  */
 struct grub_file
 {
@@ -77,61 +169,25 @@ typedef enum grub_file_filter_id
     GRUB_FILE_FILTER_COMPRESSION_LAST = GRUB_FILE_FILTER_LZOPIO,
   } grub_file_filter_id_t;
 
-typedef grub_file_t (*grub_file_filter_t) (grub_file_t in, const char *filename);
+typedef grub_file_t (*grub_file_filter_t) (grub_file_t in, enum grub_file_type type);
 
-extern grub_file_filter_t EXPORT_VAR(grub_file_filters_all)[GRUB_FILE_FILTER_MAX];
-extern grub_file_filter_t EXPORT_VAR(grub_file_filters_enabled)[GRUB_FILE_FILTER_MAX];
+extern grub_file_filter_t EXPORT_VAR(grub_file_filters)[GRUB_FILE_FILTER_MAX];
 
 static inline void
 grub_file_filter_register (grub_file_filter_id_t id, grub_file_filter_t filter)
 {
-  grub_file_filters_all[id] = filter;
-  grub_file_filters_enabled[id] = filter;
-}
+  grub_file_filters[id] = filter;}
 
 static inline void
 grub_file_filter_unregister (grub_file_filter_id_t id)
 {
-  grub_file_filters_all[id] = 0;
-  grub_file_filters_enabled[id] = 0;
-}
-
-static inline void
-grub_file_filter_disable (grub_file_filter_id_t id)
-{
-  grub_file_filters_enabled[id] = 0;
-}
-
-static inline void
-grub_file_filter_disable_compression (void)
-{
-  grub_file_filter_id_t id;
-
-  for (id = GRUB_FILE_FILTER_COMPRESSION_FIRST;
-       id <= GRUB_FILE_FILTER_COMPRESSION_LAST; id++)
-    grub_file_filters_enabled[id] = 0;
-}
-
-static inline void
-grub_file_filter_disable_all (void)
-{
-  grub_file_filter_id_t id;
-
-  for (id = 0;
-       id < GRUB_FILE_FILTER_MAX; id++)
-    grub_file_filters_enabled[id] = 0;
-}
-
-static inline void
-grub_file_filter_disable_pubkey (void)
-{
-  grub_file_filters_enabled[GRUB_FILE_FILTER_PUBKEY] = 0;
+  grub_file_filters[id] = 0;
 }
 
 /* Get a device name from NAME.  */
 char *EXPORT_FUNC(grub_file_get_device_name) (const char *name);
 
-grub_file_t EXPORT_FUNC(grub_file_open) (const char *name);
+grub_file_t EXPORT_FUNC(grub_file_open) (const char *name, enum grub_file_type type);
 grub_ssize_t EXPORT_FUNC(grub_file_read) (grub_file_t file, void *buf,
                                          grub_size_t len);
 grub_off_t EXPORT_FUNC(grub_file_seek) (grub_file_t file, grub_off_t offset);
@@ -159,8 +215,8 @@ grub_file_seekable (const grub_file_t file)
 }
 
 grub_file_t
-grub_file_offset_open (grub_file_t parent, grub_off_t start,
-                      grub_off_t size);
+grub_file_offset_open (grub_file_t parent, enum grub_file_type type,
+                      grub_off_t start, grub_off_t size);
 void
 grub_file_offset_close (grub_file_t file);
 
index 1eec118f15f7651f764a54ca5d1db05ea811bd41..f1157f4105b76df450fc660807105e1a6d7e5630 100644 (file)
@@ -49,7 +49,8 @@ struct grub_macho_file
 };
 typedef struct grub_macho_file *grub_macho_t;
 
-grub_macho_t grub_macho_open (const char *, int is_64bit);
+grub_macho_t grub_macho_open (const char *, enum grub_file_type type,
+                             int is_64bit);
 grub_macho_t grub_macho_file (grub_file_t file, const char *filename,
                              int is_64bit);
 grub_err_t grub_macho_close (grub_macho_t);
index 802733963a73000c7983b1de79315957a972ea1a..dd167406bdace2c46013b0e4a8b8b07c779378ac 100644 (file)
@@ -113,9 +113,9 @@ read_file (char *pathname, int (*hook) (grub_off_t ofs, char *buf, int len, void
       return;
     }
 
-  if (uncompress == 0)
-    grub_file_filter_disable_compression ();
-  file = grub_file_open (pathname);
+  file = grub_file_open (pathname, ((uncompress == 0)
+                                   ? GRUB_FILE_TYPE_NO_DECOMPRESS : 0)
+                        | GRUB_FILE_TYPE_FSTEST);
   if (!file)
     {
       grub_util_error (_("cannot open `%s': %s"), pathname,
index 118881e0d9d63a1b66a20e8c1316093a069fcd1f..2b709e844cf5eda24c0c63787456b19e5baea0b8 100644 (file)
@@ -209,7 +209,7 @@ fuse_getattr (const char *path, struct stat *st)
   if (!ctx.file_info.dir)
     {
       grub_file_t file;
-      file = grub_file_open (path);
+      file = grub_file_open (path, GRUB_FILE_TYPE_GET_SIZE);
       if (! file && grub_errno == GRUB_ERR_BAD_FILE_TYPE)
        {
          grub_errno = GRUB_ERR_NONE;
@@ -245,7 +245,7 @@ static int
 fuse_open (const char *path, struct fuse_file_info *fi __attribute__ ((unused)))
 {
   grub_file_t file;
-  file = grub_file_open (path);
+  file = grub_file_open (path, GRUB_FILE_TYPE_MOUNT);
   if (! file)
     return translate_error ();
   files[first_fd++] = file;
@@ -309,7 +309,7 @@ fuse_readdir_call_fill (const char *filename,
       grub_file_t file;
       char *tmp;
       tmp = xasprintf ("%s/%s", ctx->path, filename);
-      file = grub_file_open (tmp);
+      file = grub_file_open (tmp, GRUB_FILE_TYPE_GET_SIZE);
       free (tmp);
       /* Symlink to directory.  */
       if (! file && grub_errno == GRUB_ERR_BAD_FILE_TYPE)