Roman Rakus 928cba
			     BASH PATCH REPORT
Roman Rakus 928cba
			     =================
Roman Rakus 928cba
Roman Rakus 928cba
Bash-Release: 4.0
Roman Rakus 928cba
Patch-ID: bash40-019
Roman Rakus 928cba
Roman Rakus 928cba
Bug-Reported-by: Oleksiy Melnyk <lex@upc.ua>
Roman Rakus 928cba
Bug-Reference-ID: <20090224142233.D2FEFC004@floyd.upc.ua>
Roman Rakus 928cba
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2009-02/msg00200.html
Roman Rakus 928cba
Roman Rakus 928cba
Bug-Description:
Roman Rakus 928cba
Roman Rakus 928cba
Using an external command as part of the DEBUG trap when job control is
Roman Rakus 928cba
enabled causes pipelines to misbehave.  The problem has to do with process
Roman Rakus 928cba
groups assigned to the pipeline and terminal.
Roman Rakus 928cba
Roman Rakus 928cba
Patch:
Roman Rakus 928cba
Roman Rakus 928cba
*** ../bash-4.0-patched/jobs.c	2009-01-29 17:09:49.000000000 -0500
Roman Rakus 928cba
--- jobs.c	2009-04-17 21:08:20.000000000 -0400
Roman Rakus 928cba
***************
Roman Rakus 928cba
*** 443,447 ****
Roman Rakus 928cba
    the_pipeline = saved_pipeline;
Roman Rakus 928cba
    already_making_children = saved_already_making_children;
Roman Rakus 928cba
!   if (discard)
Roman Rakus 928cba
      discard_pipeline (old_pipeline);
Roman Rakus 928cba
  }
Roman Rakus 928cba
--- 443,447 ----
Roman Rakus 928cba
    the_pipeline = saved_pipeline;
Roman Rakus 928cba
    already_making_children = saved_already_making_children;
Roman Rakus 928cba
!   if (discard && old_pipeline)
Roman Rakus 928cba
      discard_pipeline (old_pipeline);
Roman Rakus 928cba
  }
Roman Rakus 928cba
***************
Roman Rakus 928cba
*** 4203,4205 ****
Roman Rakus 928cba
--- 4204,4225 ----
Roman Rakus 928cba
  }
Roman Rakus 928cba
  
Roman Rakus 928cba
+ void
Roman Rakus 928cba
+ save_pgrp_pipe (p, clear)
Roman Rakus 928cba
+      int *p;
Roman Rakus 928cba
+      int clear;
Roman Rakus 928cba
+ {
Roman Rakus 928cba
+   p[0] = pgrp_pipe[0];
Roman Rakus 928cba
+   p[1] = pgrp_pipe[1];
Roman Rakus 928cba
+   if (clear)
Roman Rakus 928cba
+     pgrp_pipe[0] = pgrp_pipe[1] = -1;
Roman Rakus 928cba
+ }
Roman Rakus 928cba
+ 
Roman Rakus 928cba
+ void
Roman Rakus 928cba
+ restore_pgrp_pipe (p)
Roman Rakus 928cba
+      int *p;
Roman Rakus 928cba
+ {
Roman Rakus 928cba
+   pgrp_pipe[0] = p[0];
Roman Rakus 928cba
+   pgrp_pipe[1] = p[1];
Roman Rakus 928cba
+ }
Roman Rakus 928cba
+ 
Roman Rakus 928cba
  #endif /* PGRP_PIPE */
Roman Rakus 928cba
*** ../bash-4.0-patched/jobs.h	2009-01-04 14:32:29.000000000 -0500
Roman Rakus 928cba
--- jobs.h	2009-04-17 15:07:51.000000000 -0400
Roman Rakus 928cba
***************
Roman Rakus 928cba
*** 236,239 ****
Roman Rakus 928cba
--- 236,241 ----
Roman Rakus 928cba
  
Roman Rakus 928cba
  extern void close_pgrp_pipe __P((void));
Roman Rakus 928cba
+ extern void save_pgrp_pipe __P((int *, int));
Roman Rakus 928cba
+ extern void restore_pgrp_pipe __P((int *));
Roman Rakus 928cba
  
