diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c index 97687013c9..a2703dabb1 100644 --- a/grub-core/normal/menu.c +++ b/grub-core/normal/menu.c @@ -377,14 +377,14 @@ grub_menu_execute_entry(grub_menu_entry_t entry, int auto_boot) if (ptr && ptr[0] && ptr[1]) grub_env_set ("default", ptr + 1); - grub_script_execute_new_scope (entry->sourcecode, entry->argc, entry->args); + err = grub_script_execute_new_scope (entry->sourcecode, entry->argc, entry->args); if (errs_before != grub_err_printed_errors) grub_wait_after_message (); errs_before = grub_err_printed_errors; - if (grub_errno == GRUB_ERR_NONE && grub_loader_is_loaded ()) + if (err == GRUB_ERR_NONE && grub_loader_is_loaded ()) /* Implicit execution of boot, only if something is loaded. */ err = grub_command_execute ("boot", 0, 0); diff --git a/grub-core/script/execute.c b/grub-core/script/execute.c index 014132703d..3d26a3fe41 100644 --- a/grub-core/script/execute.c +++ b/grub-core/script/execute.c @@ -952,7 +952,10 @@ grub_script_execute_sourcecode (const char *source) break; } - ret = grub_script_execute (parsed_script); + /* Don't let trailing blank lines determine the return code. */ + if (parsed_script->cmd) + ret = grub_script_execute (parsed_script); + grub_script_free (parsed_script); grub_free (line); } diff --git a/tests/grub_script_eval.in b/tests/grub_script_eval.in index c97b78d77f..9c62110424 100644 --- a/tests/grub_script_eval.in +++ b/tests/grub_script_eval.in @@ -3,4 +3,12 @@ eval echo "Hello world" valname=tst eval $valname=hi -echo $tst \ No newline at end of file +echo $tst + +if eval " +false +"; then + echo should have failed +else + echo failed as expected +fi