]> git.ipfire.org Git - thirdparty/bash.git/blobdiff - builtins/evalstring.c
Bash-4.3 patch 30
[thirdparty/bash.git] / builtins / evalstring.c
index 21937bad7041d379d8dd095d850cfca89c935e67..0758c437199293494dd06bcb8823199c1f76cc25 100644 (file)
@@ -308,12 +308,25 @@ parse_and_execute (string, from_file, flags)
            {
              struct fd_bitmap *bitmap;
 
-             if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def)
+             if (flags & SEVAL_FUNCDEF)
                {
-                 internal_warning ("%s: ignoring function definition attempt", from_file);
-                 should_jump_to_top_level = 0;
-                 last_result = last_command_exit_value = EX_BADUSAGE;
-                 break;
+                 char *x;
+
+                 /* If the command parses to something other than a straight
+                    function definition, or if we have not consumed the entire
+                    string, or if the parser has transformed the function
+                    name (as parsing will if it begins or ends with shell
+                    whitespace, for example), reject the attempt */
+                 if (command->type != cm_function_def ||
+                     ((x = parser_remaining_input ()) && *x) ||
+                     (STREQ (from_file, command->value.Function_def->name->word) == 0))
+                   {
+                     internal_warning (_("%s: ignoring function definition attempt"), from_file);
+                     should_jump_to_top_level = 0;
+                     last_result = last_command_exit_value = EX_BADUSAGE;
+                     reset_parser ();
+                     break;
+                   }
                }
 
              bitmap = new_fd_bitmap (FD_BITMAP_SIZE);
@@ -378,7 +391,10 @@ parse_and_execute (string, from_file, flags)
              discard_unwind_frame ("pe_dispose");
 
              if (flags & SEVAL_ONECMD)
-               break;
+               {
+                 reset_parser ();
+                 break;
+               }
            }
        }
       else