Ondrej Oprala dfa339
			     BASH PATCH REPORT
Ondrej Oprala dfa339
			     =================
Ondrej Oprala dfa339
Ondrej Oprala dfa339
Bash-Release:	4.3
Ondrej Oprala dfa339
Patch-ID:	bash43-025
Ondrej Oprala dfa339
Ondrej Oprala dfa339
Bug-Reported-by:	Stephane Chazelas <stephane.chazelas@gmail.com>
Ondrej Oprala dfa339
Bug-Reference-ID:
Ondrej Oprala dfa339
Bug-Reference-URL:
Ondrej Oprala dfa339
Ondrej Oprala dfa339
Bug-Description:
Ondrej Oprala dfa339
Ondrej Oprala dfa339
Under certain circumstances, bash will execute user code while processing the
Ondrej Oprala dfa339
environment for exported function definitions.
Ondrej Oprala dfa339
Ondrej Oprala dfa339
Patch (apply with `patch -p0'):
Ondrej Oprala dfa339
Ondrej Oprala 74d1c2
*** ../bash-4.3-patched/builtins/common.h	2013-07-08 16:54:47.000000000 -0400
Ondrej Oprala 74d1c2
--- builtins/common.h	2014-09-12 14:25:47.000000000 -0400
Ondrej Oprala 74d1c2
***************
Ondrej Oprala 74d1c2
*** 34,37 ****
Ondrej Oprala 74d1c2
--- 49,54 ----
Ondrej Oprala 74d1c2
  #define SEVAL_PARSEONLY	0x020
Ondrej Oprala 74d1c2
  #define SEVAL_NOLONGJMP 0x040
Ondrej Oprala 74d1c2
+ #define SEVAL_FUNCDEF	0x080		/* only allow function definitions */
Ondrej Oprala 74d1c2
+ #define SEVAL_ONECMD	0x100		/* only allow a single command */
Ondrej Oprala 74d1c2
  
Ondrej Oprala 74d1c2
  /* Flags for describe_command, shared between type.def and command.def */
Ondrej Oprala 74d1c2
*** ../bash-4.3-patched/builtins/evalstring.c	2014-02-11 09:42:10.000000000 -0500
Ondrej Oprala 74d1c2
--- builtins/evalstring.c	2014-09-14 14:15:13.000000000 -0400
Ondrej Oprala 74d1c2
***************
Ondrej Oprala 74d1c2
*** 309,312 ****
Ondrej Oprala 74d1c2
--- 313,324 ----
Ondrej Oprala 74d1c2
  	      struct fd_bitmap *bitmap;
Ondrej Oprala 74d1c2
  
Ondrej Oprala 74d1c2
+ 	      if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def)
Ondrej Oprala 74d1c2
+ 		{
Ondrej Oprala 74d1c2
+ 		  internal_warning ("%s: ignoring function definition attempt", from_file);
Ondrej Oprala 74d1c2
+ 		  should_jump_to_top_level = 0;
Ondrej Oprala 74d1c2
+ 		  last_result = last_command_exit_value = EX_BADUSAGE;
Ondrej Oprala 74d1c2
+ 		  break;
Ondrej Oprala 74d1c2
+ 		}
Ondrej Oprala 74d1c2
+ 
Ondrej Oprala 74d1c2
  	      bitmap = new_fd_bitmap (FD_BITMAP_SIZE);
Ondrej Oprala 74d1c2
  	      begin_unwind_frame ("pe_dispose");
Ondrej Oprala 74d1c2
***************
Ondrej Oprala 74d1c2
*** 369,372 ****
Ondrej Oprala 74d1c2
--- 381,387 ----
Ondrej Oprala 74d1c2
  	      dispose_fd_bitmap (bitmap);
Ondrej Oprala 74d1c2
  	      discard_unwind_frame ("pe_dispose");
Ondrej Oprala 74d1c2
+ 
Ondrej Oprala 74d1c2
+ 	      if (flags & SEVAL_ONECMD)
Ondrej Oprala 74d1c2
+ 		break;
Ondrej Oprala 74d1c2
  	    }
Ondrej Oprala 74d1c2
  	}
Ondrej Oprala 74d1c2
*** ../bash-4.3-patched/variables.c	2014-05-15 08:26:50.000000000 -0400
Ondrej Oprala 74d1c2
--- variables.c	2014-09-14 14:23:35.000000000 -0400
Ondrej Oprala 74d1c2
***************
Ondrej Oprala 74d1c2
*** 359,369 ****
Ondrej Oprala 74d1c2
  	  strcpy (temp_string + char_index + 1, string);
Ondrej Oprala 74d1c2
  
Ondrej Oprala 74d1c2
! 	  if (posixly_correct == 0 || legal_identifier (name))
Ondrej Oprala 74d1c2
! 	    parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST);
Ondrej Oprala 74d1c2
! 
Ondrej Oprala 74d1c2
! 	  /* Ancient backwards compatibility.  Old versions of bash exported
Ondrej Oprala 74d1c2
! 	     functions like name()=() {...} */
Ondrej Oprala 74d1c2
! 	  if (name[char_index - 1] == ')' && name[char_index - 2] == '(')
Ondrej Oprala 74d1c2
! 	    name[char_index - 2] = '\0';
Ondrej Oprala 74d1c2
  
Ondrej Oprala 74d1c2
  	  if (temp_var = find_function (name))
Ondrej Oprala 74d1c2
--- 364,372 ----
Ondrej Oprala 74d1c2
  	  strcpy (temp_string + char_index + 1, string);
Ondrej Oprala 74d1c2
  
Ondrej Oprala 74d1c2
! 	  /* Don't import function names that are invalid identifiers from the
Ondrej Oprala 74d1c2
! 	     environment, though we still allow them to be defined as shell
Ondrej Oprala 74d1c2
! 	     variables. */
Ondrej Oprala 74d1c2
! 	  if (legal_identifier (name))
Ondrej Oprala 74d1c2
! 	    parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD);
Ondrej Oprala 74d1c2
  
Ondrej Oprala 74d1c2
  	  if (temp_var = find_function (name))
Ondrej Oprala 74d1c2
***************
Ondrej Oprala 74d1c2
*** 382,389 ****
Ondrej Oprala 74d1c2
  	      report_error (_("error importing function definition for `%s'"), name);
Ondrej Oprala 74d1c2
  	    }
