[c5c522c] | 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_ */ |
---|