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