Pete Graner 3797fb
			     BASH PATCH REPORT
Pete Graner 3797fb
			     =================
Pete Graner 3797fb
Pete Graner 3797fb
Bash-Release: 3.2
Pete Graner 3797fb
Patch-ID: bash32-020
Pete Graner 3797fb
Pete Graner 3797fb
Bug-Reported-by:	Ian A Watson <WATSON_IAN_A@LILLY.COM>
Pete Graner 3797fb
Bug-Reference-ID:	<OFEC551808.69D02C7F-ON8525729A.0045708D-8525729A.0046150B@EliLilly.lilly.com>
Pete Graner 3797fb
Bug-Reference-URL:
Pete Graner 3797fb
Pete Graner 3797fb
Bug-Description:
Pete Graner 3797fb
Pete Graner 3797fb
In some cases of error processing, a jump back to the top-level processing
Pete Graner 3797fb
loop from a builtin command  would leave the shell in an inconsistent state.
Pete Graner 3797fb
Pete Graner 3797fb
Patch:
Pete Graner 3797fb
Pete Graner 3797fb
*** ../bash-3.2-patched/sig.c	Wed Jan 25 14:57:59 2006
Pete Graner 3797fb
--- sig.c	Sat Mar 10 11:11:30 2007
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 351,354 ****
Pete Graner 3797fb
--- 351,373 ----
Pete Graner 3797fb
  #undef XHANDLER
Pete Graner 3797fb
  
Pete Graner 3797fb
+ /* Run some of the cleanups that should be performed when we run
Pete Graner 3797fb
+    jump_to_top_level from a builtin command context.  XXX - might want to
Pete Graner 3797fb
+    also call reset_parser here. */
Pete Graner 3797fb
+ void
Pete Graner 3797fb
+ top_level_cleanup ()
Pete Graner 3797fb
+ {
Pete Graner 3797fb
+   /* Clean up string parser environment. */
Pete Graner 3797fb
+   while (parse_and_execute_level)
Pete Graner 3797fb
+     parse_and_execute_cleanup ();
Pete Graner 3797fb
+ 
Pete Graner 3797fb
+ #if defined (PROCESS_SUBSTITUTION)
Pete Graner 3797fb
+   unlink_fifo_list ();
Pete Graner 3797fb
+ #endif /* PROCESS_SUBSTITUTION */
Pete Graner 3797fb
+ 
Pete Graner 3797fb
+   run_unwind_protects ();
Pete Graner 3797fb
+   loop_level = continuing = breaking = 0;
Pete Graner 3797fb
+   return_catch_flag = 0;
Pete Graner 3797fb
+ }
Pete Graner 3797fb
+ 
Pete Graner 3797fb
  /* What to do when we've been interrupted, and it is safe to handle it. */
Pete Graner 3797fb
  void
Pete Graner 3797fb
*** ../bash-3.2-patched/sig.h	Wed Jan 25 14:50:27 2006
Pete Graner 3797fb
--- sig.h	Sat Mar 10 11:14:18 2007
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 122,125 ****
Pete Graner 3797fb
--- 122,126 ----
Pete Graner 3797fb
  extern void initialize_terminating_signals __P((void));
Pete Graner 3797fb
  extern void reset_terminating_signals __P((void));
Pete Graner 3797fb
+ extern void top_level_cleanup __P((void));
Pete Graner 3797fb
  extern void throw_to_top_level __P((void));
Pete Graner 3797fb
  extern void jump_to_top_level __P((int)) __attribute__((__noreturn__));
Pete Graner 3797fb
*** ../bash-3.2-patched/builtins/common.c	Tue Apr  3 16:47:13 2007
Pete Graner 3797fb
--- builtins/common.c	Mon Apr 30 15:01:33 2007
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 132,135 ****
Pete Graner 3797fb
--- 132,136 ----
Pete Graner 3797fb
      {
Pete Graner 3797fb
        builtin_error (_("too many arguments"));
Pete Graner 3797fb
+       top_level_cleanup ();
Pete Graner 3797fb
        jump_to_top_level (DISCARD);
Pete Graner 3797fb
      }
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 396,400 ****
Pete Graner 3797fb
  	    throw_to_top_level ();
Pete Graner 3797fb
  	  else
Pete Graner 3797fb
! 	    jump_to_top_level (DISCARD);
Pete Graner 3797fb
  	}
Pete Graner 3797fb
        no_args (list->next);
Pete Graner 3797fb
--- 410,417 ----
Pete Graner 3797fb
  	    throw_to_top_level ();
Pete Graner 3797fb
  	  else
Pete Graner 3797fb
! 	    {
Pete Graner 3797fb
! 	      top_level_cleanup ();
Pete Graner 3797fb
! 	      jump_to_top_level (DISCARD);
Pete Graner 3797fb
! 	    }
Pete Graner 3797fb
  	}
Pete Graner 3797fb
        no_args (list->next);
Pete Graner 3797fb
*** ../bash-3.2-patched/subst.c	Tue Apr  3 16:47:19 2007
Pete Graner 3797fb
--- subst.c	Tue Jul 17 09:45:11 2007
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 1279,1283 ****
Pete Graner 3797fb
        if (no_longjmp_on_fatal_error == 0)
