bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Bash-3.2 Official Patch 20


From: Chet Ramey
Subject: Bash-3.2 Official Patch 20
Date: Fri, 24 Aug 2007 15:36:11 -0400

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

Bash-Release: 3.2
Patch-ID: bash32-020

Bug-Reported-by:        Ian A Watson <WATSON_IAN_A@LILLY.COM>
Bug-Reference-ID:       
<OFEC551808.69D02C7F-ON8525729A.0045708D-8525729A.0046150B@EliLilly.lilly.com>
Bug-Reference-URL:

Bug-Description:

In some cases of error processing, a jump back to the top-level processing
loop from a builtin command  would leave the shell in an inconsistent state.

Patch:

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

-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
                       Live Strong.  No day but today.
Chet Ramey, ITS, CWRU    chet@case.edu    http://cnswww.cns.cwru.edu/~chet/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]