From http://ftp.gnu.org/pub/gnu/bash/bash-4.3-patches/bash43-033

Signed-off-by: Gustavo Zacarias <gustavo@zacarias.com.ar>

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

Bash-Release:	4.3
Patch-ID:	bash43-033

Bug-Reported-by:	mickael9@gmail.com, Jan Rome <jan.rome@gmail.com>
Bug-Reference-ID:	<20140907224046.382ED3610CC@mickael-laptop.localdomain>,
			<540D661D.50908@gmail.com>
Bug-Reference-URL:	http://lists.gnu.org/archive/html/bug-bash/2014-09/msg00029.html
			http://lists.gnu.org/archive/html/bug-bash/2014-09/msg00030.html

Bug-Description:

Bash does not clean up the terminal state in all cases where bash or
readline  modifies it and bash is subsequently terminated by a fatal signal.
This happens when the `read' builtin modifies the terminal settings, both
when readline is active and when it is not.  It occurs most often when a script
installs a trap that exits on a signal without re-sending the signal to itself.

Patch (apply with `patch -p0'):

*** a/bash-4.3-patched/shell.c	2014-01-14 08:04:32.000000000 -0500
--- b/shell.c	2014-12-22 10:27:50.000000000 -0500
***************
*** 74,77 ****
--- 74,78 ----
  
  #if defined (READLINE)
+ #  include <readline/readline.h>
  #  include "bashline.h"
  #endif
***************
*** 910,913 ****
--- 912,923 ----
    fflush (stderr);
  
+   /* Clean up the terminal if we are in a state where it's been modified. */
+ #if defined (READLINE)
+   if (RL_ISSTATE (RL_STATE_TERMPREPPED) && rl_deprep_term_function)
+     (*rl_deprep_term_function) ();
+ #endif
+   if (read_tty_modified ())
+     read_tty_cleanup ();
+ 
    /* Do trap[0] if defined.  Allow it to override the exit status
       passed to us. */
*** a/bash-4.3-patched/builtins/read.def	2014-10-01 12:57:38.000000000 -0400
--- b/builtins/read.def	2014-12-22 10:48:54.000000000 -0500
***************
*** 141,148 ****
  int sigalrm_seen;
  
! static int reading;
  static SigHandler *old_alrm;
  static unsigned char delim;
  
  /* In all cases, SIGALRM just sets a flag that we check periodically.  This
     avoids problems with the semi-tricky stuff we do with the xfree of
--- 141,150 ----
  int sigalrm_seen;
  
! static int reading, tty_modified;
  static SigHandler *old_alrm;
  static unsigned char delim;
  
+ static struct ttsave termsave;
+ 
  /* In all cases, SIGALRM just sets a flag that we check periodically.  This
     avoids problems with the semi-tricky stuff we do with the xfree of
***************
*** 189,193 ****
    SHELL_VAR *var;
    TTYSTRUCT ttattrs, ttset;
-   struct ttsave termsave;
  #if defined (ARRAY_VARS)
    WORD_LIST *alist;
--- 191,194 ----
***************
*** 222,226 ****
    USE_VAR(lastsig);
  
!   sigalrm_seen = reading = 0;
  
    i = 0;		/* Index into the string that we are reading. */
--- 223,227 ----
    USE_VAR(lastsig);
  
!   sigalrm_seen = reading = tty_modified = 0;
  
    i = 0;		/* Index into the string that we are reading. */
***************
*** 439,442 ****
--- 440,445 ----
  	  goto assign_vars;
  	}
+       if (interactive_shell == 0)
+ 	initialize_terminating_signals ();
        old_alrm = set_signal_handler (SIGALRM, sigalrm);
        add_unwind_protect (reset_alarm, (char *)NULL);
***************
*** 483,487 ****
--- 486,493 ----
  	  if (i < 0)
  	    sh_ttyerror (1);
+ 	  tty_modified = 1;
  	  add_unwind_protect ((Function *)ttyrestore, (char *)&termsave);
+ 	  if (interactive_shell == 0)
+ 	    initialize_terminating_signals ();
  	}
      }
***************
*** 498,502 ****
--- 504,511 ----
  	sh_ttyerror (1);
  
