patches/glibc/ports-2.12.1/370-fnmatch.patch
author "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
Mon Apr 16 15:25:36 2012 +0200 (2012-04-16)
changeset 2941 13e40098fffc
permissions -rw-r--r--
cc/gcc: update Linaro GCC revisions to 2012.04

Update Linaro GCC with the latest available revisions.

The 4.7 revision is also released, but the infrastructure is not yet ready for
it in CT-NG.

Signed-off-by: "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
yann@2437
     1
http://sourceware.org/ml/libc-hacker/2002-11/msg00071.html
yann@2437
     2
yann@2437
     3
When fnmatch detects an invalid multibyte character it should fall back to
yann@2437
     4
single byte matching, so that "*" has a chance to match such a string.
yann@2437
     5
yann@2437
     6
Andreas.
yann@2437
     7
yann@2437
     8
2005-04-12  Andreas Schwab  <schwab@suse.de>
yann@2437
     9
yann@2437
    10
	* posix/fnmatch.c (fnmatch): If conversion to wide character
yann@2437
    11
	fails fall back to single byte matching.
yann@2437
    12
yann@2437
    13
Index: posix/fnmatch.c
yann@2437
    14
===================================================================
yann@2437
    15
yann@2437
    16
diff -durN glibc-2.12.1.orig/posix/fnmatch.c glibc-2.12.1/posix/fnmatch.c
yann@2437
    17
--- glibc-2.12.1.orig/posix/fnmatch.c	2007-07-28 22:35:00.000000000 +0200
yann@2437
    18
+++ glibc-2.12.1/posix/fnmatch.c	2009-11-13 00:50:39.000000000 +0100
yann@2437
    19
@@ -327,6 +327,7 @@
yann@2437
    20
 # if HANDLE_MULTIBYTE
yann@2437
    21
   if (__builtin_expect (MB_CUR_MAX, 1) != 1)
yann@2437
    22
     {
yann@2437
    23
+      const char *orig_pattern = pattern;
yann@2437
    24
       mbstate_t ps;
yann@2437
    25
       size_t n;
yann@2437
    26
       const char *p;
yann@2437
    27
@@ -382,10 +383,8 @@
yann@2437
    28
 	  wstring = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t));
yann@2437
    29
 	  n = mbsrtowcs (wstring, &p, n + 1, &ps);
yann@2437
    30
 	  if (__builtin_expect (n == (size_t) -1, 0))
yann@2437
    31
-	    /* Something wrong.
yann@2437
    32
-	       XXX Do we have to set `errno' to something which mbsrtows hasn't
yann@2437
    33
-	       already done?  */
yann@2437
    34
-	    return -1;
yann@2437
    35
+	    /* Something wrong.  Fall back to single byte matching.  */
yann@2437
    36
+	    goto try_singlebyte;
yann@2437
    37
 	  if (p)
yann@2437
    38
 	    {
yann@2437
    39
 	      memset (&ps, '\0', sizeof (ps));
yann@2437
    40
@@ -397,10 +396,8 @@
yann@2437
    41
 	prepare_wstring:
yann@2437
    42
 	  n = mbsrtowcs (NULL, &string, 0, &ps);
yann@2437
    43
 	  if (__builtin_expect (n == (size_t) -1, 0))
yann@2437
    44
-	    /* Something wrong.
yann@2437
    45
-	       XXX Do we have to set `errno' to something which mbsrtows hasn't
yann@2437
    46
-	       already done?  */
yann@2437
    47
-	    return -1;
yann@2437
    48
+	    /* Something wrong.  Fall back to single byte matching.  */
yann@2437
    49
+	    goto try_singlebyte;
yann@2437
    50
 	  wstring = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t));
yann@2437
    51
 	  assert (mbsinit (&ps));
yann@2437
    52
 	  (void) mbsrtowcs (wstring, &string, n + 1, &ps);
yann@2437
    53
@@ -408,6 +405,9 @@
yann@2437
    54
 
yann@2437
    55
       return internal_fnwmatch (wpattern, wstring, wstring + n,
yann@2437
    56
 				flags & FNM_PERIOD, flags, NULL);
yann@2437
    57
+
yann@2437
    58
+    try_singlebyte:
yann@2437
    59
+      pattern = orig_pattern;
yann@2437
    60
     }
yann@2437
    61
 # endif  /* mbstate_t and mbsrtowcs or _LIBC.  */
yann@2437
    62