1 diff -Nrup a/posix/fnmatch.c b/posix/fnmatch.c
2 --- a/posix/fnmatch.c 2012-05-25 12:37:26.566678872 -0400
3 +++ b/posix/fnmatch.c 2012-05-25 13:08:44.451972286 -0400
4 @@ -333,6 +333,7 @@ fnmatch (pattern, string, flags)
6 if (__builtin_expect (MB_CUR_MAX, 1) != 1)
8 + const char *orig_pattern = pattern;
12 @@ -356,10 +357,9 @@ fnmatch (pattern, string, flags)
14 n = mbsrtowcs (wpattern, &p, n + 1, &ps);
15 if (__builtin_expect (n == (size_t) -1, 0))
17 - XXX Do we have to set `errno' to something which mbsrtows hasn't
20 + /* Something wrong: Fall back to single byte matching. */
21 + goto try_singlebyte;
25 memset (&ps, '\0', sizeof (ps));
26 @@ -371,10 +371,8 @@ fnmatch (pattern, string, flags)
28 n = mbsrtowcs (NULL, &pattern, 0, &ps);
29 if (__builtin_expect (n == (size_t) -1, 0))
31 - XXX Do we have to set `errno' to something which mbsrtows hasn't
34 + /* Something wrong: Fall back to single byte matching. */
35 + goto try_singlebyte;
36 if (__builtin_expect (n >= (size_t) -1 / sizeof (wchar_t), 0))
39 @@ -401,14 +399,8 @@ fnmatch (pattern, string, flags)
41 n = mbsrtowcs (wstring, &p, n + 1, &ps);
42 if (__builtin_expect (n == (size_t) -1, 0))
45 - XXX Do we have to set `errno' to something which
46 - mbsrtows hasn't already done? */
48 - free (wpattern_malloc);
51 + /* Something wrong: Fall back to single byte matching. */
52 + goto free_and_try_singlebyte;
55 memset (&ps, '\0', sizeof (ps));
56 @@ -420,10 +412,8 @@ fnmatch (pattern, string, flags)
58 n = mbsrtowcs (NULL, &string, 0, &ps);
59 if (__builtin_expect (n == (size_t) -1, 0))
61 - XXX Do we have to set `errno' to something which mbsrtows hasn't
64 + /* Something wrong: Fall back to single byte matching. */
65 + goto free_and_try_singlebyte;
66 if (__builtin_expect (n >= (size_t) -1 / sizeof (wchar_t), 0))
68 free (wpattern_malloc);
69 @@ -450,6 +440,11 @@ fnmatch (pattern, string, flags)
70 free (wpattern_malloc);
74 + free_and_try_singlebyte:
75 + free(wpattern_malloc);
77 + pattern = orig_pattern;
79 # endif /* mbstate_t and mbsrtowcs or _LIBC. */