patches/glibc/2.9/410-2.9-fnmatch.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jan 17 23:06:02 2010 +0100 (2010-01-17)
changeset 1740 c57458bb354d
parent 1201 c9967a6e3b25
permissions -rw-r--r--
configure: do not require hg when configuring in an hg clone

When configuring in an hg clone, we need hg to compute the version string.
It can happen that users do not have Mercurial (eg. if they got a snapshot
rather that they did a full clone). In this case, we can still run, of
course, so simply fill the version string with a sufficiently explicit
value, that does not require hg. The date is a good candidate.
yann@1201
     1
Original patch from: gentoo/src/patchsets/glibc/2.9/5021_all_2.9-fnmatch.patch
yann@1201
     2
yann@1201
     3
-= BEGIN original header =-
yann@1201
     4
http://sourceware.org/ml/libc-hacker/2002-11/msg00071.html
yann@1201
     5
yann@1201
     6
When fnmatch detects an invalid multibyte character it should fall back to
yann@1201
     7
single byte matching, so that "*" has a chance to match such a string.
yann@1201
     8
yann@1201
     9
Andreas.
yann@1201
    10
yann@1201
    11
2005-04-12  Andreas Schwab  <schwab@suse.de>
yann@1201
    12
yann@1201
    13
	* posix/fnmatch.c (fnmatch): If conversion to wide character
yann@1201
    14
	fails fall back to single byte matching.
yann@1201
    15
yann@1201
    16
-= END original header =-
yann@1201
    17
yann@1201
    18
diff -durN glibc-2_9.orig/posix/fnmatch.c glibc-2_9/posix/fnmatch.c
yann@1201
    19
--- glibc-2_9.orig/posix/fnmatch.c	2007-07-28 22:35:00.000000000 +0200
yann@1201
    20
+++ glibc-2_9/posix/fnmatch.c	2009-02-02 22:01:25.000000000 +0100
yann@1201
    21
@@ -327,6 +327,7 @@
yann@1201
    22
 # if HANDLE_MULTIBYTE
yann@1201
    23
   if (__builtin_expect (MB_CUR_MAX, 1) != 1)
yann@1201
    24
     {
yann@1201
    25
+      const char *orig_pattern = pattern;
yann@1201
    26
       mbstate_t ps;
yann@1201
    27
       size_t n;
yann@1201
    28
       const char *p;
yann@1201
    29
@@ -382,10 +383,8 @@
yann@1201
    30
 	  wstring = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t));
yann@1201
    31
 	  n = mbsrtowcs (wstring, &p, n + 1, &ps);
yann@1201
    32
 	  if (__builtin_expect (n == (size_t) -1, 0))
yann@1201
    33
-	    /* Something wrong.
yann@1201
    34
-	       XXX Do we have to set `errno' to something which mbsrtows hasn't
yann@1201
    35
-	       already done?  */
yann@1201
    36
-	    return -1;
yann@1201
    37
+	    /* Something wrong.  Fall back to single byte matching.  */
yann@1201
    38
+	    goto try_singlebyte;
yann@1201
    39
 	  if (p)
yann@1201
    40
 	    {
yann@1201
    41
 	      memset (&ps, '\0', sizeof (ps));
yann@1201
    42
@@ -397,10 +396,8 @@
yann@1201
    43
 	prepare_wstring:
yann@1201
    44
 	  n = mbsrtowcs (NULL, &string, 0, &ps);
yann@1201
    45
 	  if (__builtin_expect (n == (size_t) -1, 0))
yann@1201
    46
-	    /* Something wrong.
yann@1201
    47
-	       XXX Do we have to set `errno' to something which mbsrtows hasn't
yann@1201
    48
-	       already done?  */
yann@1201
    49
-	    return -1;
yann@1201
    50
+	    /* Something wrong.  Fall back to single byte matching.  */
yann@1201
    51
+	    goto try_singlebyte;
yann@1201
    52
 	  wstring = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t));
yann@1201
    53
 	  assert (mbsinit (&ps));
yann@1201
    54
 	  (void) mbsrtowcs (wstring, &string, n + 1, &ps);
yann@1201
    55
@@ -408,6 +405,9 @@
yann@1201
    56
 
yann@1201
    57
       return internal_fnwmatch (wpattern, wstring, wstring + n,
yann@1201
    58
 				flags & FNM_PERIOD, flags, NULL);
yann@1201
    59
+
yann@1201
    60
+    try_singlebyte:
yann@1201
    61
+      pattern = orig_pattern;
yann@1201
    62
     }
yann@1201
    63
 # endif  /* mbstate_t and mbsrtowcs or _LIBC.  */
yann@1201
    64