psss / rpms / bash

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