[b17b911f] | 1 | 2005-04-12 Andreas Schwab <schwab@suse.de> |
---|
| 2 | |
---|
| 3 | * posix/fnmatch.c (fnmatch): If conversion to wide character |
---|
| 4 | fails fall back to single byte matching. |
---|
| 5 | |
---|
| 6 | Index: posix/fnmatch.c |
---|
| 7 | =================================================================== |
---|
| 8 | --- posix/fnmatch.c.orig 2007-05-18 10:40:34.000000000 +0200 |
---|
| 9 | +++ posix/fnmatch.c 2007-05-18 13:21:47.199478000 +0200 |
---|
| 10 | @@ -327,6 +327,7 @@ |
---|
| 11 | # if HANDLE_MULTIBYTE |
---|
| 12 | if (__builtin_expect (MB_CUR_MAX, 1) != 1) |
---|
| 13 | { |
---|
| 14 | + const char *orig_pattern = pattern; |
---|
| 15 | mbstate_t ps; |
---|
| 16 | size_t n; |
---|
| 17 | const char *p; |
---|
| 18 | @@ -378,10 +379,8 @@ |
---|
| 19 | wstring = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t)); |
---|
| 20 | n = mbsrtowcs (wstring, &p, n + 1, &ps); |
---|
| 21 | if (__builtin_expect (n == (size_t) -1, 0)) |
---|
| 22 | - /* Something wrong. |
---|
| 23 | - XXX Do we have to set `errno' to something which mbsrtows hasn't |
---|
| 24 | - already done? */ |
---|
| 25 | - return -1; |
---|
| 26 | + /* Something wrong. Fall back to single byte matching. */ |
---|
| 27 | + goto try_singlebyte; |
---|
| 28 | if (p) |
---|
| 29 | memset (&ps, '\0', sizeof (ps)); |
---|
| 30 | } |
---|
| 31 | @@ -389,10 +388,8 @@ |
---|
| 32 | { |
---|
| 33 | n = mbsrtowcs (NULL, &string, 0, &ps); |
---|
| 34 | if (__builtin_expect (n == (size_t) -1, 0)) |
---|
| 35 | - /* Something wrong. |
---|
| 36 | - XXX Do we have to set `errno' to something which mbsrtows hasn't |
---|
| 37 | - already done? */ |
---|
| 38 | - return -1; |
---|
| 39 | + /* Something wrong. Fall back to single byte matching. */ |
---|
| 40 | + goto try_singlebyte; |
---|
| 41 | wstring = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t)); |
---|
| 42 | assert (mbsinit (&ps)); |
---|
| 43 | (void) mbsrtowcs (wstring, &string, n + 1, &ps); |
---|
| 44 | @@ -400,6 +397,9 @@ |
---|
| 45 | |
---|
| 46 | return internal_fnwmatch (wpattern, wstring, wstring + n, |
---|
| 47 | flags & FNM_PERIOD, flags, NULL); |
---|
| 48 | + |
---|
| 49 | + try_singlebyte: |
---|
| 50 | + pattern = orig_pattern; |
---|
| 51 | } |
---|
| 52 | # endif /* mbstate_t and mbsrtowcs or _LIBC. */ |
---|
| 53 | |
---|
| 54 | |
---|