Provide a way to access builtin commands which have been hidden by a user- defined function of the same name.
Signed-off-by: Glenn Washburn <developm...@efficientek.com> --- Makefile.util.def | 6 ++++++ grub-core/script/execute.c | 27 ++++++++++++++++----------- tests/grub_cmd_builtin.in | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 11 deletions(-) create mode 100644 tests/grub_cmd_builtin.in diff --git a/Makefile.util.def b/Makefile.util.def index 756158ffd..877784279 100644 --- a/Makefile.util.def +++ b/Makefile.util.def @@ -1043,6 +1043,12 @@ script = { common = tests/grub_script_return.in; }; +script = { + testcase; + name = grub_cmd_builtin; + common = tests/grub_cmd_builtin.in; +}; + script = { testcase; name = grub_cmd_regexp; diff --git a/grub-core/script/execute.c b/grub-core/script/execute.c index 6ce8850ff..1128b1ba5 100644 --- a/grub-core/script/execute.c +++ b/grub-core/script/execute.c @@ -931,7 +931,7 @@ grub_err_t grub_script_execute_cmdline (struct grub_script_cmd *cmd) { struct grub_script_cmdline *cmdline = (struct grub_script_cmdline *) cmd; - grub_command_t grubcmd; + grub_command_t grubcmd = 0; grub_err_t ret = 0; grub_script_function_t func = 0; char errnobuf[18]; @@ -940,6 +940,7 @@ grub_script_execute_cmdline (struct grub_script_cmd *cmd) unsigned int i; char **args; int invert; + int builtin; struct grub_script_argv argv = { 0, 0, 0 }; /* Lookup the command. */ @@ -966,11 +967,10 @@ grub_script_execute_cmdline (struct grub_script_cmd *cmd) cmdstring[cmdlen - 1] = '\0'; grub_verify_string (cmdstring, GRUB_VERIFY_COMMAND); grub_free (cmdstring); - invert = 0; - argc = argv.argc - 1; - args = argv.args + 1; cmdname = argv.args[0]; - if (grub_strcmp (cmdname, "!") == 0) + invert = !grub_strcmp (cmdname, "!"); + builtin = !grub_strcmp (cmdname, "builtin"); + if (invert || builtin) { if (argv.argc < 2 || ! argv.args[1]) { @@ -979,14 +979,19 @@ grub_script_execute_cmdline (struct grub_script_cmd *cmd) N_("no command is specified")); } - invert = 1; - argc = argv.argc - 2; - args = argv.args + 2; - cmdname = argv.args[1]; + argc = argv.argc - (1 + invert + builtin); + args = argv.args + 1 + invert + builtin; + cmdname = argv.args[invert + builtin]; + } + else + { + argc = argv.argc - 1; + args = argv.args + 1; } /* Allow user functions to override built in commands. */ - func = grub_script_function_find (cmdname); - if (! func) + if (! builtin) + func = grub_script_function_find (cmdname); + if (! func || builtin) { grub_errno = GRUB_ERR_NONE; diff --git a/tests/grub_cmd_builtin.in b/tests/grub_cmd_builtin.in new file mode 100644 index 000000000..ec753e2df --- /dev/null +++ b/tests/grub_cmd_builtin.in @@ -0,0 +1,37 @@ +#! @BUILD_SHEBANG@ +set -e + +. "@builddir@/grub-core/modinfo.sh" + +function hook_insmod { + @builddir@/grub-shell <<EOF +insmod test +function insmod { + if [ "\$1" != "parttool" ]; then + builtin insmod "\$1" + fi +} +insmod "$1" +lsmod +EOF +} + +lsmod_original_file=`mktemp "${TMPDIR:-/tmp}/tmp.lsmod_original.XXXXXXXXXX"` || exit 1 +lsmod_hooked_file=`mktemp "${TMPDIR:-/tmp}/tmp.lsmod_hooked.XXXXXXXXXX"` || exit 1 + +echo 'insmod test; insmod luks; lsmod' | @builddir@/grub-shell >$lsmod_original_file +hook_insmod luks >$lsmod_hooked_file + +if ! cmp $lsmod_original_file $lsmod_hooked_file; then + echo "lsmod output not identical:" + diff -u $lsmod_original_file $lsmod_hooked_file + exit 1 +fi + + +hook_insmod parttool >$lsmod_hooked_file + +if grep -q ^parttool $lsmod_hooked_file; then + echo "parttool module was inserted, but should not have been" + exit 1 +fi -- 2.27.0 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel