On 8/15/15 9:02 PM, Sergey Tselikh wrote:

> Description:
> An incorrect conversion from indexed to associative array in bash script leads
> bash interpreter to segfault (bash still gives a useful error report in this 
> situation,
> which is good).
> 
> As seen in the output of GDB, bash terminates in array_flush function:
> 
> Core was generated by `../untars/bash-43-39/bash-4.3/root/bin/bash -x repro'.
> Program terminated with signal SIGSEGV, Segmentation fault.
> #0  0x0000000000470879 in array_flush (a=0x19de728) at array.c:111
> 111             for (r = element_forw(a->head); r != a->head; ) {

Thanks for the report.  The problem was incomplete error propagation.  It
will be fixed for the next release of bash.

I've attached a patch for folks to experiment with; your line numbers will
vary wildly.


Chet

-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
                 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, ITS, CWRU    c...@case.edu    http://cnswww.cns.cwru.edu/~chet/
*** /fs2/chet/bash/bash-20150813/subst.c	2015-08-13 11:32:54.000000000 -0400
--- subst.c	2015-08-18 10:13:59.000000000 -0400
***************
*** 10139,10143 ****
  	  opts[opti] = '\0';
  	  if (opti > 0)
! 	    make_internal_declare (tlist->word->word, opts);
  
  	  t = do_word_assignment (tlist->word, 0);
--- 10139,10150 ----
  	  opts[opti] = '\0';
  	  if (opti > 0)
! 	    {
! 	      t = make_internal_declare (tlist->word->word, opts);
! 	      if (t != EXECUTION_SUCCESS)
! 		{
! 		  last_command_exit_value = t;
! 		  exp_jump_to_top_level (DISCARD);
! 		}
! 	    }
  
  	  t = do_word_assignment (tlist->word, 0);

Reply via email to