Siteshwar Vashisht ed01fa
From 4f747edc625815f449048579f6e65869914dd715 Mon Sep 17 00:00:00 2001
Siteshwar Vashisht ed01fa
From: Chet Ramey <chet.ramey@case.edu>
Siteshwar Vashisht ed01fa
Date: Fri, 20 Jan 2017 11:47:55 -0500
Siteshwar Vashisht ed01fa
Subject: [PATCH] Bash-4.4 patch 7
Siteshwar Vashisht ed01fa
Siteshwar Vashisht ed01fa
---
Siteshwar Vashisht ed01fa
 bashline.c   | 22 ++++++++++++----------
Siteshwar Vashisht ed01fa
 patchlevel.h |  2 +-
Siteshwar Vashisht ed01fa
 subst.c      |  4 ++++
Siteshwar Vashisht ed01fa
 3 files changed, 17 insertions(+), 11 deletions(-)
Siteshwar Vashisht ed01fa
Siteshwar Vashisht ed01fa
diff --git a/bashline.c b/bashline.c
Siteshwar Vashisht ed01fa
index f4fe9f1..0275844 100644
Siteshwar Vashisht ed01fa
--- a/bashline.c
Siteshwar Vashisht ed01fa
+++ b/bashline.c
Siteshwar Vashisht ed01fa
@@ -142,7 +142,7 @@ static int executable_completion __P((const char *, int));
Siteshwar Vashisht ed01fa
 static rl_icppfunc_t *save_directory_hook __P((void));
Siteshwar Vashisht ed01fa
 static void restore_directory_hook __P((rl_icppfunc_t));
Siteshwar Vashisht ed01fa
 
Siteshwar Vashisht ed01fa
-static int directory_exists __P((const char *));
Siteshwar Vashisht ed01fa
+static int directory_exists __P((const char *, int));
Siteshwar Vashisht ed01fa
 
Siteshwar Vashisht ed01fa
 static void cleanup_expansion_error __P((void));
Siteshwar Vashisht ed01fa
 static void maybe_make_readline_line __P((char *));
Siteshwar Vashisht ed01fa
@@ -3102,18 +3102,20 @@ restore_directory_hook (hookf)
Siteshwar Vashisht ed01fa
     rl_directory_rewrite_hook = hookf;
Siteshwar Vashisht ed01fa
 }
Siteshwar Vashisht ed01fa
 
Siteshwar Vashisht ed01fa
-/* Check whether not the (dequoted) version of DIRNAME, with any trailing slash
Siteshwar Vashisht ed01fa
-   removed, exists. */
Siteshwar Vashisht ed01fa
+/* Check whether not DIRNAME, with any trailing slash removed, exists.  If
Siteshwar Vashisht ed01fa
+   SHOULD_DEQUOTE is non-zero, we dequote the directory name first. */
Siteshwar Vashisht ed01fa
 static int
Siteshwar Vashisht ed01fa
-directory_exists (dirname)
Siteshwar Vashisht ed01fa
+directory_exists (dirname, should_dequote)
Siteshwar Vashisht ed01fa
      const char *dirname;
Siteshwar Vashisht ed01fa
+     int should_dequote;
Siteshwar Vashisht ed01fa
 {
Siteshwar Vashisht ed01fa
   char *new_dirname;
Siteshwar Vashisht ed01fa
   int dirlen, r;
Siteshwar Vashisht ed01fa
   struct stat sb;
Siteshwar Vashisht ed01fa
 
Siteshwar Vashisht ed01fa
-  /* First, dequote the directory name */
Siteshwar Vashisht ed01fa
-  new_dirname = bash_dequote_filename ((char *)dirname, rl_completion_quote_character);
Siteshwar Vashisht ed01fa
+  /* We save the string and chop the trailing slash because stat/lstat behave
Siteshwar Vashisht ed01fa
+     inconsistently if one is present. */
Siteshwar Vashisht ed01fa
+  new_dirname = should_dequote ? bash_dequote_filename ((char *)dirname, rl_completion_quote_character) : savestring (dirname);
Siteshwar Vashisht ed01fa
   dirlen = STRLEN (new_dirname);
Siteshwar Vashisht ed01fa
   if (new_dirname[dirlen - 1] == '/')
Siteshwar Vashisht ed01fa
     new_dirname[dirlen - 1] = '\0';
Siteshwar Vashisht ed01fa
@@ -3145,7 +3147,7 @@ bash_filename_stat_hook (dirname)
Siteshwar Vashisht ed01fa
   else if (t = mbschr (local_dirname, '`'))	/* XXX */
Siteshwar Vashisht ed01fa
     should_expand_dirname = '`';
Siteshwar Vashisht ed01fa
 
Siteshwar Vashisht ed01fa
-  if (should_expand_dirname && directory_exists (local_dirname))
Siteshwar Vashisht ed01fa
+  if (should_expand_dirname && directory_exists (local_dirname, 0))
Siteshwar Vashisht ed01fa
     should_expand_dirname = 0;
Siteshwar Vashisht ed01fa
   
Siteshwar Vashisht ed01fa
   if (should_expand_dirname)  
Siteshwar Vashisht ed01fa
@@ -3155,7 +3157,7 @@ bash_filename_stat_hook (dirname)
Siteshwar Vashisht ed01fa
 	 have to worry about restoring this setting. */
Siteshwar Vashisht ed01fa
       global_nounset = unbound_vars_is_error;
Siteshwar Vashisht ed01fa
       unbound_vars_is_error = 0;
Siteshwar Vashisht ed01fa
-      wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_COMPLETE);	/* does the right thing */
Siteshwar Vashisht ed01fa
+      wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_NOPROCSUB|W_COMPLETE);	/* does the right thing */
Siteshwar Vashisht ed01fa
       unbound_vars_is_error = global_nounset;
