123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- BASH PATCH REPORT
- =================
- Bash-Release: 4.2
- Patch-ID: bash42-030
- Bug-Reported-by: Roman Rakus <rrakus@redhat.com>
- Bug-Reference-ID: <4D7DD91E.7040808@redhat.com>
- Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-03/msg00126.html
- Bug-Description:
- When attempting to glob strings in a multibyte locale, and those strings
- contain invalid multibyte characters that cause mbsnrtowcs to return 0,
- the globbing code loops infinitely.
- Patch (apply with `patch -p0'):
- *** ../bash-4.2-patched/lib/glob/xmbsrtowcs.c 2010-05-30 18:36:27.000000000 -0400
- --- ./lib/glob/xmbsrtowcs.c 2011-03-22 16:06:47.000000000 -0400
- ***************
- *** 36,39 ****
- --- 36,41 ----
- #if HANDLE_MULTIBYTE
-
- + #define WSBUF_INC 32
- +
- #ifndef FREE
- # define FREE(x) do { if (x) free (x); } while (0)
- ***************
- *** 149,153 ****
- size_t wcnum; /* Number of wide characters in WSBUF */
- mbstate_t state; /* Conversion State */
- ! size_t wcslength; /* Number of wide characters produced by the conversion. */
- const char *end_or_backslash;
- size_t nms; /* Number of multibyte characters to convert at one time. */
- --- 151,155 ----
- size_t wcnum; /* Number of wide characters in WSBUF */
- mbstate_t state; /* Conversion State */
- ! size_t n, wcslength; /* Number of wide characters produced by the conversion. */
- const char *end_or_backslash;
- size_t nms; /* Number of multibyte characters to convert at one time. */
- ***************
- *** 172,176 ****
- tmp_p = p;
- tmp_state = state;
- ! wcslength = mbsnrtowcs(NULL, &tmp_p, nms, 0, &tmp_state);
-
- /* Conversion failed. */
- --- 174,189 ----
- tmp_p = p;
- tmp_state = state;
- !
- ! if (nms == 0 && *p == '\\') /* special initial case */
- ! nms = wcslength = 1;
- ! else
- ! wcslength = mbsnrtowcs (NULL, &tmp_p, nms, 0, &tmp_state);
- !
- ! if (wcslength == 0)
- ! {
- ! tmp_p = p; /* will need below */
- ! tmp_state = state;
- ! wcslength = 1; /* take a single byte */
- ! }
-
- /* Conversion failed. */
- ***************
- *** 187,191 ****
- wchar_t *wstmp;
-
- ! wsbuf_size = wcnum+wcslength+1; /* 1 for the L'\0' or the potential L'\\' */
-
- wstmp = (wchar_t *) realloc (wsbuf, wsbuf_size * sizeof (wchar_t));
- --- 200,205 ----
- wchar_t *wstmp;
-
- ! while (wsbuf_size < wcnum+wcslength+1) /* 1 for the L'\0' or the potential L'\\' */
- ! wsbuf_size += WSBUF_INC;
-
- wstmp = (wchar_t *) realloc (wsbuf, wsbuf_size * sizeof (wchar_t));
- ***************
- *** 200,207 ****
-
- /* Perform the conversion. This is assumed to return 'wcslength'.
- ! * It may set 'p' to NULL. */
- ! mbsnrtowcs(wsbuf+wcnum, &p, nms, wsbuf_size-wcnum, &state);
-
- ! wcnum += wcslength;
-
- if (mbsinit (&state) && (p != NULL) && (*p == '\\'))
- --- 214,229 ----
-
- /* Perform the conversion. This is assumed to return 'wcslength'.
- ! It may set 'p' to NULL. */
- ! n = mbsnrtowcs(wsbuf+wcnum, &p, nms, wsbuf_size-wcnum, &state);
-
- ! /* Compensate for taking single byte on wcs conversion failure above. */
- ! if (wcslength == 1 && (n == 0 || n == (size_t)-1))
- ! {
- ! state = tmp_state;
- ! p = tmp_p;
- ! wsbuf[wcnum++] = *p++;
- ! }
- ! else
- ! wcnum += wcslength;
-
- if (mbsinit (&state) && (p != NULL) && (*p == '\\'))
- ***************
- *** 231,236 ****
- of DESTP and INDICESP are NULL. */
-
- - #define WSBUF_INC 32
- -
- size_t
- xdupmbstowcs (destp, indicesp, src)
- --- 253,256 ----
- *** ../bash-4.2-patched/lib/glob/glob.c 2009-11-14 18:39:30.000000000 -0500
- --- ./lib/glob/glob.c 2012-07-07 12:09:56.000000000 -0400
- ***************
- *** 201,206 ****
- size_t pat_n, dn_n;
-
- pat_n = xdupmbstowcs (&pat_wc, NULL, pat);
- ! dn_n = xdupmbstowcs (&dn_wc, NULL, dname);
-
- ret = 0;
- --- 201,209 ----
- size_t pat_n, dn_n;
-
- + pat_wc = dn_wc = (wchar_t *)NULL;
- +
- pat_n = xdupmbstowcs (&pat_wc, NULL, pat);
- ! if (pat_n != (size_t)-1)
- ! dn_n = xdupmbstowcs (&dn_wc, NULL, dname);
-
- ret = 0;
- ***************
- *** 222,225 ****
- --- 225,230 ----
- ret = 1;
- }
- + else
- + ret = skipname (pat, dname, flags);
-
- FREE (pat_wc);
- ***************
- *** 267,272 ****
- n = xdupmbstowcs (&wpathname, NULL, pathname);
- if (n == (size_t) -1)
- ! /* Something wrong. */
- ! return;
- orig_wpathname = wpathname;
-
- --- 272,280 ----
- n = xdupmbstowcs (&wpathname, NULL, pathname);
- if (n == (size_t) -1)
- ! {
- ! /* Something wrong. Fall back to single-byte */
- ! udequote_pathname (pathname);
- ! return;
- ! }
- orig_wpathname = wpathname;
-
- *** ../bash-4.2-patched/patchlevel.h Sat Jun 12 20:14:48 2010
- --- ./patchlevel.h Thu Feb 24 21:41:34 2011
- ***************
- *** 26,30 ****
- looks for to find the patch level (for the sccs version string). */
-
- ! #define PATCHLEVEL 29
-
- #endif /* _PATCHLEVEL_H_ */
- --- 26,30 ----
- looks for to find the patch level (for the sccs version string). */
-
- ! #define PATCHLEVEL 30
-
- #endif /* _PATCHLEVEL_H_ */
|