Ondrej Oprala 74d1c2
- 
Ondrej Oprala 74d1c2
- 	  /* ( */
Ondrej Oprala 74d1c2
- 	  if (name[char_index - 1] == ')' && name[char_index - 2] == '\0')
Ondrej Oprala 74d1c2
- 	    name[char_index - 2] = '(';		/* ) */
Ondrej Oprala 74d1c2
  	}
Ondrej Oprala 74d1c2
  #if defined (ARRAY_VARS)
Ondrej Oprala 74d1c2
--- 385,388 ----
Ondrej Oprala 74d1c2
*** ../bash-4.3-patched/subst.c	2014-08-11 11:16:35.000000000 -0400
Ondrej Oprala 74d1c2
--- subst.c	2014-09-12 15:31:04.000000000 -0400
Ondrej Oprala 74d1c2
***************
Ondrej Oprala 74d1c2
*** 8048,8052 ****
Ondrej Oprala 74d1c2
  	  goto return0;
Ondrej Oprala 74d1c2
  	}
Ondrej Oprala 74d1c2
!       else if (var = find_variable_last_nameref (temp1))
Ondrej Oprala 74d1c2
  	{
Ondrej Oprala 74d1c2
  	  temp = nameref_cell (var);
Ondrej Oprala 74d1c2
--- 8118,8124 ----
Ondrej Oprala 74d1c2
  	  goto return0;
Ondrej Oprala 74d1c2
  	}
Ondrej Oprala 74d1c2
!       else if (var && (invisible_p (var) || var_isset (var) == 0))
Ondrej Oprala 74d1c2
! 	temp = (char *)NULL;
Ondrej Oprala 74d1c2
!       else if ((var = find_variable_last_nameref (temp1)) && var_isset (var) && invisible_p (var) == 0)
Ondrej Oprala 74d1c2
  	{
Ondrej Oprala 74d1c2
  	  temp = nameref_cell (var);
Ondrej Oprala dfa339
*** ../bash-4.3/patchlevel.h	2012-12-29 10:47:57.000000000 -0500
Ondrej Oprala dfa339
--- patchlevel.h	2014-03-20 20:01:28.000000000 -0400
Ondrej Oprala dfa339
***************
Ondrej Oprala dfa339
*** 26,30 ****
Ondrej Oprala dfa339
     looks for to find the patch level (for the sccs version string). */
Ondrej Oprala dfa339
  
Ondrej Oprala dfa339
! #define PATCHLEVEL 24
Ondrej Oprala dfa339
  
Ondrej Oprala dfa339
  #endif /* _PATCHLEVEL_H_ */
Ondrej Oprala dfa339
--- 26,30 ----
Ondrej Oprala dfa339
     looks for to find the patch level (for the sccs version string). */
Ondrej Oprala dfa339
  
Ondrej Oprala dfa339
! #define PATCHLEVEL 25
Ondrej Oprala dfa339
  
Ondrej Oprala dfa339
  #endif /* _PATCHLEVEL_H_ */