bash-4.2-003.patch 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. BASH PATCH REPORT
  2. =================
  3. Bash-Release: 4.2
  4. Patch-ID: bash42-003
  5. Bug-Reported-by: Clark J. Wang <dearvoid@gmail.com>
  6. Bug-Reference-ID: <AANLkTikZ_rVV-frR8Fh0PzhXnMKnm5XsUR-F3qtPPs5G@mail.gmail.com>
  7. Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00136.html
  8. Bug-Description:
  9. When using the pattern replacement and pattern removal word expansions, bash
  10. miscalculates the possible match length in the presence of an unescaped left
  11. bracket without a closing right bracket, resulting in a failure to match
  12. the pattern.
  13. Patch (apply with `patch -p0'):
  14. *** ../bash-4.2-patched/lib/glob/gmisc.c 2011-02-05 16:11:17.000000000 -0500
  15. --- ./lib/glob/gmisc.c 2011-02-18 23:53:42.000000000 -0500
  16. ***************
  17. *** 78,83 ****
  18. size_t wmax;
  19. {
  20. ! wchar_t wc, *wbrack;
  21. ! int matlen, t, in_cclass, in_collsym, in_equiv;
  22. if (*wpat == 0)
  23. --- 78,83 ----
  24. size_t wmax;
  25. {
  26. ! wchar_t wc;
  27. ! int matlen, bracklen, t, in_cclass, in_collsym, in_equiv;
  28. if (*wpat == 0)
  29. ***************
  30. *** 119,123 ****
  31. case L'[':
  32. /* scan for ending `]', skipping over embedded [:...:] */
  33. ! wbrack = wpat;
  34. wc = *wpat++;
  35. do
  36. --- 119,123 ----
  37. case L'[':
  38. /* scan for ending `]', skipping over embedded [:...:] */
  39. ! bracklen = 1;
  40. wc = *wpat++;
  41. do
  42. ***************
  43. *** 125,140 ****
  44. if (wc == 0)
  45. {
  46. ! matlen += wpat - wbrack - 1; /* incremented below */
  47. ! break;
  48. }
  49. else if (wc == L'\\')
  50. {
  51. ! wc = *wpat++;
  52. ! if (*wpat == 0)
  53. ! break;
  54. }
  55. else if (wc == L'[' && *wpat == L':') /* character class */
  56. {
  57. wpat++;
  58. in_cclass = 1;
  59. }
  60. --- 125,148 ----
  61. if (wc == 0)
  62. {
  63. ! wpat--; /* back up to NUL */
  64. ! matlen += bracklen;
  65. ! goto bad_bracket;
  66. }
  67. else if (wc == L'\\')
  68. {
  69. ! /* *wpat == backslash-escaped character */
  70. ! bracklen++;
  71. ! /* If the backslash or backslash-escape ends the string,
  72. ! bail. The ++wpat skips over the backslash escape */
  73. ! if (*wpat == 0 || *++wpat == 0)
  74. ! {
  75. ! matlen += bracklen;
  76. ! goto bad_bracket;
  77. ! }
  78. }
  79. else if (wc == L'[' && *wpat == L':') /* character class */
  80. {
  81. wpat++;
  82. + bracklen++;
  83. in_cclass = 1;
  84. }
  85. ***************
  86. *** 142,145 ****
  87. --- 150,154 ----
  88. {
  89. wpat++;
  90. + bracklen++;
  91. in_cclass = 0;
  92. }
  93. ***************
  94. *** 147,152 ****
  95. {
  96. wpat++;
  97. if (*wpat == L']') /* right bracket can appear as collating symbol */
  98. ! wpat++;
  99. in_collsym = 1;
  100. }
  101. --- 156,165 ----
  102. {
  103. wpat++;
  104. + bracklen++;
  105. if (*wpat == L']') /* right bracket can appear as collating symbol */
  106. ! {
  107. ! wpat++;
  108. ! bracklen++;
  109. ! }
  110. in_collsym = 1;
  111. }
  112. ***************
  113. *** 154,157 ****
  114. --- 167,171 ----
  115. {
  116. wpat++;
  117. + bracklen++;
  118. in_collsym = 0;
  119. }
  120. ***************
  121. *** 159,164 ****
  122. {
  123. wpat++;
  124. if (*wpat == L']') /* right bracket can appear as equivalence class */
  125. ! wpat++;
  126. in_equiv = 1;
  127. }
  128. --- 173,182 ----
  129. {
  130. wpat++;
  131. + bracklen++;
  132. if (*wpat == L']') /* right bracket can appear as equivalence class */
  133. ! {
  134. ! wpat++;
  135. ! bracklen++;
  136. ! }
  137. in_equiv = 1;
  138. }
  139. ***************
  140. *** 166,174 ****
  141. --- 184,196 ----
  142. {
  143. wpat++;
  144. + bracklen++;
  145. in_equiv = 0;
  146. }
  147. + else
  148. + bracklen++;
  149. }
  150. while ((wc = *wpat++) != L']');
  151. matlen++; /* bracket expression can only match one char */
  152. + bad_bracket:
  153. break;
  154. }
  155. ***************
  156. *** 214,219 ****
  157. size_t max;
  158. {
  159. ! char c, *brack;
  160. ! int matlen, t, in_cclass, in_collsym, in_equiv;
  161. if (*pat == 0)
  162. --- 236,241 ----
  163. size_t max;
  164. {
  165. ! char c;
  166. ! int matlen, bracklen, t, in_cclass, in_collsym, in_equiv;
  167. if (*pat == 0)
  168. ***************
  169. *** 255,259 ****
  170. case '[':
  171. /* scan for ending `]', skipping over embedded [:...:] */
  172. ! brack = pat;
  173. c = *pat++;
  174. do
  175. --- 277,281 ----
  176. case '[':
  177. /* scan for ending `]', skipping over embedded [:...:] */
  178. ! bracklen = 1;
  179. c = *pat++;
  180. do
  181. ***************
  182. *** 261,276 ****
  183. if (c == 0)
  184. {
  185. ! matlen += pat - brack - 1; /* incremented below */
  186. ! break;
  187. }
  188. else if (c == '\\')
  189. {
  190. ! c = *pat++;
  191. ! if (*pat == 0)
  192. ! break;
  193. }
  194. else if (c == '[' && *pat == ':') /* character class */
  195. {
  196. pat++;
  197. in_cclass = 1;
  198. }
  199. --- 283,306 ----
  200. if (c == 0)
  201. {
  202. ! pat--; /* back up to NUL */
  203. ! matlen += bracklen;
  204. ! goto bad_bracket;
  205. }
  206. else if (c == '\\')
  207. {
  208. ! /* *pat == backslash-escaped character */
  209. ! bracklen++;
  210. ! /* If the backslash or backslash-escape ends the string,
  211. ! bail. The ++pat skips over the backslash escape */
  212. ! if (*pat == 0 || *++pat == 0)
  213. ! {
  214. ! matlen += bracklen;
  215. ! goto bad_bracket;
  216. ! }
  217. }
  218. else if (c == '[' && *pat == ':') /* character class */
  219. {
  220. pat++;
  221. + bracklen++;
  222. in_cclass = 1;
  223. }
  224. ***************
  225. *** 278,281 ****
  226. --- 308,312 ----
  227. {
  228. pat++;
  229. + bracklen++;
  230. in_cclass = 0;
  231. }
  232. ***************
  233. *** 283,288 ****
  234. {
  235. pat++;
  236. if (*pat == ']') /* right bracket can appear as collating symbol */
  237. ! pat++;
  238. in_collsym = 1;
  239. }
  240. --- 314,323 ----
  241. {
  242. pat++;
  243. + bracklen++;
  244. if (*pat == ']') /* right bracket can appear as collating symbol */
  245. ! {
  246. ! pat++;
  247. ! bracklen++;
  248. ! }
  249. in_collsym = 1;
  250. }
  251. ***************
  252. *** 290,293 ****
  253. --- 325,329 ----
  254. {
  255. pat++;
  256. + bracklen++;
  257. in_collsym = 0;
  258. }
  259. ***************
  260. *** 295,300 ****
  261. {
  262. pat++;
  263. if (*pat == ']') /* right bracket can appear as equivalence class */
  264. ! pat++;
  265. in_equiv = 1;
  266. }
  267. --- 331,340 ----
  268. {
  269. pat++;
  270. + bracklen++;
  271. if (*pat == ']') /* right bracket can appear as equivalence class */
  272. ! {
  273. ! pat++;
  274. ! bracklen++;
  275. ! }
  276. in_equiv = 1;
  277. }
  278. ***************
  279. *** 302,310 ****
  280. --- 342,354 ----
  281. {
  282. pat++;
  283. + bracklen++;
  284. in_equiv = 0;
  285. }
  286. + else
  287. + bracklen++;
  288. }
  289. while ((c = *pat++) != ']');
  290. matlen++; /* bracket expression can only match one char */
  291. + bad_bracket:
  292. break;
  293. }
  294. *** ../bash-4.2-patched/patchlevel.h Sat Jun 12 20:14:48 2010
  295. --- ./patchlevel.h Thu Feb 24 21:41:34 2011
  296. ***************
  297. *** 26,30 ****
  298. looks for to find the patch level (for the sccs version string). */
  299. ! #define PATCHLEVEL 2
  300. #endif /* _PATCHLEVEL_H_ */
  301. --- 26,30 ----
  302. looks for to find the patch level (for the sccs version string). */
  303. ! #define PATCHLEVEL 3
  304. #endif /* _PATCHLEVEL_H_ */