Bash-4.3 patch 10

This commit is contained in:
Chet Ramey 2014-04-11 11:05:05 -04:00
commit 2b76266c88
4 changed files with 47 additions and 2 deletions

View file

@ -324,6 +324,7 @@ extern char *sh_un_double_quote __P((char *));
extern char *sh_backslash_quote __P((char *, const char *, int));
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 */
extern int spname __P((char *, char *));

View file

@ -311,3 +311,17 @@ sh_contains_shell_metas (string)
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;
}

View file

@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
#define PATCHLEVEL 9
#define PATCHLEVEL 10
#endif /* _PATCHLEVEL_H_ */

View file

@ -183,6 +183,7 @@ ITEMLIST it_variables = { LIST_DYNAMIC, it_init_variables, (STRINGLIST *)0 };
COMPSPEC *pcomp_curcs;
const char *pcomp_curcmd;
const char *pcomp_curtxt;
#ifdef DEBUG
/* Debugging code */
@ -753,6 +754,32 @@ pcomp_filename_completion_function (text, state)
quoted strings. */
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);
}
@ -1522,7 +1549,7 @@ gen_progcomp_completions (ocmd, cmd, word, start, end, foundp, retryp, lastcs)
COMPSPEC **lastcs;
{
COMPSPEC *cs, *oldcs;
const char *oldcmd;
const char *oldcmd, *oldtxt;
STRINGLIST *ret;
cs = progcomp_search (ocmd);
@ -1545,14 +1572,17 @@ gen_progcomp_completions (ocmd, cmd, word, start, end, foundp, retryp, lastcs)
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);
pcomp_curcs = oldcs;
pcomp_curcmd = oldcmd;
pcomp_curtxt = oldtxt;
/* We need to conditionally handle setting *retryp here */
if (retryp)