BASH PATCH REPORT
			     =================

Bash-Release:	5.2
Patch-ID:	bash52-006

Bug-Reported-by:	feng xiangjun <fengxj325@gmail.com>
Bug-Reference-ID:	<CAHH2t87LrCmO=gdyWOmGn5WJt7EucL+iOXzrry34OETe50S6uA@mail.gmail.com>
Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2022-10/msg00089.html

Bug-Description:

In interactive shells, interrupting the shell while entering a command
substitution can inhibit alias expansion.

Patch (apply with `patch -p0'):

*** ../bash-5.2-patched/parse.y	2022-10-08 13:10:06.000000000 -0400
--- parse.y	2022-10-14 10:03:19.000000000 -0400
***************
*** 3307,3310 ****
--- 3307,3312 ----
      extended_glob = global_extglob;
  #endif
+   if (parser_state & (PST_CMDSUBST|PST_STRING))
+     expand_aliases = expaliases_flag;
  
    parser_state = 0;
***************
*** 4389,4392 ****
--- 4391,4395 ----
      parser_state |= PST_NOERROR;
  
+   parser_state |= PST_STRING;
    expand_aliases = 0;
  
***************
*** 6402,6406 ****
        parser_state &= ~PST_NOEXPAND;	/* parse_comsub sentinel */
        /* State flags we want to set for this run through the tokenizer. */
!       parser_state |= PST_COMPASSIGN|PST_REPARSE;
      }
  
--- 6405,6409 ----
        parser_state &= ~PST_NOEXPAND;	/* parse_comsub sentinel */
        /* State flags we want to set for this run through the tokenizer. */
!       parser_state |= PST_COMPASSIGN|PST_REPARSE|PST_STRING;
      }
  
*** ../bash-20221007/parser.h	2022-08-30 11:39:56.000000000 -0400
--- parser.h	2022-10-14 09:56:18.000000000 -0400
***************
*** 51,54 ****
--- 51,55 ----
  #define PST_NOEXPAND	0x400000	/* don't expand anything in read_token_word; for command substitution */
  #define PST_NOERROR	0x800000	/* don't print error messages in yyerror */
+ #define PST_STRING	0x1000000	/* parsing a string to a command or word list */
  
  /* Definition of the delimiter stack.  Needed by parse.y and bashhist.c. */
*** ../bash-20221007/builtins/shopt.def	2022-10-07 10:25:55.000000000 -0400
--- builtins/shopt.def	2022-10-14 09:30:11.000000000 -0400
***************
*** 150,153 ****
--- 150,156 ----
  #endif
  
+ int expaliases_flag = 0;
+ static int shopt_set_expaliases PARAMS((char *, int));
+ 
  static int shopt_set_debug_mode PARAMS((char *, int));
  
***************
*** 199,203 ****
    { "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL },
    { "execfail", &no_exit_on_failed_exec, (shopt_set_func_t *)NULL },
!   { "expand_aliases", &expand_aliases, (shopt_set_func_t *)NULL },
  #if defined (DEBUGGER)
    { "extdebug", &debugging_mode, shopt_set_debug_mode },
--- 202,206 ----
    { "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL },
    { "execfail", &no_exit_on_failed_exec, (shopt_set_func_t *)NULL },
!   { "expand_aliases", &expaliases_flag, shopt_set_expaliases },
  #if defined (DEBUGGER)
    { "extdebug", &debugging_mode, shopt_set_debug_mode },
***************
*** 351,355 ****
    allow_null_glob_expansion = glob_dot_filenames = 0;
    no_exit_on_failed_exec = 0;
!   expand_aliases = 0;
    extended_quote = 1;
    fail_glob_expansion = 0;
--- 354,358 ----
    allow_null_glob_expansion = glob_dot_filenames = 0;
    no_exit_on_failed_exec = 0;
!   expand_aliases = expaliases_flag = 0;
    extended_quote = 1;
    fail_glob_expansion = 0;
***************
*** 632,635 ****
--- 635,647 ----
  }
  
+ static int
+ shopt_set_expaliases (option_name, mode)
+      char *option_name;
+      int mode;
+ {
+   expand_aliases = expaliases_flag;
+   return 0;
+ }
+ 
  #if defined (READLINE)
  static int
*** ../bash-20221007/builtins/common.h	2022-10-07 10:10:17.000000000 -0400
--- builtins/common.h	2022-10-14 09:29:25.000000000 -0400
***************
*** 258,261 ****
--- 258,263 ----
  #endif
  
+ extern int expaliases_flag;
+ 
  /* variables from source.def */
  extern int source_searches_cwd;
*** ../bash-20221007/execute_cmd.c	2022-10-10 10:48:54.000000000 -0400
--- execute_cmd.c	2022-10-14 09:32:24.000000000 -0400
***************
*** 1537,1541 ****
  	 aliases. */
        if (ois != interactive_shell)
! 	expand_aliases = 0;
      }
  
--- 1537,1541 ----
  	 aliases. */
        if (ois != interactive_shell)
! 	expand_aliases = expaliases_flag = 0;
      }
  
*** ../bash-20221007/general.c	2021-11-04 14:12:38.000000000 -0400
--- general.c	2022-10-14 09:34:24.000000000 -0400
***************
*** 92,96 ****
    &interactive_comments,
    &source_uses_path,
!   &expand_aliases,
    &inherit_errexit,
    &print_shift_error,
--- 92,96 ----
    &interactive_comments,
    &source_uses_path,
!   &expaliases_flag,
    &inherit_errexit,
    &print_shift_error,
***************
*** 107,111 ****
    if (on != 0)
      {
!       interactive_comments = source_uses_path = expand_aliases = 1;
        inherit_errexit = 1;
        source_searches_cwd = 0;
--- 107,112 ----
    if (on != 0)
      {
!       interactive_comments = source_uses_path = 1;
!       expand_aliases = expaliases_flag = 1;
        inherit_errexit = 1;
        source_searches_cwd = 0;
***************
*** 117,120 ****
--- 118,122 ----
      {
        set_posix_options (saved_posix_vars);
+       expand_aliases = expaliases_flag;
        free (saved_posix_vars);
        saved_posix_vars = 0;
***************
*** 123,127 ****
      {
        source_searches_cwd = 1;
!       expand_aliases = interactive_shell;
        print_shift_error = 0;
      }
--- 125,129 ----
      {
        source_searches_cwd = 1;
!       expand_aliases = expaliases_flag = interactive_shell;	/* XXX */
        print_shift_error = 0;
      }

*** ../bash-5.2-patched/shell.c	2022-03-04 15:13:00.000000000 -0500
--- shell.c	2022-10-14 09:36:19.000000000 -0400
***************
*** 1845,1850 ****
  init_interactive ()
  {
!   expand_aliases = interactive_shell = startup_state = 1;
!   interactive = 1;
  #if defined (HISTORY)
    if (enable_history_list == -1)
--- 1845,1850 ----
  init_interactive ()
  {
!   expand_aliases = expaliases_flag = 1;
!   interactive_shell = startup_state = interactive = 1;
  #if defined (HISTORY)
    if (enable_history_list == -1)
***************
*** 1866,1870 ****
  #endif /* HISTORY */
    interactive_shell = startup_state = interactive = 0;
!   expand_aliases = posixly_correct;	/* XXX - was 0 not posixly_correct */
    no_line_editing = 1;
  #if defined (JOB_CONTROL)
--- 1866,1870 ----
  #endif /* HISTORY */
    interactive_shell = startup_state = interactive = 0;
!   expand_aliases = expaliases_flag = posixly_correct;	/* XXX - was 0 not posixly_correct */
    no_line_editing = 1;
  #if defined (JOB_CONTROL)
***************
*** 1883,1887 ****
  #endif
    init_noninteractive ();
!   expand_aliases = interactive_shell = startup_state = 1;
  #if defined (HISTORY)
    remember_on_history = enable_history_list;	/* XXX */
--- 1883,1887 ----
  #endif
    init_noninteractive ();
!   expand_aliases = expaliases_flag = interactive_shell = startup_state = 1;
  #if defined (HISTORY)
    remember_on_history = enable_history_list;	/* XXX */
***************
*** 2026,2030 ****
    forced_interactive = interactive_shell = 0;
    subshell_environment = running_in_background = 0;
!   expand_aliases = 0;
    bash_argv_initialized = 0;
  
--- 2026,2030 ----
    forced_interactive = interactive_shell = 0;
    subshell_environment = running_in_background = 0;
!   expand_aliases = expaliases_flag = 0;
    bash_argv_initialized = 0;
  
*** ../bash-5.2-patched/y.tab.c	2022-09-23 10:18:27.000000000 -0400
--- y.tab.c	2022-10-14 14:57:26.000000000 -0400
***************
*** 5618,5621 ****
--- 5618,5623 ----
      extended_glob = global_extglob;
  #endif
+   if (parser_state & (PST_CMDSUBST|PST_STRING))
+     expand_aliases = expaliases_flag;
  
    parser_state = 0;
***************
*** 6700,6703 ****
--- 6702,6706 ----
      parser_state |= PST_NOERROR;
  
+   parser_state |= PST_STRING;
    expand_aliases = 0;
  
***************
*** 8713,8717 ****
        parser_state &= ~PST_NOEXPAND;	/* parse_comsub sentinel */
        /* State flags we want to set for this run through the tokenizer. */
!       parser_state |= PST_COMPASSIGN|PST_REPARSE;
      }
  
--- 8716,8720 ----
        parser_state &= ~PST_NOEXPAND;	/* parse_comsub sentinel */
        /* State flags we want to set for this run through the tokenizer. */
!       parser_state |= PST_COMPASSIGN|PST_REPARSE|PST_STRING;
      }
  
*** ../bash-5.2/patchlevel.h	2020-06-22 14:51:03.000000000 -0400
--- patchlevel.h	2020-10-01 11:01:28.000000000 -0400
***************
*** 26,30 ****
     looks for to find the patch level (for the sccs version string). */
  
! #define PATCHLEVEL 5
  
  #endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
     looks for to find the patch level (for the sccs version string). */
  
! #define PATCHLEVEL 6
  
  #endif /* _PATCHLEVEL_H_ */