Ondrej Oprala 6faef2
			     BASH PATCH REPORT
Ondrej Oprala 6faef2
			     =================
Ondrej Oprala 6faef2
Ondrej Oprala 6faef2
Bash-Release:	4.3
Ondrej Oprala 6faef2
Patch-ID:	bash43-023
Ondrej Oprala 6faef2
Ondrej Oprala 6faef2
Bug-Reported-by:	Tim Friske <me@timfriske.com>
Ondrej Oprala 6faef2
Bug-Reference-ID:	<CAM1RzOcOR9zzC2i+aeES6LtbHNHoOV+0pZEYPrqxv_QAii-RXA@mail.gmail.com>
Ondrej Oprala 6faef2
Bug-Reference-URL:	http://lists.gnu.org/archive/html/bug-bash/2014-06/msg00056.html
Ondrej Oprala 6faef2
Ondrej Oprala 6faef2
Bug-Description:
Ondrej Oprala 6faef2
Ondrej Oprala 6faef2
Bash does not correctly parse process substitution constructs that contain
Ondrej Oprala 6faef2
unbalanced parentheses as part of the contained command.
Ondrej Oprala 6faef2
Ondrej Oprala 6faef2
Patch (apply with `patch -p0'):
Ondrej Oprala 6faef2
Ondrej Oprala 6faef2
*** ../bash-4.3-patched/subst.h	2014-01-11 21:02:27.000000000 -0500
Ondrej Oprala 6faef2
--- subst.h	2014-07-20 17:25:01.000000000 -0400
Ondrej Oprala 6faef2
***************
Ondrej Oprala 6faef2
*** 83,87 ****
Ondrej Oprala 6faef2
     Start extracting at (SINDEX) as if we had just seen "<(".
Ondrej Oprala 6faef2
     Make (SINDEX) get the position just after the matching ")". */
Ondrej Oprala 6faef2
! extern char *extract_process_subst __P((char *, char *, int *));
Ondrej Oprala 6faef2
  #endif /* PROCESS_SUBSTITUTION */
Ondrej Oprala 6faef2
  
Ondrej Oprala 6faef2
--- 83,87 ----
Ondrej Oprala 6faef2
     Start extracting at (SINDEX) as if we had just seen "<(".
Ondrej Oprala 6faef2
     Make (SINDEX) get the position just after the matching ")". */
Ondrej Oprala 6faef2
! extern char *extract_process_subst __P((char *, char *, int *, int));
Ondrej Oprala 6faef2
  #endif /* PROCESS_SUBSTITUTION */
Ondrej Oprala 6faef2
  
Ondrej Oprala 6faef2
*** ../bash-4.3-patched/subst.c	2014-05-15 08:26:45.000000000 -0400
Ondrej Oprala 6faef2
--- subst.c	2014-07-20 17:26:44.000000000 -0400
Ondrej Oprala 6faef2
***************
Ondrej Oprala 6faef2
*** 1193,1202 ****
Ondrej Oprala 6faef2
     Make (SINDEX) get the position of the matching ")". */ /*))*/
Ondrej Oprala 6faef2
  char *
Ondrej Oprala 6faef2
! extract_process_subst (string, starter, sindex)
Ondrej Oprala 6faef2
       char *string;
Ondrej Oprala 6faef2
       char *starter;
Ondrej Oprala 6faef2
       int *sindex;
Ondrej Oprala 6faef2
  {
Ondrej Oprala 6faef2
    return (extract_delimited_string (string, sindex, starter, "(", ")", SX_COMMAND));
Ondrej Oprala 6faef2
  }
Ondrej Oprala 6faef2
  #endif /* PROCESS_SUBSTITUTION */
Ondrej Oprala 6faef2
--- 1193,1208 ----
Ondrej Oprala 6faef2
     Make (SINDEX) get the position of the matching ")". */ /*))*/
Ondrej Oprala 6faef2
  char *
Ondrej Oprala 6faef2
! extract_process_subst (string, starter, sindex, xflags)
Ondrej Oprala 6faef2
       char *string;
Ondrej Oprala 6faef2
       char *starter;
Ondrej Oprala 6faef2
       int *sindex;
Ondrej Oprala 6faef2
+      int xflags;
Ondrej Oprala 6faef2
  {
Ondrej Oprala 6faef2
+ #if 0
Ondrej Oprala 6faef2
    return (extract_delimited_string (string, sindex, starter, "(", ")", SX_COMMAND));
Ondrej Oprala 6faef2
+ #else
Ondrej Oprala 6faef2
+   xflags |= (no_longjmp_on_fatal_error ? SX_NOLONGJMP : 0);
Ondrej Oprala 6faef2
+   return (xparse_dolparen (string, string+*sindex, sindex, xflags));
Ondrej Oprala 6faef2
+ #endif
Ondrej Oprala 6faef2
  }
Ondrej Oprala 6faef2
  #endif /* PROCESS_SUBSTITUTION */
Ondrej Oprala 6faef2
***************
Ondrej Oprala 6faef2
*** 1786,1790 ****
Ondrej Oprala 6faef2
  	  if (string[si] == '\0')
Ondrej Oprala 6faef2
  	    CQ_RETURN(si);
Ondrej Oprala 6faef2
! 	  temp = extract_process_subst (string, (c == '<') ? "<(" : ">(", &si);
Ondrej Oprala 6faef2
  	  free (temp);		/* no SX_ALLOC here */
Ondrej Oprala 6faef2
  	  i = si;
Ondrej Oprala 6faef2
--- 1792,1796 ----
Ondrej Oprala 6faef2
  	  if (string[si] == '\0')
Ondrej Oprala 6faef2
  	    CQ_RETURN(si);
Ondrej Oprala 6faef2
! 	  temp = extract_process_subst (string, (c == '<') ? "<(" : ">(", &si, 0);
Ondrej Oprala 6faef2
  	  free (temp);		/* no SX_ALLOC here */
Ondrej Oprala 6faef2
  	  i = si;
Ondrej Oprala 6faef2
***************
Ondrej Oprala 6faef2
*** 8250,8254 ****
Ondrej Oprala 6faef2
  	      t_index = sindex + 1; /* skip past both '<' and LPAREN */
Ondrej Oprala 6faef2
  
Ondrej Oprala 6faef2
! 	    temp1 = extract_process_subst (string, (c == '<') ? "<(" : ">(", &t_index); /*))*/
Ondrej Oprala 6faef2
  	    sindex = t_index;
Ondrej Oprala 6faef2
  
Ondrej Oprala 6faef2
--- 8256,8260 ----
Ondrej Oprala 6faef2
  	      t_index = sindex + 1; /* skip past both '<' and LPAREN */
Ondrej Oprala 6faef2
  
Ondrej Oprala 6faef2
! 	    temp1 = extract_process_subst (string, (c == '<') ? "<(" : ">(", &t_index, 0); /*))*/
Ondrej Oprala 6faef2
  	    sindex = t_index;
Ondrej Oprala 6faef2
  
Ondrej Oprala 6faef2
*** ../bash-4.3/patchlevel.h	2012-12-29 10:47:57.000000000 -0500
Ondrej Oprala 6faef2
--- patchlevel.h	2014-03-20 20:01:28.000000000 -0400
Ondrej Oprala 6faef2
***************
Ondrej Oprala 6faef2
*** 26,30 ****
Ondrej Oprala 6faef2
     looks for to find the patch level (for the sccs version string). */
Ondrej Oprala 6faef2
  
Ondrej Oprala 6faef2
! #define PATCHLEVEL 22
Ondrej Oprala 6faef2
  
Ondrej Oprala 6faef2
  #endif /* _PATCHLEVEL_H_ */
Ondrej Oprala 6faef2
--- 26,30 ----
Ondrej Oprala 6faef2
     looks for to find the patch level (for the sccs version string). */
Ondrej Oprala 6faef2
  
Ondrej Oprala 6faef2
! #define PATCHLEVEL 23
Ondrej Oprala 6faef2
  
Ondrej Oprala 6faef2
  #endif /* _PATCHLEVEL_H_ */