Ondrej Oprala 3e4b07
			     BASH PATCH REPORT
Ondrej Oprala 3e4b07
			     =================
Ondrej Oprala 3e4b07
Ondrej Oprala 3e4b07
Bash-Release:	4.3
Ondrej Oprala 3e4b07
Patch-ID:	bash43-010
Ondrej Oprala 3e4b07
Ondrej Oprala 3e4b07
Bug-Reported-by:	Albert Shih <Albert.Shih@obspm.fr>
Ondrej Oprala 3e4b07
Bug-Reference-ID:	Wed, 5 Mar 2014 23:01:40 +0100
Ondrej Oprala 3e4b07
Bug-Reference-URL:	http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00028.html
Ondrej Oprala 3e4b07
Ondrej Oprala 3e4b07
Bug-Description:
Ondrej Oprala 3e4b07
Ondrej Oprala 3e4b07
Patch (apply with `patch -p0'):
Ondrej Oprala 3e4b07
Ondrej Oprala 3e4b07
This patch changes the behavior of programmable completion to compensate
Ondrej Oprala 3e4b07
for two assumptions made by the bash-completion package.  Bash-4.3 changed
Ondrej Oprala 3e4b07
to dequote the argument to programmable completion only under certain
Ondrej Oprala 3e4b07
circumstances, to make the behavior of compgen more consistent when run
Ondrej Oprala 3e4b07
from the command line -- closer to the behavior when run by a shell function
Ondrej Oprala 3e4b07
run as part of programmable completion.  Bash-completion can pass quoted
Ondrej Oprala 3e4b07
arguments to compgen when the original word to be completed was not quoted,
Ondrej Oprala 3e4b07
expecting programmable completion to dequote the word before attempting
Ondrej Oprala 3e4b07
completion.
Ondrej Oprala 3e4b07
Ondrej Oprala 3e4b07
This patch fixes two cases:
Ondrej Oprala 3e4b07
Ondrej Oprala 3e4b07
1.  An empty string that bash-completion passes to compgen as a quoted null
Ondrej Oprala 3e4b07
    string ('').
Ondrej Oprala 3e4b07
Ondrej Oprala 3e4b07
2.  An unquoted word that bash-completion quotes using single quotes or
Ondrej Oprala 3e4b07
    backslashes before passing it to compgen.
Ondrej Oprala 3e4b07
Ondrej Oprala 3e4b07
In these cases, since readline did not detect a quote character in the original
Ondrej Oprala 3e4b07
word to be completed, bash-4.3 
Ondrej Oprala 3e4b07
Ondrej Oprala 3e4b07
*** ../bash-4.3/externs.h	2014-01-02 14:58:20.000000000 -0500
Ondrej Oprala 3e4b07
--- externs.h	2014-03-13 14:42:57.000000000 -0400
Ondrej Oprala 3e4b07
***************
Ondrej Oprala 3e4b07
*** 325,328 ****
Ondrej Oprala 3e4b07
--- 325,329 ----
Ondrej Oprala 3e4b07
  extern char *sh_backslash_quote_for_double_quotes __P((char *));
Ondrej Oprala 3e4b07
  extern int sh_contains_shell_metas __P((char *));
Ondrej Oprala 3e4b07
+ extern int sh_contains_quotes __P((char *));
Ondrej Oprala 3e4b07
  
Ondrej Oprala 3e4b07
  /* declarations for functions defined in lib/sh/spell.c */
Ondrej Oprala 3e4b07
*** ../bash-4.3/lib/sh/shquote.c	2013-03-31 21:53:32.000000000 -0400
Ondrej Oprala 3e4b07
--- lib/sh/shquote.c	2014-03-13 14:42:57.000000000 -0400
Ondrej Oprala 3e4b07
***************
Ondrej Oprala 3e4b07
*** 312,313 ****
Ondrej Oprala 3e4b07
--- 312,327 ----
Ondrej Oprala 3e4b07
    return (0);
Ondrej Oprala 3e4b07
  }
Ondrej Oprala 3e4b07
+ 
Ondrej Oprala 3e4b07
+ int
Ondrej Oprala 3e4b07
+ sh_contains_quotes (string)
Ondrej Oprala 3e4b07
+      char *string;
Ondrej Oprala 3e4b07
+ {
Ondrej Oprala 3e4b07
+   char *s;
Ondrej Oprala 3e4b07
+ 
Ondrej Oprala 3e4b07
+   for (s = string; s && *s; s++)
Ondrej Oprala 3e4b07
+     {
Ondrej Oprala 3e4b07
+       if (*s == '\'' || *s == '"' || *s == '\\')
Ondrej Oprala 3e4b07
+ 	return 1;
Ondrej Oprala 3e4b07
+     }
Ondrej Oprala 3e4b07
+   return 0;
Ondrej Oprala 3e4b07
+ }
Ondrej Oprala 3e4b07
*** ../bash-4.3/pcomplete.c	2013-08-26 15:23:45.000000000 -0400
Ondrej Oprala 3e4b07
--- pcomplete.c	2014-03-25 17:23:23.000000000 -0400
Ondrej Oprala 3e4b07
***************
Ondrej Oprala 3e4b07
*** 184,187 ****
Ondrej Oprala 3e4b07
--- 184,188 ----
Ondrej Oprala 3e4b07
  COMPSPEC *pcomp_curcs;
Ondrej Oprala 3e4b07
  const char *pcomp_curcmd;
Ondrej Oprala 3e4b07
+ const char *pcomp_curtxt;
Ondrej Oprala 3e4b07
  
Ondrej Oprala 3e4b07
  #ifdef DEBUG
Ondrej Oprala 3e4b07
***************
Ondrej Oprala 3e4b07
*** 754,757 ****
Ondrej Oprala 3e4b07
--- 755,784 ----
Ondrej Oprala 3e4b07
  	  dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
Ondrej Oprala 3e4b07
  	}
Ondrej Oprala 3e4b07
+       /* Intended to solve a mismatched assumption by bash-completion.  If
Ondrej Oprala 3e4b07
+ 	 the text to be completed is empty, but bash-completion turns it into
Ondrej Oprala 3e4b07
+ 	 a quoted string ('') assuming that this code will dequote it before
Ondrej Oprala 3e4b07
+ 	 calling readline, do the dequoting. */
Ondrej Oprala 3e4b07
+       else if (iscompgen && iscompleting &&
Ondrej Oprala 3e4b07
+ 	       pcomp_curtxt && *pcomp_curtxt == 0 &&
Ondrej Oprala 3e4b07
+ 	       text && (*text == '\'' || *text == '"') && text[1] == text[0] && text[2] == 0 && 
Ondrej Oprala 3e4b07
+ 	       rl_filename_dequoting_function)
Ondrej Oprala 3e4b07
+ 	dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
Ondrej Oprala 3e4b07
+       /* Another mismatched assumption by bash-completion.  If compgen is being
Ondrej Oprala 3e4b07
+       	 run as part of bash-completion, and the argument to compgen is not
Ondrej Oprala 3e4b07
+       	 the same as the word originally passed to the programmable completion
Ondrej Oprala 3e4b07
+       	 code, dequote the argument if it has quote characters.  It's an
Ondrej Oprala 3e4b07
+       	 attempt to detect when bash-completion is quoting its filename
Ondrej Oprala 3e4b07
+       	 argument before calling compgen. */
Ondrej Oprala 3e4b07
+       /* We could check whether gen_shell_function_matches is in the call
Ondrej Oprala 3e4b07
+ 	 stack by checking whether the gen-shell-function-matches tag is in
Ondrej Oprala 3e4b07
+ 	 the unwind-protect stack, but there's no function to do that yet.
Ondrej Oprala 3e4b07
+ 	 We could simply check whether we're executing in a function by
Ondrej Oprala 3e4b07
+ 	 checking variable_context, and may end up doing that. */
Ondrej Oprala 3e4b07
+       else if (iscompgen && iscompleting && rl_filename_dequoting_function &&
Ondrej Oprala 3e4b07
+ 	       pcomp_curtxt && text &&
Ondrej Oprala 3e4b07
+ 	       STREQ (pcomp_curtxt, text) == 0 &&
Ondrej Oprala 3e4b07
+ 	       variable_context &&
Ondrej Oprala 3e4b07
+ 	       sh_contains_quotes (text))	/* guess */
Ondrej Oprala 3e4b07
+ 	dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
Ondrej Oprala 3e4b07
        else
Ondrej Oprala 3e4b07
  	dfn = savestring (text);
Ondrej Oprala 3e4b07
***************
Ondrej Oprala 3e4b07
*** 1523,1527 ****
Ondrej Oprala 3e4b07
  {
Ondrej Oprala 3e4b07
    COMPSPEC *cs, *oldcs;
Ondrej Oprala 3e4b07
!   const char *oldcmd;
Ondrej Oprala 3e4b07
    STRINGLIST *ret;
Ondrej Oprala 3e4b07
  
Ondrej Oprala 3e4b07
--- 1550,1554 ----
Ondrej Oprala 3e4b07
  {
Ondrej Oprala 3e4b07
    COMPSPEC *cs, *oldcs;
Ondrej Oprala 3e4b07
!   const char *oldcmd, *oldtxt;
Ondrej Oprala 3e4b07
    STRINGLIST *ret;
Ondrej Oprala 3e4b07
  
Ondrej Oprala 3e4b07
***************
Ondrej Oprala 3e4b07
*** 1546,1552 ****
Ondrej Oprala 3e4b07
--- 1573,1581 ----
Ondrej Oprala 3e4b07
    oldcs = pcomp_curcs;
Ondrej Oprala 3e4b07
    oldcmd = pcomp_curcmd;
Ondrej Oprala 3e4b07
+   oldtxt = pcomp_curtxt;
Ondrej Oprala 3e4b07
  
Ondrej Oprala 3e4b07
    pcomp_curcs = cs;
Ondrej Oprala 3e4b07
    pcomp_curcmd = cmd;
Ondrej Oprala 3e4b07
+   pcomp_curtxt = word;
Ondrej Oprala 3e4b07
  
Ondrej Oprala 3e4b07
    ret = gen_compspec_completions (cs, cmd, word, start, end, foundp);
Ondrej Oprala 3e4b07
***************
Ondrej Oprala 3e4b07
*** 1554,1557 ****
Ondrej Oprala 3e4b07
--- 1583,1587 ----
Ondrej Oprala 3e4b07
    pcomp_curcs = oldcs;
Ondrej Oprala 3e4b07
    pcomp_curcmd = oldcmd;
Ondrej Oprala 3e4b07
+   pcomp_curtxt = oldtxt;
Ondrej Oprala 3e4b07
  
Ondrej Oprala 3e4b07
    /* We need to conditionally handle setting *retryp here */
Ondrej Oprala 3e4b07
*** ../bash-4.3/patchlevel.h	2012-12-29 10:47:57.000000000 -0500
Ondrej Oprala 3e4b07
--- patchlevel.h	2014-03-20 20:01:28.000000000 -0400
Ondrej Oprala 3e4b07
***************
Ondrej Oprala 3e4b07
*** 26,30 ****
Ondrej Oprala 3e4b07
     looks for to find the patch level (for the sccs version string). */
Ondrej Oprala 3e4b07
  
Ondrej Oprala 3e4b07
! #define PATCHLEVEL 9
Ondrej Oprala 3e4b07
  
Ondrej Oprala 3e4b07
  #endif /* _PATCHLEVEL_H_ */
Ondrej Oprala 3e4b07
--- 26,30 ----
Ondrej Oprala 3e4b07
     looks for to find the patch level (for the sccs version string). */
Ondrej Oprala 3e4b07
  
Ondrej Oprala 3e4b07
! #define PATCHLEVEL 10
Ondrej Oprala 3e4b07
  
Ondrej Oprala 3e4b07
  #endif /* _PATCHLEVEL_H_ */