source: npl/system/bash/bash-4.3-patches/bash43-016 @ 551a8d2

Last change on this file since 551a8d2 was c5c522c, checked in by Edwin Eefting <edwin@datux.nl>, 8 years ago

initial commit, transferred from cleaned syn3 svn tree

  • Property mode set to 100644
File size: 3.6 KB
Line 
1                             BASH PATCH REPORT
2                             =================
3
4Bash-Release:   4.3
5Patch-ID:       bash43-016
6
7Bug-Reported-by:        Pierre Gaston <pierre.gaston@gmail.com>
8Bug-Reference-ID:       <CAPSX3sTCD61k1VQLJ5r-LWzEt+e7Xc-fxXmwn2u8EA5gJJej8Q@mail.gmail.com>
9Bug-Reference-URL:      http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00100.html
10
11Bug-Description:
12
13An extended glob pattern containing a slash (`/') causes the globbing code
14to misinterpret it as a directory separator.
15
16Patch (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_ */
Note: See TracBrowser for help on using the repository browser.