]> git.ipfire.org Git - ipfire-2.x.git/blob - src/patches/bash/bash43-016
882d5939b0b96b990fe30eb2dd06bc2e0bd3395d
[ipfire-2.x.git] / src / patches / bash / bash43-016
1 BASH PATCH REPORT
2 =================
3
4 Bash-Release: 4.3
5 Patch-ID: bash43-016
6
7 Bug-Reported-by: Pierre Gaston <pierre.gaston@gmail.com>
8 Bug-Reference-ID: <CAPSX3sTCD61k1VQLJ5r-LWzEt+e7Xc-fxXmwn2u8EA5gJJej8Q@mail.gmail.com>
9 Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00100.html
10
11 Bug-Description:
12
13 An extended glob pattern containing a slash (`/') causes the globbing code
14 to misinterpret it as a directory separator.
15
16 Patch (apply with `patch -p0'):
17 *** ../bash-4.3-patched/lib/glob/glob.c 2014-03-28 10:54:23.000000000 -0400
18 --- lib/glob/glob.c 2014-05-02 10:24:28.000000000 -0400
19 ***************
20 *** 124,127 ****
21 --- 124,129 ----
22 extern wchar_t *glob_patscan_wc __P((wchar_t *, wchar_t *, int));
23
24 + extern char *glob_dirscan __P((char *, int));
25 +
26 /* Compile `glob_loop.c' for single-byte characters. */
27 #define CHAR unsigned char
28 ***************
29 *** 188,191 ****
30 --- 190,196 ----
31 pe = glob_patscan (pp, se, 0); /* end of extglob pattern (( */
32 /* we should check for invalid extglob pattern here */
33 + if (pe == 0)
34 + return 0;
35 +
36 /* if pe != se we have more of the pattern at the end of the extglob
37 pattern. Check the easy case first ( */
38 ***************
39 *** 1016,1020 ****
40 char **result;
41 unsigned int result_size;
42 ! char *directory_name, *filename, *dname;
43 unsigned int directory_len;
44 int free_dirname; /* flag */
45 --- 1021,1025 ----
46 char **result;
47 unsigned int result_size;
48 ! char *directory_name, *filename, *dname, *fn;
49 unsigned int directory_len;
50 int free_dirname; /* flag */
51 ***************
52 *** 1032,1035 ****
53 --- 1037,1052 ----
54 /* Find the filename. */
55 filename = strrchr (pathname, '/');
56 + #if defined (EXTENDED_GLOB)
57 + if (filename && extended_glob)
58 + {
59 + fn = glob_dirscan (pathname, '/');
60 + #if DEBUG_MATCHING
61 + if (fn != filename)
62 + fprintf (stderr, "glob_filename: glob_dirscan: fn (%s) != filename (%s)\n", fn ? fn : "(null)", filename);
63 + #endif
64 + filename = fn;
65 + }
66 + #endif
67 +
68 if (filename == NULL)
69 {
70 *** ../bash-4.3-patched/lib/glob/gmisc.c 2014-03-28 10:54:23.000000000 -0400
71 --- lib/glob/gmisc.c 2014-05-02 09:35:57.000000000 -0400
72 ***************
73 *** 43,46 ****
74 --- 43,48 ----
75 #define WRPAREN L')'
76
77 + extern char *glob_patscan __P((char *, char *, int));
78 +
79 /* Return 1 of the first character of WSTRING could match the first
80 character of pattern WPAT. Wide character version. */
81 ***************
82 *** 376,377 ****
83 --- 378,410 ----
84 return matlen;
85 }
86 +
87 + /* Skip characters in PAT and return the final occurrence of DIRSEP. This
88 + is only called when extended_glob is set, so we have to skip over extglob
89 + patterns x(...) */
90 + char *
91 + glob_dirscan (pat, dirsep)
92 + char *pat;
93 + int dirsep;
94 + {
95 + char *p, *d, *pe, *se;
96 +
97 + d = pe = se = 0;
98 + for (p = pat; p && *p; p++)
99 + {
100 + if (extglob_pattern_p (p))
101 + {
102 + if (se == 0)
103 + se = p + strlen (p) - 1;
104 + pe = glob_patscan (p + 2, se, 0);
105 + if (pe == 0)
106 + continue;
107 + else if (*pe == 0)
108 + break;
109 + p = pe - 1; /* will do increment above */
110 + continue;
111 + }
112 + if (*p == dirsep)
113 + d = p;
114 + }
115 + return d;
116 + }
117
118 *** ../bash-4.3/patchlevel.h 2012-12-29 10:47:57.000000000 -0500
119 --- patchlevel.h 2014-03-20 20:01:28.000000000 -0400
120 ***************
121 *** 26,30 ****
122 looks for to find the patch level (for the sccs version string). */
123
124 ! #define PATCHLEVEL 15
125
126 #endif /* _PATCHLEVEL_H_ */
127 --- 26,30 ----
128 looks for to find the patch level (for the sccs version string). */
129
130 ! #define PATCHLEVEL 16
131
132 #endif /* _PATCHLEVEL_H_ */