website: manual: refresh qi.html to be reflected on the website
[dragora.git] / patches / bash / bash50-001
blob169317dedd55d3b87c8c00677ccbcc5554a88b75
1                              BASH PATCH REPORT
2                              =================
4 Bash-Release:   5.0
5 Patch-ID:       bash50-001
7 Bug-Reported-by:        axel@freakout.de
8 Bug-Reference-ID:       <201901082050.x08KoShS006731@bongo.freakout.de>
9 Bug-Reference-URL:      http://lists.gnu.org/archive/html/bug-bash/2019-01/msg00079.html
11 Bug-Description:
13 Under certain circumstances, the glob expansion code did not remove
14 backslashes escaping characters in directory names (or portions of a
15 pattern preceding a slash).
17 Patch (apply with `patch -p0'):
19 *** ../bash-5.0/bashline.c      2018-11-27 13:20:16.000000000 -0500
20 --- bashline.c  2019-01-16 16:06:03.000000000 -0500
21 ***************
22 *** 232,235 ****
23 --- 232,236 ----
24   static int bash_possible_command_completions __P((int, int));
25   
26 + static int completion_glob_pattern __P((char *));
27   static char *glob_complete_word __P((const char *, int));
28   static int bash_glob_completion_internal __P((int));
29 ***************
30 *** 1742,1746 ****
31     /* This could be a globbing pattern, so try to expand it using pathname
32        expansion. */
33 !   if (!matches && glob_pattern_p (text))
34       {
35         matches = rl_completion_matches (text, glob_complete_word);
36 --- 1743,1747 ----
37     /* This could be a globbing pattern, so try to expand it using pathname
38        expansion. */
39 !   if (!matches && completion_glob_pattern ((char *)text))
40       {
41         matches = rl_completion_matches (text, glob_complete_word);
42 ***************
43 *** 1851,1855 ****
44         }
45   
46 !       globpat = glob_pattern_p (hint_text);
47   
48         /* If this is an absolute program name, do not check it against
49 --- 1852,1856 ----
50         }
51   
52 !       globpat = completion_glob_pattern ((char *)hint_text);
53   
54         /* If this is an absolute program name, do not check it against
55 ***************
56 *** 3714,3717 ****
57 --- 3715,3773 ----
58   }
59   
60 + static int
61 + completion_glob_pattern (string)
62 +      char *string;
63 + {
64 +   register int c;
65 +   char *send;
66 +   int open;
67
68 +   DECLARE_MBSTATE;
69
70 +   open = 0;
71 +   send = string + strlen (string);
72
73 +   while (c = *string++)
74 +     {
75 +       switch (c)
76 +       {
77 +       case '?':
78 +       case '*':
79 +         return (1);
80
81 +       case '[':
82 +         open++;
83 +         continue;
84
85 +       case ']':
86 +         if (open)
87 +           return (1);
88 +         continue;
89
90 +       case '+':
91 +       case '@':
92 +       case '!':
93 +         if (*string == '(')   /*)*/
94 +           return (1);
95 +         continue;
96
97 +       case '\\':
98 +         if (*string == 0)
99 +           return (0);           
100 +       }
102 +       /* Advance one fewer byte than an entire multibyte character to
103 +        account for the auto-increment in the loop above. */
104 + #ifdef HANDLE_MULTIBYTE
105 +       string--;
106 +       ADVANCE_CHAR_P (string, send - string);
107 +       string++;
108 + #else
109 +       ADVANCE_CHAR_P (string, send - string);
110 + #endif
111 +     }
112 +   return (0);
113 + }
115   static char *globtext;
116   static char *globorig;
117 ***************
118 *** 3878,3882 ****
119       }      
120   
121 !   if (t && glob_pattern_p (t) == 0)
122       rl_explicit_arg = 1;      /* XXX - force glob_complete_word to append `*' */
123     FREE (t);
124 --- 3934,3938 ----
125       }      
126   
127 !   if (t && completion_glob_pattern (t) == 0)
128       rl_explicit_arg = 1;      /* XXX - force glob_complete_word to append `*' */
129     FREE (t);
130 *** ../bash-5.0/lib/glob/glob_loop.c    2018-12-31 13:35:15.000000000 -0500
131 --- lib/glob/glob_loop.c        2019-01-09 09:44:36.000000000 -0500
132 ***************
133 *** 55,59 ****
134   
135         case L('\\'):
136 - #if 0
137         /* Don't let the pattern end in a backslash (GMATCH returns no match
138            if the pattern ends in a backslash anyway), but otherwise return 1,
139 --- 55,58 ----
140 ***************
141 *** 61,69 ****
142            and it can be removed. */
143         return (*p != L('\0'));
144 - #else
145 -       /* The pattern may not end with a backslash. */
146 -       if (*p++ == L('\0'))
147 -         return 0;
148 - #endif
149         }
150   
151 --- 60,63 ----
152 *** ../bash-5.0/patchlevel.h    2016-06-22 14:51:03.000000000 -0400
153 --- patchlevel.h        2016-10-01 11:01:28.000000000 -0400
154 ***************
155 *** 26,30 ****
156      looks for to find the patch level (for the sccs version string). */
157   
158 ! #define PATCHLEVEL 0
159   
160   #endif /* _PATCHLEVEL_H_ */
161 --- 26,30 ----
162      looks for to find the patch level (for the sccs version string). */
163   
164 ! #define PATCHLEVEL 1
165   
166   #endif /* _PATCHLEVEL_H_ */