Pete Graner 3797fb
  	{			/* { */
Pete Graner 3797fb
! 	  report_error ("bad substitution: no closing `%s' in %s", "}", string);
Pete Graner 3797fb
  	  last_command_exit_value = EXECUTION_FAILURE;
Pete Graner 3797fb
  	  exp_jump_to_top_level (DISCARD);
Pete Graner 3797fb
--- 1290,1294 ----
Pete Graner 3797fb
        if (no_longjmp_on_fatal_error == 0)
Pete Graner 3797fb
  	{			/* { */
Pete Graner 3797fb
! 	  report_error (_("bad substitution: no closing `%s' in %s"), "}", string);
Pete Graner 3797fb
  	  last_command_exit_value = EXECUTION_FAILURE;
Pete Graner 3797fb
  	  exp_jump_to_top_level (DISCARD);
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 7662,7665 ****
Pete Graner 3797fb
--- 7706,7711 ----
Pete Graner 3797fb
    expand_no_split_dollar_star = 0;	/* XXX */
Pete Graner 3797fb
    expanding_redir = 0;
Pete Graner 3797fb
+ 
Pete Graner 3797fb
+   top_level_cleanup ();			/* from sig.c */
Pete Graner 3797fb
  
Pete Graner 3797fb
    jump_to_top_level (v);
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 7880,7884 ****
Pete Graner 3797fb
  	    {
Pete Graner 3797fb
  	      report_error (_("no match: %s"), tlist->word->word);
Pete Graner 3797fb
! 	      jump_to_top_level (DISCARD);
Pete Graner 3797fb
  	    }
Pete Graner 3797fb
  	  else if (allow_null_glob_expansion == 0)
Pete Graner 3797fb
--- 7927,7931 ----
Pete Graner 3797fb
  	    {
Pete Graner 3797fb
  	      report_error (_("no match: %s"), tlist->word->word);
Pete Graner 3797fb
! 	      exp_jump_to_top_level (DISCARD);
Pete Graner 3797fb
  	    }
Pete Graner 3797fb
  	  else if (allow_null_glob_expansion == 0)
Pete Graner 3797fb
*** ../bash-3.2-patched/arrayfunc.c	Thu Jul 27 09:37:59 2006
Pete Graner 3797fb
--- arrayfunc.c	Thu May 31 11:55:46 2007
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 619,622 ****
Pete Graner 3797fb
--- 619,624 ----
Pete Graner 3797fb
      {
Pete Graner 3797fb
        last_command_exit_value = EXECUTION_FAILURE;
Pete Graner 3797fb
+ 
Pete Graner 3797fb
+       top_level_cleanup ();      
Pete Graner 3797fb
        jump_to_top_level (DISCARD);
Pete Graner 3797fb
      }
Pete Graner 3797fb
*** ../bash-3.2-patched/expr.c	Wed Dec 28 17:47:03 2005
Pete Graner 3797fb
--- expr.c	Tue Apr 24 14:17:59 2007
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 930,933 ****
Pete Graner 3797fb
--- 930,934 ----
Pete Graner 3797fb
  	{
Pete Graner 3797fb
  	  expr_unwind ();
Pete Graner 3797fb
+ 	  top_level_cleanup ();
Pete Graner 3797fb
  	  jump_to_top_level (DISCARD);
Pete Graner 3797fb
  	}
Pete Graner 3797fb
*** ../bash-3.2-patched/variables.c	Fri Sep  8 13:33:32 2006
Pete Graner 3797fb
--- variables.c	Tue Jul 17 09:54:59 2007
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 1822,1830 ****
Pete Graner 3797fb
  	  lval = evalexp (oval, &expok;;	/* ksh93 seems to do this */
Pete Graner 3797fb
  	  if (expok == 0)
Pete Graner 3797fb
! 	    jump_to_top_level (DISCARD);
Pete Graner 3797fb
  	}
Pete Graner 3797fb
        rval = evalexp (value, &expok;;
Pete Graner 3797fb
        if (expok == 0)
Pete Graner 3797fb
! 	jump_to_top_level (DISCARD);
Pete Graner 3797fb
        if (flags & ASS_APPEND)
Pete Graner 3797fb
  	rval += lval;
Pete Graner 3797fb
--- 1855,1869 ----
Pete Graner 3797fb
  	  lval = evalexp (oval, &expok;;	/* ksh93 seems to do this */
Pete Graner 3797fb
  	  if (expok == 0)
Pete Graner 3797fb
! 	    {
Pete Graner 3797fb
! 	      top_level_cleanup ();
Pete Graner 3797fb
! 	      jump_to_top_level (DISCARD);
Pete Graner 3797fb
! 	    }
Pete Graner 3797fb
  	}
Pete Graner 3797fb
        rval = evalexp (value, &expok;;
Pete Graner 3797fb
        if (expok == 0)
Pete Graner 3797fb
! 	{
Pete Graner 3797fb
! 	  top_level_cleanup ();
Pete Graner 3797fb
! 	  jump_to_top_level (DISCARD);
Pete Graner 3797fb
! 	}
Pete Graner 3797fb
        if (flags & ASS_APPEND)
Pete Graner 3797fb
  	rval += lval;
Pete Graner 3797fb
*** ../bash-3.2/patchlevel.h	Thu Apr 13 08:31:04 2006
Pete Graner 3797fb
--- patchlevel.h	Mon Oct 16 14:22:54 2006
Pete Graner 3797fb
***************
Pete Graner 3797fb
*** 26,30 ****
Pete Graner 3797fb
     looks for to find the patch level (for the sccs version string). */
Pete Graner 3797fb
  
Pete Graner 3797fb
! #define PATCHLEVEL 19
Pete Graner 3797fb
  
Pete Graner 3797fb
  #endif /* _PATCHLEVEL_H_ */
Pete Graner 3797fb
--- 26,30 ----
Pete Graner 3797fb
     looks for to find the patch level (for the sccs version string). */
Pete Graner 3797fb
  
Pete Graner 3797fb
! #define PATCHLEVEL 20
Pete Graner 3797fb
  
Pete Graner 3797fb
  #endif /* _PATCHLEVEL_H_ */