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