verifiers: File type for fine-grained signature-verification controlling

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 <phcoder@gmail.com>
Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com>
Reviewed-by: Ross Philipson <ross.philipson@oracle.com>
This commit is contained in:
Vladimir Serbinenko 2013-11-20 02:28:29 +01:00 committed by Daniel Kiper
parent f3f8347569
commit ca0a4f689a
70 changed files with 292 additions and 221 deletions

View file

@ -635,7 +635,7 @@ grub_cmd_acpi (struct grub_extcmd_context *ctxt, int argc, char **args)
grub_size_t size; grub_size_t size;
char *buf; char *buf;
file = grub_file_open (args[i]); file = grub_file_open (args[i], GRUB_FILE_TYPE_ACPI_TABLE);
if (! file) if (! file)
{ {
free_tables (); free_tables ();

View file

@ -121,8 +121,8 @@ grub_cmd_blocklist (grub_command_t cmd __attribute__ ((unused)),
if (argc < 1) if (argc < 1)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
grub_file_filter_disable_compression (); file = grub_file_open (args[0], GRUB_FILE_TYPE_PRINT_BLOCKLIST
file = grub_file_open (args[0]); | GRUB_FILE_TYPE_NO_DECOMPRESS);
if (! file) if (! file)
return grub_errno; return grub_errno;

View file

@ -56,7 +56,7 @@ grub_cmd_cat (grub_extcmd_context_t ctxt, int argc, char **args)
if (argc != 1) if (argc != 1)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); 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) if (! file)
return grub_errno; return grub_errno;

View 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], grub_printf_ (N_("Compare file `%s' with `%s':\n"), args[0],
args[1]); args[1]);
file1 = grub_file_open (args[0]); file1 = grub_file_open (args[0], GRUB_FILE_TYPE_CMP);
file2 = grub_file_open (args[1]); file2 = grub_file_open (args[1], GRUB_FILE_TYPE_CMP);
if (! file1 || ! file2) if (! file1 || ! file2)
goto cleanup; goto cleanup;

View file

@ -169,7 +169,7 @@ grub_cmd_loadbios (grub_command_t cmd __attribute__ ((unused)),
if (argc > 1) if (argc > 1)
{ {
file = grub_file_open (argv[1]); file = grub_file_open (argv[1], GRUB_FILE_TYPE_VBE_DUMP);
if (! file) if (! file)
return grub_errno; return grub_errno;
@ -183,7 +183,7 @@ grub_cmd_loadbios (grub_command_t cmd __attribute__ ((unused)),
return grub_errno; return grub_errno;
} }
file = grub_file_open (argv[0]); file = grub_file_open (argv[0], GRUB_FILE_TYPE_VBE_DUMP);
if (! file) if (! file)
return grub_errno; return grub_errno;

View file

@ -165,7 +165,7 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
if (type == -1) if (type == -1)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "no type specified"); 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) if (!file)
return grub_errno; return grub_errno;
switch (type) switch (type)
@ -546,7 +546,8 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
case IS_XNU64: case IS_XNU64:
case IS_XNU32: 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) if (!macho)
break; break;
/* FIXME: more checks? */ /* FIXME: more checks? */

View file