Roman Rakus 928cba
  #if defined (JOB_CONTROL)
Roman Rakus 928cba
*** ../bash-4.0-patched/trap.c	2009-01-16 17:07:53.000000000 -0500
Roman Rakus 928cba
--- trap.c	2009-04-17 22:22:36.000000000 -0400
Roman Rakus 928cba
***************
Roman Rakus 928cba
*** 799,802 ****
Roman Rakus 928cba
--- 799,804 ----
Roman Rakus 928cba
  {
Roman Rakus 928cba
    int trap_exit_value;
Roman Rakus 928cba
+   pid_t save_pgrp;
Roman Rakus 928cba
+   int save_pipe[2];
Roman Rakus 928cba
  
Roman Rakus 928cba
    /* XXX - question:  should the DEBUG trap inherit the RETURN trap? */
Roman Rakus 928cba
***************
Roman Rakus 928cba
*** 804,808 ****
Roman Rakus 928cba
--- 806,832 ----
Roman Rakus 928cba
    if ((sigmodes[DEBUG_TRAP] & SIG_TRAPPED) && ((sigmodes[DEBUG_TRAP] & SIG_IGNORED) == 0) && ((sigmodes[DEBUG_TRAP] & SIG_INPROGRESS) == 0))
Roman Rakus 928cba
      {
Roman Rakus 928cba
+ #if defined (JOB_CONTROL)
Roman Rakus 928cba
+       save_pgrp = pipeline_pgrp;
Roman Rakus 928cba
+       pipeline_pgrp = 0;
Roman Rakus 928cba
+       save_pipeline (1);
Roman Rakus 928cba
+ #  if defined (PGRP_PIPE)
Roman Rakus 928cba
+       save_pgrp_pipe (save_pipe, 1);
Roman Rakus 928cba
+ #  endif
Roman Rakus 928cba
+       stop_making_children ();
Roman Rakus 928cba
+ #endif
Roman Rakus 928cba
+ 
Roman Rakus 928cba
        trap_exit_value = _run_trap_internal (DEBUG_TRAP, "debug trap");
Roman Rakus 928cba
+ 
Roman Rakus 928cba
+ #if defined (JOB_CONTROL)
Roman Rakus 928cba
+       pipeline_pgrp = save_pgrp;
Roman Rakus 928cba
+       restore_pipeline (1);
Roman Rakus 928cba
+ #  if defined (PGRP_PIPE)
Roman Rakus 928cba
+       close_pgrp_pipe ();
Roman Rakus 928cba
+       restore_pgrp_pipe (save_pipe);
Roman Rakus 928cba
+ #  endif
Roman Rakus 928cba
+       if (pipeline_pgrp > 0)
Roman Rakus 928cba
+ 	give_terminal_to (pipeline_pgrp, 1);
Roman Rakus 928cba
+       notify_and_cleanup ();
Roman Rakus 928cba
+ #endif
Roman Rakus 928cba
        
Roman Rakus 928cba
  #if defined (DEBUGGER)
Roman Rakus 928cba
*** ../bash-4.0/patchlevel.h	2009-01-04 14:32:40.000000000 -0500
Roman Rakus 928cba
--- patchlevel.h	2009-02-22 16:11:31.000000000 -0500
Roman Rakus 928cba
***************
Roman Rakus 928cba
*** 26,30 ****
Roman Rakus 928cba
     looks for to find the patch level (for the sccs version string). */
Roman Rakus 928cba
  
Roman Rakus 928cba
! #define PATCHLEVEL 18
Roman Rakus 928cba
  
Roman Rakus 928cba
  #endif /* _PATCHLEVEL_H_ */
Roman Rakus 928cba
--- 26,30 ----
Roman Rakus 928cba
     looks for to find the patch level (for the sccs version string). */
Roman Rakus 928cba
  
Roman Rakus 928cba
! #define PATCHLEVEL 19
Roman Rakus 928cba
  
Roman Rakus 928cba
  #endif /* _PATCHLEVEL_H_ */