summaryrefslogtreecommitdiffstats
path: root/package/bash/bash30-004
diff options
context:
space:
mode:
Diffstat (limited to 'package/bash/bash30-004')
-rw-r--r--package/bash/bash30-004145
1 files changed, 145 insertions, 0 deletions
diff --git a/package/bash/bash30-004 b/package/bash/bash30-004
new file mode 100644
index 000000000..b18e54c58
--- /dev/null
+++ b/package/bash/bash30-004
@@ -0,0 +1,145 @@
+ BASH PATCH REPORT
+ =================
+
+Bash-Release: 3.0
+Patch-ID: bash30-004
+
+Bug-Reported-by: Stephane Chazelas <stephane_chazelas@yahoo.fr>
+Bug-Reference-ID: <20040902131957.GC1860@frhdtmp102861.morse.corp.wan>
+Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2004-07/msg00291.html
+
+Bug-Description:
+
+Calculation of lengths and offsets for parameter string length and substring
+expansion does not correctly account for multibyte characters.
+
+Patch:
+
+ *** ../bash-3.0/subst.c Sun Jul 4 13:56:13 2004
+--- subst.c Thu Aug 12 13:36:17 2004
+***************
+*** 4692,4695 ****
+--- 4692,4715 ----
+ }
+
++ #if defined (HANDLE_MULTIBYTE)
++ size_t
++ mbstrlen (s)
++ const char *s;
++ {
++ size_t clen, nc;
++ mbstate_t mbs;
++
++ nc = 0;
++ memset (&mbs, 0, sizeof (mbs));
++ while ((clen = mbrlen(s, MB_CUR_MAX, &mbs)) != 0 && (MB_INVALIDCH(clen) == 0))
++ {
++ s += clen;
++ nc++;
++ }
++ return nc;
++ }
++ #endif
++
++
+ /* Handle the parameter brace expansion that requires us to return the
+ length of a parameter. */
+***************
+*** 4747,4758 ****
+ {
+ t = get_dollar_var_value (arg_index);
+! number = STRLEN (t);
+ FREE (t);
+ }
+ #if defined (ARRAY_VARS)
+! else if ((var = find_variable (name + 1)) && array_p (var))
+ {
+ t = array_reference (array_cell (var), 0);
+! number = STRLEN (t);
+ }
+ #endif
+--- 4767,4778 ----
+ {
+ t = get_dollar_var_value (arg_index);
+! number = MB_STRLEN (t);
+ FREE (t);
+ }
+ #if defined (ARRAY_VARS)
+! else if ((var = find_variable (name + 1)) && (invisible_p (var) == 0) && array_p (var))
+ {
+ t = array_reference (array_cell (var), 0);
+! number = MB_STRLEN (t);
+ }
+ #endif
+***************
+*** 4767,4771 ****
+ dispose_words (list);
+
+! number = STRLEN (t);
+ FREE (t);
+ }
+--- 4787,4791 ----
+ dispose_words (list);
+
+! number = MB_STRLEN (t);
+ FREE (t);
+ }
+***************
+*** 4872,4876 ****
+ case VT_VARIABLE:
+ case VT_ARRAYMEMBER:
+! len = strlen (value);
+ break;
+ case VT_POSPARMS:
+--- 4892,4896 ----
+ case VT_VARIABLE:
+ case VT_ARRAYMEMBER:
+! len = MB_STRLEN (value);
+ break;
+ case VT_POSPARMS:
+*** ../bash-3.0/include/shmbutil.h Mon Apr 19 09:59:42 2004
+--- include/shmbutil.h Thu Sep 2 15:20:47 2004
+***************
+*** 32,35 ****
+--- 32,37 ----
+ extern size_t xdupmbstowcs __P((wchar_t **, char ***, const char *));
+
++ extern size_t mbstrlen __P((const char *));
++
+ extern char *xstrchr __P((const char *, int));
+
+***************
+*** 39,42 ****
+--- 41,47 ----
+ #endif
+
++ #define MBSLEN(s) (((s) && (s)[0]) ? ((s)[1] ? mbstrlen (s) : 1) : 0)
++ #define MB_STRLEN(s) ((MB_CUR_MAX > 1) ? MBSLEN (s) : STRLEN (s))
++
+ #else /* !HANDLE_MULTIBYTE */
+
+***************
+*** 54,57 ****
+--- 59,64 ----
+ #define MB_NULLWCH(x) (0)
+ #endif
++
++ #define MB_STRLEN(s) (STRLEN(s))
+
+ #endif /* !HANDLE_MULTIBYTE */
+
+*** ../bash-3.0/patchlevel.h Wed Aug 22 08:05:39 2001
+--- patchlevel.h Thu Sep 2 15:04:32 2004
+***************
+*** 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_ */