Ondrej Oprala 915e5b
			     BASH PATCH REPORT
Ondrej Oprala 915e5b
			     =================
Ondrej Oprala 915e5b
Ondrej Oprala 915e5b
Bash-Release:	4.3
Ondrej Oprala 915e5b
Patch-ID:	bash43-030
Ondrej Oprala 915e5b
Ondrej Oprala 915e5b
Bug-Reported-by:	Michal Zalewski <lcamtuf@coredump.cx>
Ondrej Oprala 915e5b
Bug-Reference-ID:
Ondrej Oprala 915e5b
Bug-Reference-URL:
Ondrej Oprala 915e5b
Ondrej Oprala 915e5b
Bug-Description:
Ondrej Oprala 915e5b
Ondrej Oprala 915e5b
A combination of nested command substitutions and function importing from
Ondrej Oprala 915e5b
the environment can cause bash to execute code appearing in the environment
Ondrej Oprala 915e5b
variable value following the function definition.
Ondrej Oprala 915e5b
Ondrej Oprala 915e5b
Patch (apply with `patch -p0'):
Ondrej Oprala 915e5b
Ondrej Oprala 915e5b
*** ../bash-4.3.29/builtins/evalstring.c	2014-10-01 12:57:47.000000000 -0400
Ondrej Oprala 915e5b
--- builtins/evalstring.c	2014-10-03 11:57:04.000000000 -0400
Ondrej Oprala 915e5b
***************
Ondrej Oprala 915e5b
*** 309,318 ****
Ondrej Oprala 915e5b
  	      struct fd_bitmap *bitmap;
Ondrej Oprala 915e5b
  
Ondrej Oprala 915e5b
! 	      if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def)
Ondrej Oprala 915e5b
  		{
Ondrej Oprala 915e5b
! 		  internal_warning ("%s: ignoring function definition attempt", from_file);
Ondrej Oprala 915e5b
! 		  should_jump_to_top_level = 0;
Ondrej Oprala 915e5b
! 		  last_result = last_command_exit_value = EX_BADUSAGE;
Ondrej Oprala 915e5b
! 		  break;
Ondrej Oprala 915e5b
  		}
Ondrej Oprala 915e5b
  
Ondrej Oprala 915e5b
--- 313,335 ----
Ondrej Oprala 915e5b
  	      struct fd_bitmap *bitmap;
Ondrej Oprala 915e5b
  
Ondrej Oprala 915e5b
! 	      if (flags & SEVAL_FUNCDEF)
Ondrej Oprala 915e5b
  		{
Ondrej Oprala 915e5b
! 		  char *x;
Ondrej Oprala 915e5b
! 
Ondrej Oprala 915e5b
! 		  /* If the command parses to something other than a straight
Ondrej Oprala 915e5b
! 		     function definition, or if we have not consumed the entire
Ondrej Oprala 915e5b
! 		     string, or if the parser has transformed the function
Ondrej Oprala 915e5b
! 		     name (as parsing will if it begins or ends with shell
Ondrej Oprala 915e5b
! 		     whitespace, for example), reject the attempt */
Ondrej Oprala 915e5b
! 		  if (command->type != cm_function_def ||
Ondrej Oprala 915e5b
! 		      ((x = parser_remaining_input ()) && *x) ||
Ondrej Oprala 915e5b
! 		      (STREQ (from_file, command->value.Function_def->name->word) == 0))
Ondrej Oprala 915e5b
! 		    {
Ondrej Oprala 915e5b
! 		      internal_warning (_("%s: ignoring function definition attempt"), from_file);
Ondrej Oprala 915e5b
! 		      should_jump_to_top_level = 0;
Ondrej Oprala 915e5b
! 		      last_result = last_command_exit_value = EX_BADUSAGE;
Ondrej Oprala 915e5b
! 		      reset_parser ();
Ondrej Oprala 915e5b
! 		      break;
Ondrej Oprala 915e5b
! 		    }
Ondrej Oprala 915e5b
  		}
Ondrej Oprala 915e5b
  
Ondrej Oprala 915e5b
***************
Ondrej Oprala 915e5b
*** 379,383 ****
Ondrej Oprala 915e5b
  
Ondrej Oprala 915e5b
  	      if (flags & SEVAL_ONECMD)
Ondrej Oprala 915e5b
! 		break;
Ondrej Oprala 915e5b
  	    }
Ondrej Oprala 915e5b
  	}
Ondrej Oprala 915e5b
--- 396,403 ----
Ondrej Oprala 915e5b
  
Ondrej Oprala 915e5b
  	      if (flags & SEVAL_ONECMD)
Ondrej Oprala 915e5b
! 		{
Ondrej Oprala 915e5b
! 		  reset_parser ();
Ondrej Oprala 915e5b
! 		  break;
Ondrej Oprala 915e5b
! 		}
Ondrej Oprala 915e5b
  	    }
Ondrej Oprala 915e5b
  	}
Ondrej Oprala 915e5b
*** ../bash-4.3.29/parse.y	2014-10-01 12:58:43.000000000 -0400
Ondrej Oprala 915e5b
--- parse.y	2014-10-03 14:48:59.000000000 -0400
Ondrej Oprala 915e5b
***************
Ondrej Oprala 915e5b
*** 2539,2542 ****
Ondrej Oprala 915e5b
--- 2539,2552 ----
Ondrej Oprala 915e5b
  }
Ondrej Oprala 915e5b
  
Ondrej Oprala 915e5b
+ char *
Ondrej Oprala 915e5b
+ parser_remaining_input ()
Ondrej Oprala 915e5b
+ {
Ondrej Oprala 915e5b
+   if (shell_input_line == 0)
Ondrej Oprala 915e5b
+     return 0;
Ondrej Oprala 915e5b
+   if (shell_input_line_index < 0 || shell_input_line_index >= shell_input_line_len)
Ondrej Oprala 915e5b
+     return '\0';	/* XXX */
Ondrej Oprala 915e5b
+   return (shell_input_line + shell_input_line_index);
Ondrej Oprala 915e5b
+ }
Ondrej Oprala 915e5b
+ 
Ondrej Oprala 915e5b
  #ifdef INCLUDE_UNUSED
Ondrej Oprala 915e5b
  /* Back the input pointer up by one, effectively `ungetting' a character. */
Ondrej Oprala 915e5b
***************
Ondrej Oprala 915e5b
*** 4028,4033 ****
Ondrej Oprala 915e5b
    /* reset_parser clears shell_input_line and associated variables */
Ondrej Oprala 915e5b
    restore_input_line_state (&ls);
Ondrej Oprala 915e5b
!   if (interactive)
Ondrej Oprala 915e5b
!     token_to_read = 0;
Ondrej Oprala 915e5b
  
Ondrej Oprala 915e5b
    /* Need to find how many characters parse_and_execute consumed, update
Ondrej Oprala 915e5b
--- 4053,4058 ----
Ondrej Oprala 915e5b
    /* reset_parser clears shell_input_line and associated variables */
Ondrej Oprala 915e5b
    restore_input_line_state (&ls);
Ondrej Oprala 915e5b
! 
Ondrej Oprala 915e5b
!   token_to_read = 0;
Ondrej Oprala 915e5b
  
Ondrej Oprala 915e5b
    /* Need to find how many characters parse_and_execute consumed, update
Ondrej Oprala 915e5b
*** ../bash-4.3.29/shell.h	2014-10-01 12:57:39.000000000 -0400
Ondrej Oprala 915e5b
--- shell.h	2014-10-03 14:49:12.000000000 -0400
Ondrej Oprala 915e5b
***************
Ondrej Oprala 915e5b
*** 181,184 ****
Ondrej Oprala 915e5b
--- 181,186 ----
Ondrej Oprala 915e5b
  
Ondrej Oprala 915e5b
  /* Let's try declaring these here. */
Ondrej Oprala 915e5b
+ extern char *parser_remaining_input __P((void));
Ondrej Oprala 915e5b
+ 
Ondrej Oprala 915e5b
  extern sh_parser_state_t *save_parser_state __P((sh_parser_state_t *));
Ondrej Oprala 915e5b
  extern void restore_parser_state __P((sh_parser_state_t *));
Ondrej Oprala 915e5b
*** ../bash-4.3/patchlevel.h	2012-12-29 10:47:57.000000000 -0500
Ondrej Oprala 915e5b
--- patchlevel.h	2014-03-20 20:01:28.000000000 -0400
Ondrej Oprala 915e5b
***************
Ondrej Oprala 915e5b
*** 26,30 ****
Ondrej Oprala 915e5b
     looks for to find the patch level (for the sccs version string). */
Ondrej Oprala 915e5b
  
Ondrej Oprala 915e5b
! #define PATCHLEVEL 29
Ondrej Oprala 915e5b
  
Ondrej Oprala 915e5b
  #endif /* _PATCHLEVEL_H_ */
Ondrej Oprala 915e5b
--- 26,30 ----
Ondrej Oprala 915e5b
     looks for to find the patch level (for the sccs version string). */
Ondrej Oprala 915e5b
  
Ondrej Oprala 915e5b
! #define PATCHLEVEL 30
Ondrej Oprala 915e5b
  
Ondrej Oprala 915e5b
  #endif /* _PATCHLEVEL_H_ */