From: Chet Ramey Date: Thu, 1 Aug 2024 15:34:42 +0000 (-0400) Subject: Bash-5.2 patch 29: fix for error recovery when parsing invalid compound assignments X-Git-Tag: bash-5.3~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bc3e91dbec5d985b41b229f9b7cc9572ae624922;p=thirdparty%2Fbash.git Bash-5.2 patch 29: fix for error recovery when parsing invalid compound assignments --- diff --git a/parse.y b/parse.y index 8fd24a1c..78b49175 100644 --- a/parse.y +++ b/parse.y @@ -6470,10 +6470,15 @@ parse_string_to_word_list (s, flags, whom) if (wl == &parse_string_error) { set_exit_status (EXECUTION_FAILURE); + current_token = '\n'; /* XXX */ if (interactive_shell == 0 && posixly_correct) jump_to_top_level (FORCE_EOF); else - jump_to_top_level (DISCARD); + { + if (executing && parse_and_execute_level == 0) + top_level_cleanup (); + jump_to_top_level (DISCARD); + } } return (REVERSE_LIST (wl, WORD_LIST *)); @@ -6537,11 +6542,15 @@ parse_compound_assignment (retlenp) if (wl == &parse_string_error) { set_exit_status (EXECUTION_FAILURE); - last_read_token = '\n'; /* XXX */ + last_read_token = current_token = '\n'; /* XXX */ if (interactive_shell == 0 && posixly_correct) jump_to_top_level (FORCE_EOF); else - jump_to_top_level (DISCARD); + { + if (executing && parse_and_execute_level == 0) + top_level_cleanup (); + jump_to_top_level (DISCARD); + } } if (wl) diff --git a/patchlevel.h b/patchlevel.h index 7abb1edb..386e1197 100644 --- a/patchlevel.h +++ b/patchlevel.h @@ -25,6 +25,6 @@ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh looks for to find the patch level (for the sccs version string). */ -#define PATCHLEVEL 28 +#define PATCHLEVEL 29 #endif /* _PATCHLEVEL_H_ */ diff --git a/y.tab.c b/y.tab.c index 78c79306..793686e7 100644 --- a/y.tab.c +++ b/y.tab.c @@ -8785,10 +8785,15 @@ parse_string_to_word_list (s, flags, whom) if (wl == &parse_string_error) { set_exit_status (EXECUTION_FAILURE); + current_token = '\n'; /* XXX */ if (interactive_shell == 0 && posixly_correct) jump_to_top_level (FORCE_EOF); else - jump_to_top_level (DISCARD); + { + if (executing && parse_and_execute_level == 0) + top_level_cleanup (); + jump_to_top_level (DISCARD); + } } return (REVERSE_LIST (wl, WORD_LIST *)); @@ -8852,11 +8857,15 @@ parse_compound_assignment (retlenp) if (wl == &parse_string_error) { set_exit_status (EXECUTION_FAILURE); - last_read_token = '\n'; /* XXX */ + last_read_token = current_token = '\n'; /* XXX */ if (interactive_shell == 0 && posixly_correct) jump_to_top_level (FORCE_EOF); else - jump_to_top_level (DISCARD); + { + if (executing && parse_and_execute_level == 0) + top_level_cleanup (); + jump_to_top_level (DISCARD); + } } if (wl)