+       tty_modified = 1;
        add_unwind_protect ((Function *)ttyrestore, (char *)&termsave);
+       if (interactive_shell == 0)
+ 	initialize_terminating_signals ();
      }
  
***************
*** 589,592 ****
--- 598,603 ----
  	  else
  	    lastsig = 0;
+ 	  if (terminating_signal && tty_modified)
+ 	    ttyrestore (&termsave);	/* fix terminal before exiting */
  	  CHECK_TERMSIG;
  	  eof = 1;
***************
*** 979,982 ****
--- 990,1007 ----
  {
    ttsetattr (ttp->fd, ttp->attrs);
+   tty_modified = 0;
+ }
+ 
+ void
+ read_tty_cleanup ()
+ {
+   if (tty_modified)
+     ttyrestore (&termsave);
+ }
+ 
+ int
+ read_tty_modified ()
+ {
+   return (tty_modified);
  }
  
*** ./bash-4.3-patched/builtins/common.h	2014-10-01 12:57:47.000000000 -0400
--- b/builtins/common.h	2014-12-22 10:10:14.000000000 -0500
***************
*** 123,126 ****
--- 141,148 ----
  extern void getopts_reset __P((int));
  
+ /* Functions from read.def */
+ extern void read_tty_cleanup __P((void));
+ extern int read_tty_modified __P((void));
+ 
  /* Functions from set.def */
  extern int minus_o_option_value __P((char *));
*** a/bash-4.3-patched/bashline.c	2014-05-14 09:22:39.000000000 -0400
--- b/bashline.c	2014-09-08 11:28:56.000000000 -0400
***************
*** 203,206 ****
--- 203,207 ----
  extern int array_needs_making;
  extern int posixly_correct, no_symbolic_links;
+ extern int sigalrm_seen;
  extern char *current_prompt_string, *ps1_prompt;
  extern STRING_INT_ALIST word_token_alist[];
***************
*** 4209,4214 ****
    /* If we're going to longjmp to top_level, make sure we clean up readline.
       check_signals will call QUIT, which will eventually longjmp to top_level,
!      calling run_interrupt_trap along the way. */
!   if (interrupt_state)
      rl_cleanup_after_signal ();
    bashline_reset_event_hook ();
--- 4262,4268 ----
    /* If we're going to longjmp to top_level, make sure we clean up readline.
       check_signals will call QUIT, which will eventually longjmp to top_level,
!      calling run_interrupt_trap along the way.  The check for sigalrm_seen is
!      to clean up the read builtin's state. */
!   if (terminating_signal || interrupt_state || sigalrm_seen)
      rl_cleanup_after_signal ();
    bashline_reset_event_hook ();
*** a/bash-4.3-patched/sig.c	2014-01-10 15:06:06.000000000 -0500
--- b/sig.c	2014-09-08 11:26:33.000000000 -0400
***************
*** 533,538 ****
    /* Set the event hook so readline will call it after the signal handlers
       finish executing, so if this interrupted character input we can get
!      quick response. */
!   if (interactive_shell && interactive && no_line_editing == 0)
      bashline_set_event_hook ();
  #endif
--- 533,540 ----
    /* Set the event hook so readline will call it after the signal handlers
       finish executing, so if this interrupted character input we can get
!      quick response.  If readline is active or has modified the terminal we
!      need to set this no matter what the signal is, though the check for
!      RL_STATE_TERMPREPPED is possibly redundant. */
!   if (RL_ISSTATE (RL_STATE_SIGHANDLER) || RL_ISSTATE (RL_STATE_TERMPREPPED))
      bashline_set_event_hook ();
  #endif
*** a/bash-4.3/patchlevel.h	2012-12-29 10:47:57.000000000 -0500
--- b/patchlevel.h	2014-03-20 20:01:28.000000000 -0400
***************
*** 26,30 ****
     looks for to find the patch level (for the sccs version string). */
  
! #define PATCHLEVEL 32
  
  #endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
     looks for to find the patch level (for the sccs version string). */
  
! #define PATCHLEVEL 33
  
  #endif /* _PATCHLEVEL_H_ */
