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