grub-devel
[Top][All Lists]
Advanced

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

[PATCH 2/2] script: Add script language construct "builtin"


From: Glenn Washburn
Subject: [PATCH 2/2] script: Add script language construct "builtin"
Date: Sun, 21 Mar 2021 23:52:22 -0500

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 <development@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




reply via email to

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