| BASH PATCH REPORT |
| ================= |
| |
| Bash-Release: 3.2 |
| Patch-ID: bash32-004 |
| |
| Bug-Reported-by: Stuart Shelton <srcshelton@gmail.com> |
| Bug-Reference-ID: <619141e40610261203y6cda5aa6i23cb24c7aeba996e@mail.gmail.com> |
| Bug-Reference-URL: |
| |
| Bug-Description: |
| |
| A bug in the parameter pattern substitution implementation treated a pattern |
| whose first character was `/' (after expansion) as specifying global |
| replacement. |
| |
| Patch: |
| |
| *** ../bash-3.2/subst.c Tue Sep 19 08:35:09 2006 |
| --- subst.c Thu Oct 26 09:17:50 2006 |
| *************** |
| *** 5707,5712 **** |
| --- 5707,5717 ---- |
| vtype &= ~VT_STARSUB; |
| |
| mflags = 0; |
| + if (patsub && *patsub == '/') |
| + { |
| + mflags |= MATCH_GLOBREP; |
| + patsub++; |
| + } |
| |
| /* Malloc this because expand_string_if_necessary or one of the expansion |
| functions in its call chain may free it on a substitution error. */ |
| *************** |
| *** 5741,5753 **** |
| } |
| |
| /* ksh93 doesn't allow the match specifier to be a part of the expanded |
| ! pattern. This is an extension. */ |
| p = pat; |
| ! if (pat && pat[0] == '/') |
| ! { |
| ! mflags |= MATCH_GLOBREP|MATCH_ANY; |
| ! p++; |
| ! } |
| else if (pat && pat[0] == '#') |
| { |
| mflags |= MATCH_BEG; |
| --- 5746,5757 ---- |
| } |
| |
| /* ksh93 doesn't allow the match specifier to be a part of the expanded |
| ! pattern. This is an extension. Make sure we don't anchor the pattern |
| ! at the beginning or end of the string if we're doing global replacement, |
| ! though. */ |
| p = pat; |
| ! if (mflags & MATCH_GLOBREP) |
| ! mflags |= MATCH_ANY; |
| else if (pat && pat[0] == '#') |
| { |
| mflags |= MATCH_BEG; |
| *** ../bash-3.2/tests/new-exp.right Thu Aug 10 12:00:00 2006 |
| --- tests/new-exp.right Sun Oct 29 16:03:36 2006 |
| *************** |
| *** 430,436 **** |
| Case06---1---A B C::--- |
| Case07---3---A:B:C--- |
| Case08---3---A:B:C--- |
| ! ./new-exp.tests: line 506: /${$(($#-1))}: bad substitution |
| argv[1] = <a> |
| argv[2] = <b> |
| argv[3] = <c> |
| --- 430,436 ---- |
| Case06---1---A B C::--- |
| Case07---3---A:B:C--- |
| Case08---3---A:B:C--- |
| ! ./new-exp.tests: line 506: ${$(($#-1))}: bad substitution |
| argv[1] = <a> |
| argv[2] = <b> |
| argv[3] = <c> |
| *** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 |
| --- patchlevel.h Mon Oct 16 14:22:54 2006 |
| *************** |
| *** 26,30 **** |
| looks for to find the patch level (for the sccs version string). */ |
| |
| ! #define PATCHLEVEL 3 |
| |
| #endif /* _PATCHLEVEL_H_ */ |
| --- 26,30 ---- |
| looks for to find the patch level (for the sccs version string). */ |
| |
| ! #define PATCHLEVEL 4 |
| |
| #endif /* _PATCHLEVEL_H_ */ |