psss / rpms / bash

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