grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 1/8] verifiers: File type for fine-grained signature-verif


From: Ross Philipson
Subject: Re: [PATCH v3 1/8] verifiers: File type for fine-grained signature-verification controlling
Date: Wed, 3 Oct 2018 13:33:26 -0400
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2

On 10/03/2018 05:36 AM, Daniel Kiper wrote:
> From: Vladimir Serbinenko <address@hidden>
> 
> Let's provide file type info to the I/O layer. This way verifiers
> framework and its users will be able to differentiate files and verify
> only required ones.
> 
> This is preparatory patch.
> 
> Signed-off-by: Vladimir Serbinenko <address@hidden>
> Signed-off-by: Daniel Kiper <address@hidden>
> ---
> v3 - suggestions/fixes:
>    - remove unneeded grub-core/commands/i386/nthibr.c
>      (suggested by Matthew Garrett).
> ---
>  grub-core/commands/acpi.c                    |    2 +-
>  grub-core/commands/blocklist.c               |    4 +-
>  grub-core/commands/cat.c                     |    2 +-
>  grub-core/commands/cmp.c                     |    4 +-
>  grub-core/commands/efi/loadbios.c            |    4 +-
>  grub-core/commands/file.c                    |    5 +-
>  grub-core/commands/hashsum.c                 |   22 ++--
>  grub-core/commands/hexdump.c                 |    2 +-
>  grub-core/commands/i386/pc/play.c            |    2 +-
>  grub-core/commands/keylayouts.c              |    2 +-
>  grub-core/commands/legacycfg.c               |    2 +-
>  grub-core/commands/loadenv.c                 |   24 ++--
>  grub-core/commands/ls.c                      |    8 +-
>  grub-core/commands/minicmd.c                 |    2 +-
>  grub-core/commands/nativedisk.c              |    3 +-
>  grub-core/commands/parttool.c                |    2 +-
>  grub-core/commands/search.c                  |    4 +-
>  grub-core/commands/test.c                    |    4 +-
>  grub-core/commands/testload.c                |    2 +-
>  grub-core/commands/testspeed.c               |    2 +-
>  grub-core/commands/verify.c                  |   53 ++++-----
>  grub-core/disk/loopback.c                    |    3 +-
>  grub-core/efiemu/main.c                      |    2 +-
>  grub-core/font/font.c                        |    4 +-
>  grub-core/fs/zfs/zfscrypt.c                  |    2 +-
>  grub-core/gettext/gettext.c                  |    2 +-
>  grub-core/gfxmenu/theme_loader.c             |    2 +-
>  grub-core/io/bufio.c                         |   10 +-
>  grub-core/io/gzio.c                          |    5 +-
>  grub-core/io/lzopio.c                        |    6 +-
>  grub-core/io/offset.c                        |    7 +-
>  grub-core/io/xzio.c                          |    6 +-
>  grub-core/kern/dl.c                          |    2 +-
>  grub-core/kern/elf.c                         |    4 +-
>  grub-core/kern/file.c                        |   22 ++--
>  grub-core/lib/syslinux_parse.c               |    2 +-
>  grub-core/loader/efi/chainloader.c           |    2 +-
>  grub-core/loader/i386/bsd.c                  |   16 +--
>  grub-core/loader/i386/coreboot/chainloader.c |    2 +-
>  grub-core/loader/i386/linux.c                |    2 +-
>  grub-core/loader/i386/pc/chainloader.c       |    4 +-
>  grub-core/loader/i386/pc/freedos.c           |    2 +-
>  grub-core/loader/i386/pc/linux.c             |    2 +-
>  grub-core/loader/i386/pc/ntldr.c             |    2 +-
>  grub-core/loader/i386/pc/plan9.c             |    2 +-
>  grub-core/loader/i386/pc/pxechainloader.c    |    2 +-
>  grub-core/loader/i386/pc/truecrypt.c         |    2 +-
>  grub-core/loader/i386/xen.c                  |    7 +-
>  grub-core/loader/i386/xen_file.c             |    2 +-
>  grub-core/loader/i386/xnu.c                  |    2 +-
>  grub-core/loader/linux.c                     |    6 +-
>  grub-core/loader/macho.c                     |    4 +-
>  grub-core/loader/mips/linux.c                |    2 +-
>  grub-core/loader/multiboot.c                 |    8 +-
>  grub-core/loader/xnu.c                       |   16 +--
>  grub-core/loader/xnu_resume.c                |    4 +-
>  grub-core/normal/autofs.c                    |   11 +-
>  grub-core/normal/crypto.c                    |    2 +-
>  grub-core/normal/dyncmd.c                    |    2 +-
>  grub-core/normal/main.c                      |    2 +-
>  grub-core/normal/term.c                      |    2 +-
>  grub-core/video/readers/jpeg.c               |    2 +-
>  grub-core/video/readers/png.c                |    2 +-
>  grub-core/video/readers/tga.c                |    2 +-
>  include/grub/bufio.h                         |    6 +-
>  include/grub/elfload.h                       |    2 +-
>  include/grub/file.h                          |  151 
> +++++++++++++++++++-------
>  include/grub/machoload.h                     |    3 +-
>  util/grub-fstest.c                           |    6 +-
>  util/grub-mount.c                            |    6 +-
>  70 files changed, 297 insertions(+), 225 deletions(-)
> 
> diff --git a/grub-core/commands/acpi.c b/grub-core/commands/acpi.c
> index 9f02f22..5a1499a 100644
> --- a/grub-core/commands/acpi.c
> +++ b/grub-core/commands/acpi.c
> @@ -635,7 +635,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 ();
> diff --git a/grub-core/commands/blocklist.c b/grub-core/commands/blocklist.c
> index d1a47b5..944449b 100644
> --- a/grub-core/commands/blocklist.c
> +++ b/grub-core/commands/blocklist.c
> @@ -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;
>  
> diff --git a/grub-core/commands/cat.c b/grub-core/commands/cat.c
> index 88d9044..ba5f006 100644
> --- a/grub-core/commands/cat.c
> +++ b/grub-core/commands/cat.c
> @@ -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;
>  
> diff --git a/grub-core/commands/cmp.c b/grub-core/commands/cmp.c
> index cc23ee6..e9c3b25 100644
> --- a/grub-core/commands/cmp.c
> +++ b/grub-core/commands/cmp.c
> @@ -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;
>  
> diff --git a/grub-core/commands/efi/loadbios.c 
> b/grub-core/commands/efi/loadbios.c
> index 132cadb..d41d521 100644
> --- a/grub-core/commands/efi/loadbios.c
> +++ b/grub-core/commands/efi/loadbios.c
> @@ -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;
>  
> diff --git a/grub-core/commands/file.c b/grub-core/commands/file.c
> index 3ff6d55..4f81aa1 100644
> --- a/grub-core/commands/file.c
> +++ b/grub-core/commands/file.c
> @@ -165,7 +165,7 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char 
> **args)
>    if (type == -1)
>      return grub_error (GRUB_ERR_BAD_ARGUMENT, "no type specified");
>  
> -  file = grub_file_open (args[0]);
> +  file = grub_file_open (args[0], GRUB_FILE_TYPE_XNU_KERNEL);
>    if (!file)
>      return grub_errno;
>    switch (type)
> @@ -546,7 +546,8 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char 
> **args)
>      case IS_XNU64:
>      case IS_XNU32:
>        {
> -     macho = grub_macho_open (args[0], (type == IS_XNU64));
> +     macho = grub_macho_open (args[0], GRUB_FILE_TYPE_XNU_KERNEL,
> +                              (type == IS_XNU64));
>       if (!macho)
>         break;
>       /* FIXME: more checks?  */
> diff --git a/grub-core/commands/hashsum.c b/grub-core/commands/hashsum.c
> index d186873..0f18f2c 100644
> --- a/grub-core/commands/hashsum.c
> +++ b/grub-core/commands/hashsum.c
> @@ -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)
> diff --git a/grub-core/commands/hexdump.c b/grub-core/commands/hexdump.c
> index 4c884b3..eaa1246 100644
> --- a/grub-core/commands/hexdump.c
> +++ b/grub-core/commands/hexdump.c
> @@ -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;
>  
> diff --git a/grub-core/commands/i386/pc/play.c 
> b/grub-core/commands/i386/pc/play.c
> index 7712e2a..c818131 100644
> --- a/grub-core/commands/i386/pc/play.c
> +++ b/grub-core/commands/i386/pc/play.c
> @@ -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;
> diff --git a/grub-core/commands/keylayouts.c b/grub-core/commands/keylayouts.c
> index f35d3a3..c05d612 100644
> --- a/grub-core/commands/keylayouts.c
> +++ b/grub-core/commands/keylayouts.c
> @@ -220,7 +220,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;
>  
> diff --git a/grub-core/commands/legacycfg.c b/grub-core/commands/legacycfg.c
> index b32f3c7..db7a8f0 100644
> --- a/grub-core/commands/legacycfg.c
> +++ b/grub-core/commands/legacycfg.c
> @@ -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)
>      {
>        grub_free (suffix);
> diff --git a/grub-core/commands/loadenv.c b/grub-core/commands/loadenv.c
> index acd93d1..ada72df 100644
> --- a/grub-core/commands/loadenv.c
> +++ b/grub-core/commands/loadenv.c
> @@ -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;
>  
> @@ -390,7 +391,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;
>  
> diff --git a/grub-core/commands/ls.c b/grub-core/commands/ls.c
> index c25161c..2cdb2ac 100644
> --- a/grub-core/commands/ls.c
> +++ b/grub-core/commands/ls.c
> @@ -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;
> @@ -234,8 +234,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;
>  
> diff --git a/grub-core/commands/minicmd.c b/grub-core/commands/minicmd.c
> index a3a1182..fc20c65 100644
> --- a/grub-core/commands/minicmd.c
> +++ b/grub-core/commands/minicmd.c
> @@ -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;
>  
> diff --git a/grub-core/commands/nativedisk.c b/grub-core/commands/nativedisk.c
> index 2f56a87..c278f37 100644
> --- a/grub-core/commands/nativedisk.c
> +++ b/grub-core/commands/nativedisk.c
> @@ -242,7 +242,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;
> diff --git a/grub-core/commands/parttool.c b/grub-core/commands/parttool.c
> index 693e2cb..22b46b1 100644
> --- a/grub-core/commands/parttool.c
> +++ b/grub-core/commands/parttool.c
> @@ -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;
> diff --git a/grub-core/commands/search.c b/grub-core/commands/search.c
> index 7dd32e4..ddda6e7 100644
> --- a/grub-core/commands/search.c
> +++ b/grub-core/commands/search.c
> @@ -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;
> diff --git a/grub-core/commands/test.c b/grub-core/commands/test.c
> index 5f06642..13c6ed9 100644
> --- a/grub-core/commands/test.c
> +++ b/grub-core/commands/test.c
> @@ -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);
> diff --git a/grub-core/commands/testload.c b/grub-core/commands/testload.c
> index cfab6763..ff01a05 100644
> --- a/grub-core/commands/testload.c
> +++ b/grub-core/commands/testload.c
> @@ -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;
>  
> diff --git a/grub-core/commands/testspeed.c b/grub-core/commands/testspeed.c
> index 042645f..c13a9b8 100644
> --- a/grub-core/commands/testspeed.c
> +++ b/grub-core/commands/testspeed.c
> @@ -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;
>  
> diff --git a/grub-core/commands/verify.c b/grub-core/commands/verify.c
> index 67cb1c7..3616318 100644
> --- a/grub-core/commands/verify.c
> +++ b/grub-core/commands/verify.c
> @@ -680,10 +680,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);
> @@ -771,10 +773,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);
> @@ -786,16 +790,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;
> @@ -858,33 +862,32 @@ 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;
>    grub_verified_t verified;
>  
> +  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->dev->id == GRUB_DISK_DEVICE_MEMDISK_ID
>         || io->device->disk->dev->id == GRUB_DISK_DEVICE_PROCFS_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;
> @@ -892,7 +895,7 @@ grub_pubkey_open (grub_file_t io, const char *filename)
>    ret = grub_malloc (sizeof (*ret));
>    if (!ret)
>      {
> -      grub_file_close (sig);
> +      grub_free (fsuf);
>        return NULL;
>      }
>    *ret = *io;
> @@ -918,7 +921,7 @@ grub_pubkey_open (grub_file_t io, const char *filename)
>    if (!verified->buf)
>      {
>        grub_file_close (sig);
> -      grub_free (verified);
> +      verified_free (verified);
>        grub_free (ret);
>        return NULL;
>      }
> @@ -926,7 +929,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);
>        grub_file_close (sig);
>        verified_free (verified);
>        grub_free (ret);
> diff --git a/grub-core/disk/loopback.c b/grub-core/disk/loopback.c
> index 2d8deae..9406d93 100644
> --- a/grub-core/disk/loopback.c
> +++ b/grub-core/disk/loopback.c
> @@ -92,7 +92,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;
>  
> diff --git a/grub-core/efiemu/main.c b/grub-core/efiemu/main.c
> index f6813b1..a819347 100644
> --- a/grub-core/efiemu/main.c
> +++ b/grub-core/efiemu/main.c
> @@ -187,7 +187,7 @@ grub_efiemu_load_file (const char *filename)
>    grub_file_t file;
>    grub_err_t err;
>  
> -  file = grub_file_open (filename);
> +  file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE);
>    if (! file)
>      return grub_errno;
>  
> diff --git a/grub-core/font/font.c b/grub-core/font/font.c
> index 53d76a6..85a2925 100644
> --- a/grub-core/font/font.c
> +++ b/grub-core/font/font.c
> @@ -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)
> diff --git a/grub-core/fs/zfs/zfscrypt.c b/grub-core/fs/zfs/zfscrypt.c
> index 87eef62..1402e0b 100644
> --- a/grub-core/fs/zfs/zfscrypt.c
> +++ b/grub-core/fs/zfs/zfscrypt.c
> @@ -425,7 +425,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);
> diff --git a/grub-core/gettext/gettext.c b/grub-core/gettext/gettext.c
> index 4880cef..4d02e62 100644
> --- a/grub-core/gettext/gettext.c
> +++ b/grub-core/gettext/gettext.c
> @@ -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;
> diff --git a/grub-core/gfxmenu/theme_loader.c 
> b/grub-core/gfxmenu/theme_loader.c
> index 0297839..d6829bb 100644
> --- a/grub-core/gfxmenu/theme_loader.c
> +++ b/grub-core/gfxmenu/theme_loader.c
> @@ -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);
> diff --git a/grub-core/io/bufio.c b/grub-core/io/bufio.c
> index dbed647..1b59293 100644
> --- a/grub-core/io/bufio.c
> +++ b/grub-core/io/bufio.c
> @@ -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);
>  
> @@ -88,11 +89,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;
>  
> diff --git a/grub-core/io/gzio.c b/grub-core/io/gzio.c
> index 86ea8cf..7760d8b 100644
> --- a/grub-core/io/gzio.c
> +++ b/grub-core/io/gzio.c
> @@ -1156,11 +1156,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;
> diff --git a/grub-core/io/lzopio.c b/grub-core/io/lzopio.c
> index 7559c6c..84edf6d 100644
> --- a/grub-core/io/lzopio.c
> +++ b/grub-core/io/lzopio.c
> @@ -407,12 +407,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;
> diff --git a/grub-core/io/offset.c b/grub-core/io/offset.c
> index ebed0eb..ec8e232 100644
> --- a/grub-core/io/offset.c
> +++ b/grub-core/io/offset.c
> @@ -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)
> diff --git a/grub-core/io/xzio.c b/grub-core/io/xzio.c
> index a3536ad..42afeed 100644
> --- a/grub-core/io/xzio.c
> +++ b/grub-core/io/xzio.c
> @@ -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;
> diff --git a/grub-core/kern/dl.c b/grub-core/kern/dl.c
> index e394cd9..f8d58f0 100644
> --- a/grub-core/kern/dl.c
> +++ b/grub-core/kern/dl.c
> @@ -688,7 +688,7 @@ grub_dl_load_file (const char *filename)
>  
>    grub_boot_time ("Loading module %s", filename);
>  
> -  file = grub_file_open (filename);
> +  file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE);
>    if (! file)
>      return 0;
>  
> diff --git a/grub-core/kern/elf.c b/grub-core/kern/elf.c
> index 4f282c9..9d7149b 100644
> --- a/grub-core/kern/elf.c
> +++ b/grub-core/kern/elf.c
> @@ -136,12 +136,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;
>  
> diff --git a/grub-core/kern/file.c b/grub-core/kern/file.c
> index 668f893..6431542 100644
> --- a/grub-core/kern/file.c
> +++ b/grub-core/kern/file.c
> @@ -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;
> @@ -114,18 +113,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;
> +       }

