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