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