@ -113,7 +113,7 @@ check_list (const gcry_md_spec_t *hash, const char *hashfilename,
if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN) if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
return grub_error (GRUB_ERR_BUG, "mdlen is too long"); 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) if (!hashlist)
return grub_errno; 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); filename = grub_xasprintf ("%s/%s", prefix, p);
if (!filename) if (!filename)
return grub_errno; return grub_errno;
if (!uncompress) file = grub_file_open (filename, GRUB_FILE_TYPE_TO_HASH
grub_file_filter_disable_compression (); | (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
file = grub_file_open (filename); : GRUB_FILE_TYPE_NONE));
grub_free (filename); grub_free (filename);
} }
else else
{ file = grub_file_open (p, GRUB_FILE_TYPE_TO_HASH
if (!uncompress) | (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
grub_file_filter_disable_compression (); : GRUB_FILE_TYPE_NONE));
file = grub_file_open (p);
}
if (!file) if (!file)
{ {
grub_file_close (hashlist); grub_file_close (hashlist);
@ -242,9 +240,9 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt,
grub_file_t file; grub_file_t file;
grub_err_t err; grub_err_t err;
unsigned j; unsigned j;
if (!uncompress) file = grub_file_open (args[i], GRUB_FILE_TYPE_TO_HASH
grub_file_filter_disable_compression (); | (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
file = grub_file_open (args[i]); : GRUB_FILE_TYPE_NONE));
if (!file) if (!file)
{ {
if (!keep) if (!keep)

View file

@ -90,7 +90,7 @@ grub_cmd_hexdump (grub_extcmd_context_t ctxt, int argc, char **args)
{ {
grub_file_t file; grub_file_t file;
file = grub_file_open (args[0]); file = grub_file_open (args[0], GRUB_FILE_TYPE_HEXCAT);
if (! file) if (! file)
return 0; return 0;

View file

@ -93,7 +93,7 @@ grub_cmd_play (grub_command_t cmd __attribute__ ((unused)),
grub_uint32_t tempo; grub_uint32_t tempo;
grub_file_t file; grub_file_t file;
file = grub_file_open (args[0]); file = grub_file_open (args[0], GRUB_FILE_TYPE_AUDIO);
if (! file) if (! file)
return grub_errno; return grub_errno;

View file

@ -220,7 +220,7 @@ grub_cmd_keymap (struct grub_command *cmd __attribute__ ((unused)),
else else
filename = argv[0]; filename = argv[0];
file = grub_file_open (filename); file = grub_file_open (filename, GRUB_FILE_TYPE_KEYBOARD_LAYOUT);
if (! file) if (! file)
goto fail; goto fail;

View file

@ -55,7 +55,7 @@ legacy_file (const char *filename)
if (!suffix) if (!suffix)
return grub_errno; return grub_errno;
file = grub_file_open (filename); file = grub_file_open (filename, GRUB_FILE_TYPE_CONFIG);
if (! file) if (! file)
{ {
grub_free (suffix); grub_free (suffix);

View file

@ -44,7 +44,8 @@ static const struct grub_arg_option options[] =
PUBKEY filter (that insists upon properly signed files) as well. PUBKEY PUBKEY filter (that insists upon properly signed files) as well. PUBKEY
filter is restored before the function returns. */ filter is restored before the function returns. */
static grub_file_t 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; grub_file_t file;
char *buf = 0; char *buf = 0;
@ -72,13 +73,7 @@ open_envblk_file (char *filename, int untrusted)
grub_strcpy (filename + len + 1, GRUB_ENVBLK_DEFCFG); grub_strcpy (filename + len + 1, GRUB_ENVBLK_DEFCFG);
} }
/* The filters that are disabled will be re-enabled by the call to file = grub_file_open (filename, type);
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);
grub_free (buf); grub_free (buf);
return file; return file;
@ -171,7 +166,10 @@ grub_cmd_load_env (grub_extcmd_context_t ctxt, int argc, char **args)
whitelist.list = args; whitelist.list = args;
/* state[0] is the -f flag; state[1] is the --skip-sig flag */ /* 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 : GRUB_FILE_TYPE_NONE));
if (! file) if (! file)
return grub_errno; return grub_errno;
@ -206,7 +204,10 @@ grub_cmd_list_env (grub_extcmd_context_t ctxt,
grub_file_t file; grub_file_t file;
grub_envblk_t envblk; 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 : GRUB_FILE_TYPE_NONE));
if (! file) if (! file)
return grub_errno; 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"); return grub_error (GRUB_ERR_BAD_ARGUMENT, "no variable is specified");
file = open_envblk_file ((state[0].set) ? state[0].arg : 0, 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) if (! file)
return grub_errno; return grub_errno;

View 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 /* XXX: For ext2fs symlinks are detected as files while they
should be reported as directories. */ should be reported as directories. */
grub_file_filter_disable_compression (); file = grub_file_open (pathname, GRUB_FILE_TYPE_GET_SIZE
file = grub_file_open (pathname); | GRUB_FILE_TYPE_NO_DECOMPRESS);
if (! file) if (! file)
{ {
grub_errno = 0; grub_errno = 0;
@ -234,8 +234,8 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
struct grub_dirhook_info info; struct grub_dirhook_info info;
grub_errno = 0; grub_errno = 0;
grub_file_filter_disable_compression (); file = grub_file_open (dirname, GRUB_FILE_TYPE_GET_SIZE
file = grub_file_open (dirname); | GRUB_FILE_TYPE_NO_DECOMPRESS);
if (! file) if (! file)
goto fail; goto fail;

View file

@ -43,7 +43,7 @@ grub_mini_cmd_cat (struct grub_command *cmd __attribute__ ((unused)),
if (argc < 1) if (argc < 1)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); 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) if (! file)
return grub_errno; return grub_errno;

View file

@ -242,7 +242,8 @@ grub_cmd_nativedisk (grub_command_t cmd __attribute__ ((unused)),
if (! filename) if (! filename)
goto fail; goto fail;
file = grub_file_open (filename); file = grub_file_open (filename,
GRUB_FILE_TYPE_GRUB_MODULE);
grub_free (filename); grub_free (filename);
if (! file) if (! file)
goto fail; goto fail;

View file

@ -193,7 +193,7 @@ grub_cmd_parttool (grub_command_t cmd __attribute__ ((unused)),
{ {
grub_file_t file; grub_file_t file;
file = grub_file_open (filename); file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
if (file) if (file)
{ {
char *buf = 0; char *buf = 0;

View file

@ -81,8 +81,8 @@ iterate_device (const char *name, void *data)
if (! buf) if (! buf)
return 1; return 1;
grub_file_filter_disable_compression (); file = grub_file_open (buf, GRUB_FILE_TYPE_FS_SEARCH
file = grub_file_open (buf); | GRUB_FILE_TYPE_NO_DECOMPRESS);
if (file) if (file)
{ {
found = 1; found = 1;

View file

@ -355,8 +355,8 @@ test_parse (char **args, int *argn, int argc)
if (grub_strcmp (args[*argn], "-s") == 0) if (grub_strcmp (args[*argn], "-s") == 0)
{ {
grub_file_t file; grub_file_t file;
grub_file_filter_disable_compression (); file = grub_file_open (args[*argn + 1], GRUB_FILE_TYPE_GET_SIZE
file = grub_file_open (args[*argn + 1]); | GRUB_FILE_TYPE_NO_DECOMPRESS);
update_val (file && (grub_file_size (file) != 0), &ctx); update_val (file && (grub_file_size (file) != 0), &ctx);
if (file) if (file)
grub_file_close (file); grub_file_close (file);

View file

@ -57,7 +57,7 @@ grub_cmd_testload (struct grub_command *cmd __attribute__ ((unused)),
if (argc < 1) if (argc < 1)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); 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) if (! file)
return grub_errno; return grub_errno;

View file

@ -61,7 +61,7 @@ grub_cmd_testspeed (grub_extcmd_context_t ctxt, int argc, char **args)
if (buffer == NULL) if (buffer == NULL)
return grub_errno; return grub_errno;
file = grub_file_open (args[0]); file = grub_file_open (args[0], GRUB_FILE_TYPE_TESTLOAD);
if (file == NULL) if (file == NULL)
goto quit; goto quit;

View file

@ -680,10 +680,12 @@ grub_cmd_trust (grub_extcmd_context_t ctxt,
if (argc < 1) if (argc < 1)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected")); return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
grub_file_filter_disable_compression (); pkf = grub_file_open (args[0],
if (ctxt->state[OPTION_SKIP_SIG].set) GRUB_FILE_TYPE_PUBLIC_KEY_TRUST
grub_file_filter_disable_pubkey (); | GRUB_FILE_TYPE_NO_DECOMPRESS
pkf = grub_file_open (args[0]); | (ctxt->state[OPTION_SKIP_SIG].set
? GRUB_FILE_TYPE_SKIP_SIGNATURE
: GRUB_FILE_TYPE_NONE));
if (!pkf) if (!pkf)
return grub_errno; return grub_errno;
pk = grub_load_public_key (pkf); pk = grub_load_public_key (pkf);
@ -771,10 +773,12 @@ grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
if (argc > 2) if (argc > 2)
{ {
grub_file_t pkf; grub_file_t pkf;
grub_file_filter_disable_compression (); pkf = grub_file_open (args[2],
if (ctxt->state[OPTION_SKIP_SIG].set) GRUB_FILE_TYPE_PUBLIC_KEY
grub_file_filter_disable_pubkey (); | GRUB_FILE_TYPE_NO_DECOMPRESS
pkf = grub_file_open (args[2]); | (ctxt->state[OPTION_SKIP_SIG].set
? GRUB_FILE_TYPE_SKIP_SIGNATURE
: GRUB_FILE_TYPE_NONE));
if (!pkf) if (!pkf)
return grub_errno; return grub_errno;
pk = grub_load_public_key (pkf); 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_close (pkf);
} }
grub_file_filter_disable_all (); f = grub_file_open (args[0], GRUB_FILE_TYPE_VERIFY_SIGNATURE);
f = grub_file_open (args[0]);
if (!f) if (!f)
{ {
err = grub_errno; err = grub_errno;
goto fail; 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) if (!sig)
{ {
err = grub_errno; err = grub_errno;
@ -858,33 +862,32 @@ struct grub_fs verified_fs =
}; };
static grub_file_t 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; grub_file_t sig;
char *fsuf, *ptr; char *fsuf, *ptr;
grub_err_t err; grub_err_t err;
grub_file_filter_t curfilt[GRUB_FILE_FILTER_MAX];
grub_file_t ret; grub_file_t ret;
grub_verified_t verified; 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) if (!sec)
return io; return io;
if (io->device->disk && if (io->device->disk &&
(io->device->disk->dev->id == GRUB_DISK_DEVICE_MEMDISK_ID (io->device->disk->dev->id == GRUB_DISK_DEVICE_MEMDISK_ID
|| io->device->disk->dev->id == GRUB_DISK_DEVICE_PROCFS_ID)) || io->device->disk->dev->id == GRUB_DISK_DEVICE_PROCFS_ID))
return io; return io;
fsuf = grub_malloc (grub_strlen (filename) + sizeof (".sig")); fsuf = grub_malloc (grub_strlen (io->name) + sizeof (".sig"));
if (!fsuf) if (!fsuf)
return NULL; return NULL;
ptr = grub_stpcpy (fsuf, filename); ptr = grub_stpcpy (fsuf, io->name);
grub_memcpy (ptr, ".sig", sizeof (".sig")); grub_memcpy (ptr, ".sig", sizeof (".sig"));
grub_memcpy (curfilt, grub_file_filters_enabled, sig = grub_file_open (fsuf, GRUB_FILE_TYPE_SIGNATURE);
sizeof (curfilt));
grub_file_filter_disable_all ();
sig = grub_file_open (fsuf);
grub_memcpy (grub_file_filters_enabled, curfilt,
sizeof (curfilt));
grub_free (fsuf); grub_free (fsuf);
if (!sig) if (!sig)
return NULL; return NULL;
@ -918,7 +921,7 @@ grub_pubkey_open (grub_file_t io, const char *filename)
if (!verified->buf) if (!verified->buf)
{ {
grub_file_close (sig); grub_file_close (sig);
grub_free (verified); verified_free (verified);
grub_free (ret); grub_free (ret);
return NULL; return NULL;
} }
@ -926,7 +929,7 @@ grub_pubkey_open (grub_file_t io, const char *filename)
{ {
if (!grub_errno) if (!grub_errno)
grub_error (GRUB_ERR_FILE_READ_ERROR, N_("premature end of file %s"), grub_error (GRUB_ERR_FILE_READ_ERROR, N_("premature end of file %s"),
filename); io->name);
grub_file_close (sig); grub_file_close (sig);
verified_free (verified); verified_free (verified);
grub_free (ret); grub_free (ret);

View file

@ -92,7 +92,8 @@ grub_cmd_loopback (grub_extcmd_context_t ctxt, int argc, char **args)
if (argc < 2) if (argc < 2)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); 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) if (! file)
return grub_errno; return grub_errno;

View file

@ -187,7 +187,7 @@ grub_efiemu_load_file (const char *filename)
grub_file_t file; grub_file_t file;
grub_err_t err; grub_err_t err;
file = grub_file_open (filename); file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE);
if (! file) if (! file)
return grub_errno; return grub_errno;

View file

@ -418,7 +418,7 @@ grub_font_load (const char *filename)
#endif #endif
if (filename[0] == '(' || filename[0] == '/' || filename[0] == '+') if (filename[0] == '(' || filename[0] == '/' || filename[0] == '+')
file = grub_buffile_open (filename, 1024); file = grub_buffile_open (filename, GRUB_FILE_TYPE_FONT, 1024);
else else
{ {
const char *prefix = grub_env_get ("prefix"); 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, filename);
ptr = grub_stpcpy (ptr, ".pf2"); ptr = grub_stpcpy (ptr, ".pf2");
*ptr = 0; *ptr = 0;
file = grub_buffile_open (fullname, 1024); file = grub_buffile_open (fullname, GRUB_FILE_TYPE_FONT, 1024);
grub_free (fullname); grub_free (fullname);
} }
if (!file) if (!file)

View file

@ -425,7 +425,7 @@ grub_cmd_zfs_key (grub_extcmd_context_t ctxt, int argc, char **args)
if (argc > 0) if (argc > 0)
{ {
grub_file_t file; grub_file_t file;
file = grub_file_open (args[0]); file = grub_file_open (args[0], GRUB_FILE_TYPE_ZFS_ENCRYPTION_KEY);
if (!file) if (!file)
return grub_errno; return grub_errno;
real_size = grub_file_read (file, buf, 1024); real_size = grub_file_read (file, buf, 1024);

View file

@ -291,7 +291,7 @@ grub_mofile_open (struct grub_gettext_context *ctx,
/* Using fd_mo and not another variable because /* Using fd_mo and not another variable because
it's needed for grub_gettext_get_info. */ 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) if (!fd)
return grub_errno; return grub_errno;

View file

@ -743,7 +743,7 @@ grub_gfxmenu_view_load_theme (grub_gfxmenu_view_t view, const char *theme_path)
p.view = view; p.view = view;
p.theme_dir = grub_get_dirname (theme_path); 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) if (! file)
{ {
grub_free (p.theme_dir); grub_free (p.theme_dir);

View file

@ -88,11 +88,11 @@ grub_bufio_open (grub_file_t io, grub_size_t size)
} }
grub_file_t grub_file_t
grub_buffile_open (const char *name, grub_size_t size) grub_buffile_open (const char *name, enum grub_file_type type, grub_size_t size)
{ {
grub_file_t io, file; grub_file_t io, file;
io = grub_file_open (name); io = grub_file_open (name, type);
if (! io) if (! io)
return 0; return 0;

View file

@ -1156,11 +1156,14 @@ initialize_tables (grub_gzio_t gzio)
even if IO does not contain data compressed by gzip, return a valid file 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. */ object. Note that this function won't close IO, even if an error occurs. */
static grub_file_t 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_file_t file;
grub_gzio_t gzio = 0; grub_gzio_t gzio = 0;
if (type & GRUB_FILE_TYPE_NO_DECOMPRESS)
return io;
file = (grub_file_t) grub_zalloc (sizeof (*file)); file = (grub_file_t) grub_zalloc (sizeof (*file));
if (! file) if (! file)
return 0; return 0;

View file

@ -407,12 +407,14 @@ CORRUPTED:
} }
static grub_file_t static grub_file_t
grub_lzopio_open (grub_file_t io, grub_lzopio_open (grub_file_t io, enum grub_file_type type)
const char *name __attribute__ ((unused)))
{ {
grub_file_t file; grub_file_t file;
grub_lzopio_t lzopio; grub_lzopio_t lzopio;
if (type & GRUB_FILE_TYPE_NO_DECOMPRESS)
return io;
file = (grub_file_t) grub_zalloc (sizeof (*file)); file = (grub_file_t) grub_zalloc (sizeof (*file));
if (!file) if (!file)
return 0; return 0;

View file

@ -69,7 +69,8 @@ grub_file_offset_close (grub_file_t file)
} }
grub_file_t 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; struct grub_offset_file *off_data;
grub_file_t off_file, last_off_file; 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; last_off_file = NULL;
for (filter = GRUB_FILE_FILTER_COMPRESSION_FIRST; for (filter = GRUB_FILE_FILTER_COMPRESSION_FIRST;
off_file && filter <= GRUB_FILE_FILTER_COMPRESSION_LAST; filter++) 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; 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) if (!off_file)

View file

@ -169,12 +169,14 @@ ERROR:
} }
static grub_file_t static grub_file_t
grub_xzio_open (grub_file_t io, grub_xzio_open (grub_file_t io, enum grub_file_type type)
const char *name __attribute__ ((unused)))
{ {
grub_file_t file; grub_file_t file;
grub_xzio_t xzio; grub_xzio_t xzio;
if (type & GRUB_FILE_TYPE_NO_DECOMPRESS)
return io;
file = (grub_file_t) grub_zalloc (sizeof (*file)); file = (grub_file_t) grub_zalloc (sizeof (*file));
if (!file) if (!file)
return 0; return 0;

View file

@ -688,7 +688,7 @@ grub_dl_load_file (const char *filename)
grub_boot_time ("Loading module %s", 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) if (! file)
return 0; return 0;

View file

@ -136,12 +136,12 @@ fail:
} }
grub_elf_t 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_file_t file;
grub_elf_t elf; grub_elf_t elf;
file = grub_file_open (name); file = grub_file_open (name, type);
if (! file) if (! file)
return 0; return 0;

View file

@ -28,8 +28,7 @@
void (*EXPORT_VAR (grub_grubnet_fini)) (void); 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[GRUB_FILE_FILTER_MAX];
grub_file_filter_t grub_file_filters_enabled[GRUB_FILE_FILTER_MAX];
/* Get the device part of the filename NAME. It is enclosed by parentheses. */ /* Get the device part of the filename NAME. It is enclosed by parentheses. */
char * char *
@ -59,7 +58,7 @@ grub_file_get_device_name (const char *name)
} }
grub_file_t 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_device_t device = 0;
grub_file_t file = 0, last_file = 0; grub_file_t file = 0, last_file = 0;
@ -114,19 +113,21 @@ grub_file_open (const char *name)
file->name = grub_strdup (name); file->name = grub_strdup (name);
grub_errno = GRUB_ERR_NONE; 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++) filter++)
if (grub_file_filters_enabled[filter]) if (grub_file_filters[filter])
{ {
last_file = file; 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) if (!file)
grub_file_close (last_file); grub_file_close (last_file);
grub_memcpy (grub_file_filters_enabled, grub_file_filters_all,
sizeof (grub_file_filters_enabled));
return file; return file;
fail: fail:
@ -137,9 +138,6 @@ grub_file_open (const char *name)
grub_free (file); grub_free (file);
grub_memcpy (grub_file_filters_enabled, grub_file_filters_all,
sizeof (grub_file_filters_enabled));
return 0; return 0;
} }

View file

@ -696,7 +696,7 @@ syslinux_parse_real (struct syslinux_menu *menu)
char *buf = NULL; char *buf = NULL;
grub_err_t err = GRUB_ERR_NONE; 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) if (!file)
return grub_errno; return grub_errno;
while ((grub_free (buf), buf = grub_file_getline (file))) while ((grub_free (buf), buf = grub_file_getline (file)))

View file

@ -219,7 +219,7 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
b = grub_efi_system_table->boot_services; 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) if (! file)
goto fail; goto fail;

View file

@ -1457,7 +1457,7 @@ grub_bsd_load (int argc, char *argv[])
goto fail; goto fail;
} }
file = grub_file_open (argv[0]); file = grub_file_open (argv[0], GRUB_FILE_TYPE_BSD_KERNEL);
if (!file) if (!file)
goto fail; goto fail;
@ -1534,7 +1534,7 @@ grub_cmd_freebsd (grub_extcmd_context_t ctxt, int argc, char *argv[])
if (err) if (err)
return err; return err;
file = grub_file_open (argv[0]); file = grub_file_open (argv[0], GRUB_FILE_TYPE_BSD_KERNEL);
if (! file) if (! file)
return grub_errno; return grub_errno;
@ -1693,7 +1693,7 @@ grub_cmd_netbsd (grub_extcmd_context_t ctxt, int argc, char *argv[])
{ {
grub_file_t file; grub_file_t file;
file = grub_file_open (argv[0]); file = grub_file_open (argv[0], GRUB_FILE_TYPE_BSD_KERNEL);
if (! file) if (! file)
return grub_errno; return grub_errno;
@ -1802,7 +1802,7 @@ grub_cmd_freebsd_loadenv (grub_command_t cmd __attribute__ ((unused)),
goto fail; goto fail;
} }
file = grub_file_open (argv[0]); file = grub_file_open (argv[0], GRUB_FILE_TYPE_FREEBSD_ENV);
if ((!file) || (!file->size)) if ((!file) || (!file->size))
goto fail; goto fail;
@ -1907,7 +1907,7 @@ grub_cmd_freebsd_module (grub_command_t cmd __attribute__ ((unused)),
return 0; return 0;
} }
file = grub_file_open (argv[0]); file = grub_file_open (argv[0], GRUB_FILE_TYPE_FREEBSD_MODULE);
if ((!file) || (!file->size)) if ((!file) || (!file->size))
goto fail; goto fail;
@ -1958,7 +1958,7 @@ grub_netbsd_module_load (char *filename, grub_uint32_t type)
void *src; void *src;
grub_err_t err; grub_err_t err;
file = grub_file_open (filename); file = grub_file_open (filename, GRUB_FILE_TYPE_NETBSD_MODULE);
if ((!file) || (!file->size)) if ((!file) || (!file->size))
goto fail; goto fail;
@ -2048,7 +2048,7 @@ grub_cmd_freebsd_module_elf (grub_command_t cmd __attribute__ ((unused)),
return 0; return 0;
} }
file = grub_file_open (argv[0]); file = grub_file_open (argv[0], GRUB_FILE_TYPE_FREEBSD_MODULE_ELF);
if (!file) if (!file)
return grub_errno; return grub_errno;
if (!file->size) if (!file->size)
@ -2088,7 +2088,7 @@ grub_cmd_openbsd_ramdisk (grub_command_t cmd __attribute__ ((unused)),
if (!openbsd_ramdisk.max_size) if (!openbsd_ramdisk.max_size)
return grub_error (GRUB_ERR_BAD_OS, "your kOpenBSD doesn't support ramdisk"); 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) if (! file)
return grub_errno; return grub_errno;

View file

@ -439,7 +439,7 @@ grub_cmd_chain (grub_command_t cmd __attribute__ ((unused)),
grub_loader_unset (); grub_loader_unset ();
file = grub_file_open (argv[0]); file = grub_file_open (argv[0], GRUB_FILE_TYPE_COREBOOT_CHAINLOADER);
if (!file) if (!file)
return grub_errno; return grub_errno;

View file

@ -652,7 +652,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
goto fail; goto fail;
} }
file = grub_file_open (argv[0]); file = grub_file_open (argv[0], GRUB_FILE_TYPE_LINUX_KERNEL);
if (! file) if (! file)
goto fail; goto fail;

View file

@ -172,8 +172,8 @@ grub_chainloader_cmd (const char *filename, grub_chainloader_flags_t flags)
grub_dl_ref (my_mod); grub_dl_ref (my_mod);
grub_file_filter_disable_compression (); file = grub_file_open (filename, GRUB_FILE_TYPE_PCCHAINLOADER
file = grub_file_open (filename); | GRUB_FILE_TYPE_NO_DECOMPRESS);
if (! file) if (! file)
goto fail; goto fail;

View file

@ -110,7 +110,7 @@ grub_cmd_freedos (grub_command_t cmd __attribute__ ((unused)),
if (!rel) if (!rel)
goto fail; goto fail;
file = grub_file_open (argv[0]); file = grub_file_open (argv[0], GRUB_FILE_TYPE_FREEDOS);
if (! file) if (! file)
goto fail; goto fail;

View file

@ -139,7 +139,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
goto fail; goto fail;
} }
file = grub_file_open (argv[0]); file = grub_file_open (argv[0], GRUB_FILE_TYPE_LINUX_KERNEL);
if (! file) if (! file)
goto fail; goto fail;

View file

@ -90,7 +90,7 @@ grub_cmd_ntldr (grub_command_t cmd __attribute__ ((unused)),
if (!rel) if (!rel)
goto fail; goto fail;
file = grub_file_open (argv[0]); file = grub_file_open (argv[0], GRUB_FILE_TYPE_NTLDR);
if (! file) if (! file)
goto fail; goto fail;

View file

@ -413,7 +413,7 @@ grub_cmd_plan9 (grub_extcmd_context_t ctxt, int argc, char *argv[])
if (!rel) if (!rel)
goto fail; 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) if (! fill_ctx.file)
goto fail; goto fail;

View file

@ -99,7 +99,7 @@ grub_cmd_pxechain (grub_command_t cmd __attribute__ ((unused)),
if (!rel) if (!rel)
goto fail; goto fail;
file = grub_file_open (argv[0]); file = grub_file_open (argv[0], GRUB_FILE_TYPE_PXECHAINLOADER);
if (! file) if (! file)
goto fail; goto fail;

View file

@ -99,7 +99,7 @@ grub_cmd_truecrypt (grub_command_t cmd __attribute__ ((unused)),
grub_dl_ref (my_mod); grub_dl_ref (my_mod);
file = grub_file_open (argv[0]); file = grub_file_open (argv[0], GRUB_FILE_TYPE_TRUECRYPT);
if (! file) if (! file)
goto fail; goto fail;

View file

@ -648,7 +648,7 @@ grub_cmd_xen (grub_command_t cmd __attribute__ ((unused)),
(char *) xen_state.next_start.cmd_line, (char *) xen_state.next_start.cmd_line,
sizeof (xen_state.next_start.cmd_line) - 1); 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) if (!file)
return grub_errno; 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); xen_state.max_addr = ALIGN_UP (xen_state.max_addr, PAGE_SIZE);
if (nounzip) file = grub_file_open (argv[0], GRUB_FILE_TYPE_LINUX_INITRD |
grub_file_filter_disable_compression (); (nounzip ? GRUB_FILE_TYPE_NO_DECOMPRESS : GRUB_FILE_TYPE_NONE));
file = grub_file_open (argv[0]);
if (!file) if (!file)
return grub_errno; return grub_errno;
size = grub_file_size (file); size = grub_file_size (file);

View file

@ -78,7 +78,7 @@ grub_xen_file (grub_file_t file)
Trim it. */ Trim it. */
if (grub_memcmp (magic, XZ_MAGIC, sizeof (XZ_MAGIC) - 1) == 0) if (grub_memcmp (magic, XZ_MAGIC, sizeof (XZ_MAGIC) - 1) == 0)
payload_length -= 4; 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); payload_length);
if (!off_file) if (!off_file)
goto fail; goto fail;

View file

@ -487,7 +487,7 @@ grub_cmd_devprop_load (grub_command_t cmd __attribute__ ((unused)),
if (argc != 1) if (argc != 1)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); 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) if (! file)
return grub_errno; return grub_errno;
size = grub_file_size (file); size = grub_file_size (file);

View file

@ -173,7 +173,6 @@ grub_initrd_init (int argc, char *argv[],
eptr = grub_strchr (ptr, ':'); eptr = grub_strchr (ptr, ':');
if (eptr) if (eptr)
{ {
grub_file_filter_disable_compression ();
initrd_ctx->components[i].newc_name = grub_strndup (ptr, eptr - ptr); initrd_ctx->components[i].newc_name = grub_strndup (ptr, eptr - ptr);
if (!initrd_ctx->components[i].newc_name) if (!initrd_ctx->components[i].newc_name)
{ {
@ -198,8 +197,9 @@ grub_initrd_init (int argc, char *argv[],
root = 0; root = 0;
newc = 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) if (!initrd_ctx->components[i].file)
{ {
grub_initrd_close (initrd_ctx); grub_initrd_close (initrd_ctx);

View file

@ -188,12 +188,12 @@ fail:
} }
grub_macho_t 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_file_t file;
grub_macho_t macho; grub_macho_t macho;
file = grub_file_open (name); file = grub_file_open (name, type);
if (! file) if (! file)
return 0; return 0;

View file

@ -237,7 +237,7 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
if (argc == 0) if (argc == 0)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); 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) if (! elf)
return grub_errno; return grub_errno;

View file

@ -321,7 +321,7 @@ grub_cmd_multiboot (grub_command_t cmd __attribute__ ((unused)),
if (argc == 0) if (argc == 0)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); 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) if (! file)
return grub_errno; return grub_errno;
@ -387,10 +387,8 @@ grub_cmd_module (grub_command_t cmd __attribute__ ((unused)),
return grub_error (GRUB_ERR_BAD_ARGUMENT, return grub_error (GRUB_ERR_BAD_ARGUMENT,
N_("you need to load the kernel first")); N_("you need to load the kernel first"));
if (nounzip) file = grub_file_open (argv[0], GRUB_FILE_TYPE_MULTIBOOT_MODULE
grub_file_filter_disable_compression (); | (nounzip ? GRUB_FILE_TYPE_NO_DECOMPRESS : GRUB_FILE_TYPE_NONE));
file = grub_file_open (argv[0]);
if (! file) if (! file)
return grub_errno; return grub_errno;

View file

@ -351,7 +351,7 @@ grub_cmd_xnu_kernel (grub_command_t cmd __attribute__ ((unused)),
grub_xnu_unload (); grub_xnu_unload ();
macho = grub_macho_open (args[0], 0); macho = grub_macho_open (args[0], GRUB_FILE_TYPE_XNU_KERNEL, 0);
if (! macho) if (! macho)
return grub_errno; return grub_errno;
@ -456,7 +456,7 @@ grub_cmd_xnu_kernel64 (grub_command_t cmd __attribute__ ((unused)),
grub_xnu_unload (); grub_xnu_unload ();
macho = grub_macho_open (args[0], 1); macho = grub_macho_open (args[0], GRUB_FILE_TYPE_XNU_KERNEL, 1);
if (! macho) if (! macho)
return grub_errno; return grub_errno;
@ -674,7 +674,7 @@ grub_xnu_load_driver (char *infoplistname, grub_file_t binaryfile,
macho = 0; macho = 0;
if (infoplistname) if (infoplistname)
infoplist = grub_file_open (infoplistname); infoplist = grub_file_open (infoplistname, GRUB_FILE_TYPE_XNU_INFO_PLIST);
else else
infoplist = 0; infoplist = 0;
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
@ -771,7 +771,7 @@ grub_cmd_xnu_mkext (grub_command_t cmd __attribute__ ((unused)),
if (! grub_xnu_heap_size) if (! grub_xnu_heap_size)
return grub_error (GRUB_ERR_BAD_OS, N_("you need to load the kernel first")); 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) if (! file)
return grub_errno; return grub_errno;
@ -885,7 +885,7 @@ grub_cmd_xnu_ramdisk (grub_command_t cmd __attribute__ ((unused)),
if (! grub_xnu_heap_size) if (! grub_xnu_heap_size)
return grub_error (GRUB_ERR_BAD_OS, N_("you need to load the kernel first")); 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) if (! file)
return grub_errno; return grub_errno;
@ -925,7 +925,7 @@ grub_xnu_check_os_bundle_required (char *plistname,
if (binname) if (binname)
*binname = 0; *binname = 0;
file = grub_file_open (plistname); file = grub_file_open (plistname, GRUB_FILE_TYPE_XNU_INFO_PLIST);
if (! file) if (! file)
return 0; 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), "/");
grub_strcpy (binname + grub_strlen (binname), binsuffix); grub_strcpy (binname + grub_strlen (binname), binsuffix);
grub_dprintf ("xnu", "%s:%s\n", ctx.plistname, binname); 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) if (! binfile)
grub_errno = GRUB_ERR_NONE; 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. */ /* User explicitly specified plist and binary. */
if (grub_strcmp (args[1], "-") != 0) 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) if (! binfile)
return grub_errno; return grub_errno;
} }

View file

@ -53,8 +53,8 @@ grub_xnu_resume (char *imagename)
grub_addr_t target_image; grub_addr_t target_image;
grub_err_t err; grub_err_t err;
grub_file_filter_disable_compression (); file = grub_file_open (imagename, GRUB_FILE_TYPE_XNU_HIBERNATE_IMAGE
file = grub_file_open (imagename); | GRUB_FILE_TYPE_NO_DECOMPRESS);
if (! file) if (! file)
return 0; return 0;

View file

@ -33,12 +33,6 @@ autoload_fs_module (void)
{ {
grub_named_list_t p; grub_named_list_t p;
int ret = 0; 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) while ((p = fs_module_list) != NULL)
{ {
@ -56,9 +50,6 @@ autoload_fs_module (void)
grub_free (p); grub_free (p);
} }
grub_memcpy (grub_file_filters_enabled, grub_file_filters_was,
sizeof (grub_file_filters_enabled));
return ret; return ret;
} }
@ -82,7 +73,7 @@ read_fs_list (const char *prefix)
tmp_autoload_hook = grub_fs_autoload_hook; tmp_autoload_hook = grub_fs_autoload_hook;
grub_fs_autoload_hook = NULL; grub_fs_autoload_hook = NULL;
file = grub_file_open (filename); file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
if (file) if (file)
{ {
/* Override previous fs.lst. */ /* Override previous fs.lst. */

View file

@ -94,7 +94,7 @@ read_crypto_list (const char *prefix)
return; return;
} }
file = grub_file_open (filename); file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
grub_free (filename); grub_free (filename);
if (!file) if (!file)
{ {

View file

@ -106,7 +106,7 @@ read_command_list (const char *prefix)
{ {
grub_file_t file; grub_file_t file;
file = grub_file_open (filename); file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
if (file) if (file)
{ {
char *buf = NULL; char *buf = NULL;

View file

@ -123,7 +123,7 @@ read_config_file (const char *config)
} }
/* Try to open the config file. */ /* Try to open the config file. */
rawfile = grub_file_open (config); rawfile = grub_file_open (config, GRUB_FILE_TYPE_CONFIG);
if (! rawfile) if (! rawfile)
return 0; return 0;

View file

@ -331,7 +331,7 @@ read_terminal_list (const char *prefix)
return; return;
} }
file = grub_file_open (filename); file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
grub_free (filename); grub_free (filename);
if (!file) if (!file)
{ {

View file

@ -772,7 +772,7 @@ grub_video_reader_jpeg (struct grub_video_bitmap **bitmap,
grub_file_t file; grub_file_t file;
struct grub_jpeg_data *data; struct grub_jpeg_data *data;
file = grub_buffile_open (filename, 0); file = grub_buffile_open (filename, GRUB_FILE_TYPE_PIXMAP, 0);
if (!file) if (!file)
return grub_errno; return grub_errno;

View file

@ -1086,7 +1086,7 @@ grub_video_reader_png (struct grub_video_bitmap **bitmap,
grub_file_t file; grub_file_t file;
struct grub_png_data *data; struct grub_png_data *data;
file = grub_buffile_open (filename, 0); file = grub_buffile_open (filename, GRUB_FILE_TYPE_PIXMAP, 0);
if (!file) if (!file)
return grub_errno; return grub_errno;

View file

@ -297,7 +297,7 @@ grub_video_reader_tga (struct grub_video_bitmap **bitmap,
grub_memset (&data, 0, sizeof (data)); 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) if (! data.file)
return grub_errno; return grub_errno;

View file

@ -23,6 +23,8 @@
#include <grub/file.h> #include <grub/file.h>
grub_file_t EXPORT_FUNC (grub_bufio_open) (grub_file_t io, grub_size_t 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, 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 */ #endif /* ! GRUB_BUFIO_H */

View file

@ -42,7 +42,7 @@ typedef int (*grub_elf32_phdr_iterate_hook_t)
typedef int (*grub_elf64_phdr_iterate_hook_t) typedef int (*grub_elf64_phdr_iterate_hook_t)
(grub_elf_t elf, Elf64_Phdr *phdr, void *arg); (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_elf_t grub_elf_file (grub_file_t file, const char *filename);
grub_err_t grub_elf_close (grub_elf_t); grub_err_t grub_elf_close (grub_elf_t);

View file

@ -25,6 +25,109 @@
#include <grub/fs.h> #include <grub/fs.h>
#include <grub/disk.h> #include <grub/disk.h>
enum grub_file_type
{
GRUB_FILE_TYPE_NONE = 0,
/* 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. */ /* File description. */
struct grub_file struct grub_file
{ {
@ -77,61 +180,26 @@ typedef enum grub_file_filter_id
GRUB_FILE_FILTER_COMPRESSION_LAST = GRUB_FILE_FILTER_LZOPIO, GRUB_FILE_FILTER_COMPRESSION_LAST = GRUB_FILE_FILTER_LZOPIO,
} grub_file_filter_id_t; } 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)[GRUB_FILE_FILTER_MAX];
extern grub_file_filter_t EXPORT_VAR(grub_file_filters_enabled)[GRUB_FILE_FILTER_MAX];
static inline void static inline void
grub_file_filter_register (grub_file_filter_id_t id, grub_file_filter_t filter) grub_file_filter_register (grub_file_filter_id_t id, grub_file_filter_t filter)
{ {
grub_file_filters_all[id] = filter; grub_file_filters[id] = filter;
grub_file_filters_enabled[id] = filter;
} }
static inline void static inline void
grub_file_filter_unregister (grub_file_filter_id_t id) grub_file_filter_unregister (grub_file_filter_id_t id)
{ {
grub_file_filters_all[id] = 0; grub_file_filters[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;
} }
/* Get a device name from NAME. */ /* Get a device name from NAME. */
char *EXPORT_FUNC(grub_file_get_device_name) (const char *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_ssize_t EXPORT_FUNC(grub_file_read) (grub_file_t file, void *buf,
grub_size_t len); grub_size_t len);
grub_off_t EXPORT_FUNC(grub_file_seek) (grub_file_t file, grub_off_t offset); grub_off_t EXPORT_FUNC(grub_file_seek) (grub_file_t file, grub_off_t offset);
@ -159,8 +227,8 @@ grub_file_seekable (const grub_file_t file)
} }
grub_file_t grub_file_t
grub_file_offset_open (grub_file_t parent, grub_off_t start, grub_file_offset_open (grub_file_t parent, enum grub_file_type type,
grub_off_t size); grub_off_t start, grub_off_t size);
void void
grub_file_offset_close (grub_file_t file); grub_file_offset_close (grub_file_t file);

View file

@ -49,7 +49,8 @@ struct grub_macho_file
}; };
typedef struct grub_macho_file *grub_macho_t; 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, grub_macho_t grub_macho_file (grub_file_t file, const char *filename,
int is_64bit); int is_64bit);
grub_err_t grub_macho_close (grub_macho_t); grub_err_t grub_macho_close (grub_macho_t);

View file

@ -120,9 +120,9 @@ read_file (char *pathname, int (*hook) (grub_off_t ofs, char *buf, int len, void
return; return;
} }
if (uncompress == 0) file = grub_file_open (pathname, ((uncompress == 0)
grub_file_filter_disable_compression (); ? GRUB_FILE_TYPE_NO_DECOMPRESS : GRUB_FILE_TYPE_NONE)
file = grub_file_open (pathname); | GRUB_FILE_TYPE_FSTEST);
if (!file) if (!file)
{ {
grub_util_error (_("cannot open `%s': %s"), pathname, grub_util_error (_("cannot open `%s': %s"), pathname,

View file

@ -208,7 +208,7 @@ fuse_getattr (const char *path, struct stat *st)
if (!ctx.file_info.dir) if (!ctx.file_info.dir)
{ {
grub_file_t file; 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) if (! file && grub_errno == GRUB_ERR_BAD_FILE_TYPE)
{ {
grub_errno = GRUB_ERR_NONE; grub_errno = GRUB_ERR_NONE;
@ -244,7 +244,7 @@ static int
fuse_open (const char *path, struct fuse_file_info *fi __attribute__ ((unused))) fuse_open (const char *path, struct fuse_file_info *fi __attribute__ ((unused)))
{ {
grub_file_t file; grub_file_t file;
file = grub_file_open (path); file = grub_file_open (path, GRUB_FILE_TYPE_MOUNT);
if (! file) if (! file)
return translate_error (); return translate_error ();
files[first_fd++] = file; files[first_fd++] = file;
@ -308,7 +308,7 @@ fuse_readdir_call_fill (const char *filename,
grub_file_t file; grub_file_t file;
char *tmp; char *tmp;
tmp = xasprintf ("%s/%s", ctx->path, filename); tmp = xasprintf ("%s/%s", ctx->path, filename);
file = grub_file_open (tmp); file = grub_file_open (tmp, GRUB_FILE_TYPE_GET_SIZE);
free (tmp); free (tmp);
/* Symlink to directory. */ /* Symlink to directory. */
if (! file && grub_errno == GRUB_ERR_BAD_FILE_TYPE) if (! file && grub_errno == GRUB_ERR_BAD_FILE_TYPE)