BASH PATCH REPORT
|
|
=================
|
|
|
|
Bash-Release: 5.0
|
|
Patch-ID: bash50-001
|
|
|
|
Bug-Reported-by: axel@freakout.de
|
|
Bug-Reference-ID: <201901082050.x08KoShS006731@bongo.freakout.de>
|
|
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2019-01/msg00079.html
|
|
|
|
Bug-Description:
|
|
|
|
Under certain circumstances, the glob expansion code did not remove
|
|
backslashes escaping characters in directory names (or portions of a
|
|
pattern preceding a slash).
|
|
|
|
Patch (apply with `patch -p0'):
|
|
|
|
*** a/bashline.c 2018-11-27 13:20:16.000000000 -0500
|
|
--- b/bashline.c 2019-01-16 16:06:03.000000000 -0500
|
|
***************
|
|
*** 232,235 ****
|
|
--- 232,236 ----
|
|
static int bash_possible_command_completions __P((int, int));
|
|
|
|
+ static int completion_glob_pattern __P((char *));
|
|
static char *glob_complete_word __P((const char *, int));
|
|
static int bash_glob_completion_internal __P((int));
|
|
***************
|
|
*** 1742,1746 ****
|
|
/* This could be a globbing pattern, so try to expand it using pathname
|
|
expansion. */
|
|
! if (!matches && glob_pattern_p (text))
|
|
{
|
|
matches = rl_completion_matches (text, glob_complete_word);
|
|
--- 1743,1747 ----
|
|
/* This could be a globbing pattern, so try to expand it using pathname
|
|
expansion. */
|
|
! if (!matches && completion_glob_pattern ((char *)text))
|
|
{
|
|
matches = rl_completion_matches (text, glob_complete_word);
|
|
***************
|
|
*** 1851,1855 ****
|
|
}
|
|
|
|
! globpat = glob_pattern_p (hint_text);
|
|
|
|
/* If this is an absolute program name, do not check it against
|
|
--- 1852,1856 ----
|
|
}
|
|
|
|
! globpat = completion_glob_pattern ((char *)hint_text);
|
|
|
|
/* If this is an absolute program name, do not check it against
|
|
***************
|
|
*** 3714,3717 ****
|
|
--- 3715,3773 ----
|
|
}
|
|
|
|
+ static int
|
|
+ completion_glob_pattern (string)
|
|
+ char *string;
|
|
+ {
|
|
+ register int c;
|
|
+ char *send;
|
|
+ int open;
|
|
+
|
|
+ DECLARE_MBSTATE;
|
|
+
|
|
+ open = 0;
|
|
+ send = string + strlen (string);
|
|
+
|
|
+ while (c = *string++)
|
|
+ {
|
|
+ switch (c)
|
|
+ {
|
|
+ case '?':
|
|
+ case '*':
|
|
+ return (1);
|
|
+
|
|
+ case '[':
|
|
+ open++;
|
|
+ continue;
|
|
+
|
|
+ case ']':
|
|
+ if (open)
|
|
+ return (1);
|
|
+ continue;
|
|
+
|
|
+ case '+':
|
|
+ case '@':
|
|
+ case '!':
|
|
+ if (*string == '(') /*)*/
|
|
+ return (1);
|
|
+ continue;
|
|
+
|
|
+ case '\\':
|
|
+ if (*string == 0)
|
|
+ return (0);
|
|
+ }
|
|
+
|
|
+ /* Advance one fewer byte than an entire multibyte character to
|
|
+ account for the auto-increment in the loop above. */
|
|
+ #ifdef HANDLE_MULTIBYTE
|
|
+ string--;
|
|
+ ADVANCE_CHAR_P (string, send - string);
|
|
+ string++;
|
|
+ #else
|
|
+ ADVANCE_CHAR_P (string, send - string);
|
|
+ #endif
|
|
+ }
|
|
+ return (0);
|
|
+ }
|
|
+
|
|
static char *globtext;
|
|
static char *globorig;
|
|
***************
|
|
*** 3878,3882 ****
|
|
}
|
|
|
|
! if (t && glob_pattern_p (t) == 0)
|
|
rl_explicit_arg = 1; /* XXX - force glob_complete_word to append `*' */
|
|
FREE (t);
|
|
--- 3934,3938 ----
|
|
}
|
|
|
|
! if (t && completion_glob_pattern (t) == 0)
|
|
rl_explicit_arg = 1; /* XXX - force glob_complete_word to append `*' */
|
|
FREE (t);
|
|
*** a/lib/glob/glob_loop.c 2018-12-31 13:35:15.000000000 -0500
|
|
--- b/lib/glob/glob_loop.c 2019-01-09 09:44:36.000000000 -0500
|
|
***************
|
|
*** 55,59 ****
|
|
|
|
case L('\\'):
|
|
- #if 0
|
|
/* Don't let the pattern end in a backslash (GMATCH returns no match
|
|
if the pattern ends in a backslash anyway), but otherwise return 1,
|
|
--- 55,58 ----
|
|
***************
|
|
*** 61,69 ****
|
|
and it can be removed. */
|
|
return (*p != L('\0'));
|
|
- #else
|
|
- /* The pattern may not end with a backslash. */
|
|
- if (*p++ == L('\0'))
|
|
- return 0;
|
|
- #endif
|
|
}
|
|
|
|
--- 60,63 ----
|
|
*** a/patchlevel.h 2016-06-22 14:51:03.000000000 -0400
|
|
--- b/patchlevel.h 2016-10-01 11:01:28.000000000 -0400
|
|
***************
|
|
*** 26,30 ****
|
|
looks for to find the patch level (for the sccs version string). */
|
|
|
|
! #define PATCHLEVEL 0
|
|
|
|
#endif /* _PATCHLEVEL_H_ */
|
|
--- 26,30 ----
|
|
looks for to find the patch level (for the sccs version string). */
|
|
|
|
! #define PATCHLEVEL 1
|
|
|
|
#endif /* _PATCHLEVEL_H_ */
|