Siteshwar Vashisht ed01fa
       if (wl)
Siteshwar Vashisht ed01fa
 	{
Siteshwar Vashisht ed01fa
@@ -3244,13 +3246,13 @@ bash_directory_completion_hook (dirname)
Siteshwar Vashisht ed01fa
 	should_expand_dirname = '`';
Siteshwar Vashisht ed01fa
     }
Siteshwar Vashisht ed01fa
 
Siteshwar Vashisht ed01fa
-  if (should_expand_dirname && directory_exists (local_dirname))
Siteshwar Vashisht ed01fa
+  if (should_expand_dirname && directory_exists (local_dirname, 1))
Siteshwar Vashisht ed01fa
     should_expand_dirname = 0;
Siteshwar Vashisht ed01fa
 
Siteshwar Vashisht ed01fa
   if (should_expand_dirname)  
Siteshwar Vashisht ed01fa
     {
Siteshwar Vashisht ed01fa
       new_dirname = savestring (local_dirname);
Siteshwar Vashisht ed01fa
-      wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_COMPLETE);	/* does the right thing */
Siteshwar Vashisht ed01fa
+      wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_NOPROCSUB|W_COMPLETE);	/* does the right thing */
Siteshwar Vashisht ed01fa
       if (wl)
Siteshwar Vashisht ed01fa
 	{
Siteshwar Vashisht ed01fa
 	  *dirname = string_list (wl);
Siteshwar Vashisht ed01fa
diff --git a/patchlevel.h b/patchlevel.h
Siteshwar Vashisht ed01fa
index 14bff9f..deb9c5b 100644
Siteshwar Vashisht ed01fa
--- a/patchlevel.h
Siteshwar Vashisht ed01fa
+++ b/patchlevel.h
Siteshwar Vashisht ed01fa
@@ -25,6 +25,6 @@
Siteshwar Vashisht ed01fa
    regexp `^#define[ 	]*PATCHLEVEL', since that's what support/mkversion.sh
Siteshwar Vashisht ed01fa
    looks for to find the patch level (for the sccs version string). */
Siteshwar Vashisht ed01fa
 
Siteshwar Vashisht ed01fa
-#define PATCHLEVEL 6
Siteshwar Vashisht ed01fa
+#define PATCHLEVEL 7
Siteshwar Vashisht ed01fa
 
Siteshwar Vashisht ed01fa
 #endif /* _PATCHLEVEL_H_ */
Siteshwar Vashisht ed01fa
diff --git a/subst.c b/subst.c
Siteshwar Vashisht ed01fa
index 298187d..027a13e 100644
Siteshwar Vashisht ed01fa
--- a/subst.c
Siteshwar Vashisht ed01fa
+++ b/subst.c
Siteshwar Vashisht ed01fa
@@ -9458,6 +9458,10 @@ add_twochars:
Siteshwar Vashisht ed01fa
 		tword->flags |= word->flags & (W_ASSIGNARG|W_ASSIGNRHS);	/* affects $@ */
Siteshwar Vashisht ed01fa
 	      if (word->flags & W_COMPLETE)
Siteshwar Vashisht ed01fa
 		tword->flags |= W_COMPLETE;	/* for command substitutions */
Siteshwar Vashisht ed01fa
+	      if (word->flags & W_NOCOMSUB)
Siteshwar Vashisht ed01fa
+		tword->flags |= W_NOCOMSUB;
Siteshwar Vashisht ed01fa
+	      if (word->flags & W_NOPROCSUB)
Siteshwar Vashisht ed01fa
+		tword->flags |= W_NOPROCSUB;
Siteshwar Vashisht ed01fa
 
Siteshwar Vashisht ed01fa
 	      temp = (char *)NULL;
Siteshwar Vashisht ed01fa
 
Siteshwar Vashisht ed01fa
-- 
Siteshwar Vashisht ed01fa
2.9.3
Siteshwar Vashisht ed01fa