[cf308924] | 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 |
|
---|