diff options
author | Chet Ramey <chet.ramey@case.edu> | 2018-01-29 16:03:47 -0500 |
---|---|---|
committer | Chet Ramey <chet.ramey@case.edu> | 2018-01-29 16:03:47 -0500 |
commit | 2fb21d75bfddd724b0e45d4a51455a166467e496 (patch) | |
tree | 8b0144f5dcbd4159de08236debf8eebbda00b0c9 | |
parent | 1aef9c7b55dcef4af239caf93e01419e1c8e04ad (diff) | |
download | bash-2fb21d75bfddd724b0e45d4a51455a166467e496.tar.gz |
Bash-4.4 patch 14
-rw-r--r-- | execute_cmd.c | 19 | ||||
-rw-r--r-- | patchlevel.h | 2 |
2 files changed, 17 insertions, 4 deletions
diff --git a/execute_cmd.c b/execute_cmd.c index 2a3df6d6..76a80766 100644 --- a/execute_cmd.c +++ b/execute_cmd.c @@ -726,6 +726,8 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out, { ofifo = num_fifos (); ofifo_list = copy_fifo_list ((int *)&osize); + begin_unwind_frame ("internal_fifos"); + add_unwind_protect (xfree, ofifo_list); saved_fifo = 1; } else @@ -741,7 +743,10 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out, dispose_exec_redirects (); #if defined (PROCESS_SUBSTITUTION) if (saved_fifo) - free ((void *)ofifo_list); + { + free ((void *)ofifo_list); + discard_unwind_frame ("internal_fifos"); + } #endif return (last_command_exit_value = EXECUTION_FAILURE); } @@ -1060,6 +1065,7 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out, if (nfifo > ofifo) close_new_fifos ((char *)ofifo_list, osize); free ((void *)ofifo_list); + discard_unwind_frame ("internal_fifos"); } #endif @@ -4977,9 +4983,14 @@ execute_builtin_or_function (words, builtin, var, redirects, char *ofifo_list; #endif -#if defined (PROCESS_SUBSTITUTION) +#if defined (PROCESS_SUBSTITUTION) + begin_unwind_frame ("saved_fifos"); + /* If we return, we longjmp and don't get a chance to restore the old + fifo list, so we add an unwind protect to free it */ ofifo = num_fifos (); ofifo_list = copy_fifo_list (&osize); + if (ofifo_list) + add_unwind_protect (xfree, ofifo_list); #endif if (do_redirections (redirects, RX_ACTIVE|RX_UNDOABLE) != 0) @@ -5063,7 +5074,9 @@ execute_builtin_or_function (words, builtin, var, redirects, nfifo = num_fifos (); if (nfifo > ofifo) close_new_fifos (ofifo_list, osize); - free (ofifo_list); + if (ofifo_list) + free (ofifo_list); + discard_unwind_frame ("saved_fifos"); #endif return (result); diff --git a/patchlevel.h b/patchlevel.h index 779671cd..09a3cc84 100644 --- a/patchlevel.h +++ b/patchlevel.h @@ -25,6 +25,6 @@ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh looks for to find the patch level (for the sccs version string). */ -#define PATCHLEVEL 13 +#define PATCHLEVEL 14 #endif /* _PATCHLEVEL_H_ */ |