This doesn't seem like it is related to adding file type information.
Was the setting of the name just something that was already missing/broken?

>        }
>    if (!file)
>      grub_file_close (last_file);
> -    
> -  grub_memcpy (grub_file_filters_enabled, grub_file_filters_all,
> -            sizeof (grub_file_filters_enabled));
>  
>    return file;
>  
> @@ -137,9 +138,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;
>  }
>  
> diff --git a/grub-core/lib/syslinux_parse.c b/grub-core/lib/syslinux_parse.c
> index 28ba3ae..c96d85e 100644
> --- a/grub-core/lib/syslinux_parse.c
> +++ b/grub-core/lib/syslinux_parse.c
> @@ -696,7 +696,7 @@ syslinux_parse_real (struct syslinux_menu *menu)
>    char *buf = NULL;
>    grub_err_t err = GRUB_ERR_NONE;
>  
> -  file = grub_file_open (menu->filename);
> +  file = grub_file_open (menu->filename, GRUB_FILE_TYPE_CONFIG);
>    if (!file)
>      return grub_errno;
>    while ((grub_free (buf), buf = grub_file_getline (file)))
> diff --git a/grub-core/loader/efi/chainloader.c 
> b/grub-core/loader/efi/chainloader.c
> index adc8563..f706b1a 100644
> --- a/grub-core/loader/efi/chainloader.c
> +++ b/grub-core/loader/efi/chainloader.c
> @@ -219,7 +219,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;
>  
> diff --git a/grub-core/loader/i386/bsd.c b/grub-core/loader/i386/bsd.c
> index 7f96515..d34da14 100644
> --- a/grub-core/loader/i386/bsd.c
> +++ b/grub-core/loader/i386/bsd.c
> @@ -1457,7 +1457,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;
>  
> @@ -1534,7 +1534,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;
>  
> @@ -1693,7 +1693,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;
>  
> @@ -1802,7 +1802,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;
>  
> @@ -1907,7 +1907,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;
>  
> @@ -1958,7 +1958,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;
>  
> @@ -2048,7 +2048,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)
> @@ -2088,7 +2088,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;
>  
> diff --git a/grub-core/loader/i386/coreboot/chainloader.c 
> b/grub-core/loader/i386/coreboot/chainloader.c
> index 2cb78ee..0a19ebb 100644
> --- a/grub-core/loader/i386/coreboot/chainloader.c
> +++ b/grub-core/loader/i386/coreboot/chainloader.c
> @@ -439,7 +439,7 @@ grub_cmd_chain (grub_command_t cmd __attribute__ 
> ((unused)),
>  
>    grub_loader_unset ();
>  
> -  file = grub_file_open (argv[0]);
> +  file = grub_file_open (argv[0], GRUB_FILE_TYPE_COREBOOT_CHAINLOADER);
>    if (!file)
>      return grub_errno;
>  
> diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c
> index 4eab55a..b4e40ac 100644
> --- a/grub-core/loader/i386/linux.c
> +++ b/grub-core/loader/i386/linux.c
> @@ -652,7 +652,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;
>  
> diff --git a/grub-core/loader/i386/pc/chainloader.c 
> b/grub-core/loader/i386/pc/chainloader.c
> index ef3a322..976fea7 100644
> --- a/grub-core/loader/i386/pc/chainloader.c
> +++ b/grub-core/loader/i386/pc/chainloader.c
> @@ -172,8 +172,8 @@ grub_chainloader_cmd (const char *filename, 
> grub_chainloader_flags_t flags)
>  
>    grub_dl_ref (my_mod);
>  
> -  grub_file_filter_disable_compression ();
> -  file = grub_file_open (filename);
> +  file = grub_file_open (filename, GRUB_FILE_TYPE_PCCHAINLOADER
> +                      | GRUB_FILE_TYPE_NO_DECOMPRESS);
>    if (! file)
>      goto fail;
>  
> diff --git a/grub-core/loader/i386/pc/freedos.c 
> b/grub-core/loader/i386/pc/freedos.c
> index 478f3c5..aac6c97 100644
> --- a/grub-core/loader/i386/pc/freedos.c
> +++ b/grub-core/loader/i386/pc/freedos.c
> @@ -110,7 +110,7 @@ grub_cmd_freedos (grub_command_t cmd __attribute__ 
> ((unused)),
>    if (!rel)
>      goto fail;
>  
> -  file = grub_file_open (argv[0]);
> +  file = grub_file_open (argv[0], GRUB_FILE_TYPE_FREEDOS);
>    if (! file)
>      goto fail;
>  
> diff --git a/grub-core/loader/i386/pc/linux.c 
> b/grub-core/loader/i386/pc/linux.c
> index 531b58d..0a5aa0c 100644
> --- a/grub-core/loader/i386/pc/linux.c
> +++ b/grub-core/loader/i386/pc/linux.c
> @@ -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;
>  
> diff --git a/grub-core/loader/i386/pc/ntldr.c 
> b/grub-core/loader/i386/pc/ntldr.c
> index 1b88f40..f0d7414 100644
> --- a/grub-core/loader/i386/pc/ntldr.c
> +++ b/grub-core/loader/i386/pc/ntldr.c
> @@ -90,7 +90,7 @@ grub_cmd_ntldr (grub_command_t cmd __attribute__ ((unused)),
>    if (!rel)
>      goto fail;
>  
> -  file = grub_file_open (argv[0]);
> +  file = grub_file_open (argv[0], GRUB_FILE_TYPE_NTLDR);
>    if (! file)
>      goto fail;
>  
> diff --git a/grub-core/loader/i386/pc/plan9.c 
> b/grub-core/loader/i386/pc/plan9.c
> index 814a49d..0351090 100644
> --- a/grub-core/loader/i386/pc/plan9.c
> +++ b/grub-core/loader/i386/pc/plan9.c
> @@ -413,7 +413,7 @@ grub_cmd_plan9 (grub_extcmd_context_t ctxt, int argc, 
> char *argv[])
>    if (!rel)
>      goto fail;
>  
> -  fill_ctx.file = grub_file_open (argv[0]);
> +  fill_ctx.file = grub_file_open (argv[0], GRUB_FILE_TYPE_PLAN9_KERNEL);
>    if (! fill_ctx.file)
>      goto fail;
>  
> diff --git a/grub-core/loader/i386/pc/pxechainloader.c 
> b/grub-core/loader/i386/pc/pxechainloader.c
> index e60c62b..acb0611 100644
> --- a/grub-core/loader/i386/pc/pxechainloader.c
> +++ b/grub-core/loader/i386/pc/pxechainloader.c
> @@ -99,7 +99,7 @@ grub_cmd_pxechain (grub_command_t cmd __attribute__ 
> ((unused)),
>    if (!rel)
>      goto fail;
>  
> -  file = grub_file_open (argv[0]);
> +  file = grub_file_open (argv[0], GRUB_FILE_TYPE_PXECHAINLOADER);
>    if (! file)
>      goto fail;
>  
> diff --git a/grub-core/loader/i386/pc/truecrypt.c 
> b/grub-core/loader/i386/pc/truecrypt.c
> index 9ea4fde..cbeeec7 100644
> --- a/grub-core/loader/i386/pc/truecrypt.c
> +++ b/grub-core/loader/i386/pc/truecrypt.c
> @@ -99,7 +99,7 @@ grub_cmd_truecrypt (grub_command_t cmd __attribute__ 
> ((unused)),
>  
>    grub_dl_ref (my_mod);
>  
> -  file = grub_file_open (argv[0]);
> +  file = grub_file_open (argv[0], GRUB_FILE_TYPE_TRUECRYPT);
>    if (! file)
>      goto fail;
>  
> diff --git a/grub-core/loader/i386/xen.c b/grub-core/loader/i386/xen.c
> index 3073f64..85cc8d9 100644
> --- a/grub-core/loader/i386/xen.c
> +++ b/grub-core/loader/i386/xen.c
> @@ -648,7 +648,7 @@ grub_cmd_xen (grub_command_t cmd __attribute__ ((unused)),
>                             (char *) xen_state.next_start.cmd_line,
>                             sizeof (xen_state.next_start.cmd_line) - 1);
>  
> -  file = grub_file_open (argv[0]);
> +  file = grub_file_open (argv[0], GRUB_FILE_TYPE_LINUX_KERNEL);
>    if (!file)
>      return grub_errno;
>  
> @@ -893,9 +893,8 @@ grub_cmd_module (grub_command_t cmd __attribute__ 
> ((unused)),
>  
>    xen_state.max_addr = ALIGN_UP (xen_state.max_addr, PAGE_SIZE);
>  
> -  if (nounzip)
> -    grub_file_filter_disable_compression ();
> -  file = grub_file_open (argv[0]);
> +  file = grub_file_open (argv[0], GRUB_FILE_TYPE_LINUX_INITRD |
> +                      (nounzip ? GRUB_FILE_TYPE_NO_DECOMPRESS : 0));
>    if (!file)
>      return grub_errno;
>    size = grub_file_size (file);
> diff --git a/grub-core/loader/i386/xen_file.c 
> b/grub-core/loader/i386/xen_file.c
> index 77a93e7..9af5d66 100644
> --- a/grub-core/loader/i386/xen_file.c
> +++ b/grub-core/loader/i386/xen_file.c
> @@ -78,7 +78,7 @@ grub_xen_file (grub_file_t file)
>       Trim it.  */
>    if (grub_memcmp (magic, XZ_MAGIC, sizeof (XZ_MAGIC) - 1) == 0)
>      payload_length -= 4;
> -  off_file = grub_file_offset_open (file, payload_offset,
> +  off_file = grub_file_offset_open (file, GRUB_FILE_TYPE_LINUX_KERNEL, 
> payload_offset,
>                                   payload_length);
>    if (!off_file)
>      goto fail;
> diff --git a/grub-core/loader/i386/xnu.c b/grub-core/loader/i386/xnu.c
> index 59ef73a..e64ed08 100644
> --- a/grub-core/loader/i386/xnu.c
> +++ b/grub-core/loader/i386/xnu.c
> @@ -487,7 +487,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);
> diff --git a/grub-core/loader/linux.c b/grub-core/loader/linux.c
> index be6fa0f..471b214 100644
> --- a/grub-core/loader/linux.c
> +++ b/grub-core/loader/linux.c
> @@ -173,7 +173,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)
>               {
> @@ -198,8 +197,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);
> diff --git a/grub-core/loader/macho.c b/grub-core/loader/macho.c
> index 59b195e..085f9c6 100644
> --- a/grub-core/loader/macho.c
> +++ b/grub-core/loader/macho.c
> @@ -188,12 +188,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;
>  
> diff --git a/grub-core/loader/mips/linux.c b/grub-core/loader/mips/linux.c
> index 5f383be..7b28ba7 100644
> --- a/grub-core/loader/mips/linux.c
> +++ b/grub-core/loader/mips/linux.c
> @@ -237,7 +237,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ 
> ((unused)),
>    if (argc == 0)
>      return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
>  
> -  elf = grub_elf_open (argv[0]);
> +  elf = grub_elf_open (argv[0], GRUB_FILE_TYPE_LINUX_KERNEL);
>    if (! elf)
>      return grub_errno;
>  
> diff --git a/grub-core/loader/multiboot.c b/grub-core/loader/multiboot.c
> index 40c67e8..5fbec33 100644
> --- a/grub-core/loader/multiboot.c
> +++ b/grub-core/loader/multiboot.c
> @@ -321,7 +321,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;
>  
> @@ -387,10 +387,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;
>  
> diff --git a/grub-core/loader/xnu.c b/grub-core/loader/xnu.c
> index c9885b1..84c8b93 100644
> --- a/grub-core/loader/xnu.c
> +++ b/grub-core/loader/xnu.c
> @@ -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;
> @@ -771,7 +771,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;
>  
> @@ -885,7 +885,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;
>  
> @@ -925,7 +925,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;
>  
> @@ -1210,7 +1210,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;
>  
> @@ -1253,7 +1253,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;
>       }
> diff --git a/grub-core/loader/xnu_resume.c b/grub-core/loader/xnu_resume.c
> index 534a744..8089804 100644
> --- a/grub-core/loader/xnu_resume.c
> +++ b/grub-core/loader/xnu_resume.c
> @@ -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;
>  
> diff --git a/grub-core/normal/autofs.c b/grub-core/normal/autofs.c
> index 721b9c3..7a7cf2b 100644
> --- a/grub-core/normal/autofs.c
> +++ b/grub-core/normal/autofs.c
> @@ -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.  */
> diff --git a/grub-core/normal/crypto.c b/grub-core/normal/crypto.c
> index e6d345f..d01e6f2 100644
> --- a/grub-core/normal/crypto.c
> +++ b/grub-core/normal/crypto.c
> @@ -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)
>      {
> diff --git a/grub-core/normal/dyncmd.c b/grub-core/normal/dyncmd.c
> index 169c126..719ebf4 100644
> --- a/grub-core/normal/dyncmd.c
> +++ b/grub-core/normal/dyncmd.c
> @@ -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;
> diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c
> index 78a70a8..1b03dfd 100644
> --- a/grub-core/normal/main.c
> +++ b/grub-core/normal/main.c
> @@ -123,7 +123,7 @@ read_config_file (const char *config)
>      }
>  
>    /* Try to open the config file.  */
> -  rawfile = grub_file_open (config);
> +  rawfile = grub_file_open (config, GRUB_FILE_TYPE_CONFIG);
>    if (! rawfile)
>      return 0;
>  
> diff --git a/grub-core/normal/term.c b/grub-core/normal/term.c
> index ac5d69f..a1e5c5a 100644
> --- a/grub-core/normal/term.c
> +++ b/grub-core/normal/term.c
> @@ -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)
>      {
> diff --git a/grub-core/video/readers/jpeg.c b/grub-core/video/readers/jpeg.c
> index 21b0d9d..31359a4 100644
> --- a/grub-core/video/readers/jpeg.c
> +++ b/grub-core/video/readers/jpeg.c
> @@ -772,7 +772,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;
>  
> diff --git a/grub-core/video/readers/png.c b/grub-core/video/readers/png.c
> index e1a01e9..777e713 100644
> --- a/grub-core/video/readers/png.c
> +++ b/grub-core/video/readers/png.c
> @@ -1086,7 +1086,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;
>  
> diff --git a/grub-core/video/readers/tga.c b/grub-core/video/readers/tga.c
> index c7a16fa..7cb9d1d 100644
> --- a/grub-core/video/readers/tga.c
> +++ b/grub-core/video/readers/tga.c
> @@ -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;
>  
> diff --git a/include/grub/bufio.h b/include/grub/bufio.h
> index acdd0c8..0ff72d1 100644
> --- a/include/grub/bufio.h
> +++ b/include/grub/bufio.h
> @@ -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 */
> diff --git a/include/grub/elfload.h b/include/grub/elfload.h
> index 9a7ae4e..dbb609c 100644
> --- a/include/grub/elfload.h
> +++ b/include/grub/elfload.h
> @@ -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);
>  
> diff --git a/include/grub/file.h b/include/grub/file.h
> index 739488c..e2795d1 100644
> --- a/include/grub/file.h
> +++ b/include/grub/file.h
> @@ -25,6 +25,108 @@
>  #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_PLAN9_KERNEL,
> +
> +    GRUB_FILE_TYPE_NTLDR,
> +    GRUB_FILE_TYPE_TRUECRYPT,
> +    GRUB_FILE_TYPE_FREEDOS,
> +    GRUB_FILE_TYPE_PXECHAINLOADER,
> +    GRUB_FILE_TYPE_PCCHAINLOADER,
> +
> +    GRUB_FILE_TYPE_COREBOOT_CHAINLOADER,
> +
> +    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 = 0xffff,
> +
> +    /* --skip-sig is specified.  */
> +    GRUB_FILE_TYPE_SKIP_SIGNATURE = 0x10000,
> +    GRUB_FILE_TYPE_NO_DECOMPRESS = 0x20000,
> +  };
> +
>  /* File description.  */
>  struct grub_file
>  {
> @@ -77,61 +179,26 @@ 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 +226,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);
>  
> diff --git a/include/grub/machoload.h b/include/grub/machoload.h
> index 1eec118..f1157f4 100644
> --- a/include/grub/machoload.h
> +++ b/include/grub/machoload.h
> @@ -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);
> diff --git a/util/grub-fstest.c b/util/grub-fstest.c
> index a358ae4..f0a17d0 100644
> --- a/util/grub-fstest.c
> +++ b/util/grub-fstest.c
> @@ -120,9 +120,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,
> diff --git a/util/grub-mount.c b/util/grub-mount.c
> index a25db8a..e32b502 100644
> --- a/util/grub-mount.c
> +++ b/util/grub-mount.c
> @@ -208,7 +208,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;
> @@ -244,7 +244,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;
> @@ -308,7 +308,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)
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]