components/bash/patches/bash42-030.patch
changeset 1082 6d49548fa9da
equal deleted inserted replaced
1081:3d086c82286d 1082:6d49548fa9da
       
     1 			     BASH PATCH REPORT
       
     2 			     =================
       
     3 
       
     4 Bash-Release:	4.2
       
     5 Patch-ID:	bash42-030
       
     6 
       
     7 Bug-Reported-by:	Roman Rakus <[email protected]>
       
     8 Bug-Reference-ID:	<[email protected]>
       
     9 Bug-Reference-URL:	http://lists.gnu.org/archive/html/bug-bash/2011-03/msg00126.html
       
    10 
       
    11 Bug-Description:
       
    12 
       
    13 When attempting to glob strings in a multibyte locale, and those strings
       
    14 contain invalid multibyte characters that cause mbsnrtowcs to return 0,
       
    15 the globbing code loops infinitely.
       
    16 
       
    17 Patch (apply with `patch -p0'):
       
    18 
       
    19 *** ../bash-4.2-patched/lib/glob/xmbsrtowcs.c	2010-05-30 18:36:27.000000000 -0400
       
    20 --- lib/glob/xmbsrtowcs.c	2011-03-22 16:06:47.000000000 -0400
       
    21 ***************
       
    22 *** 36,39 ****
       
    23 --- 36,41 ----
       
    24   #if HANDLE_MULTIBYTE
       
    25   
       
    26 + #define WSBUF_INC 32
       
    27 + 
       
    28   #ifndef FREE
       
    29   #  define FREE(x)	do { if (x) free (x); } while (0)
       
    30 ***************
       
    31 *** 149,153 ****
       
    32     size_t wcnum;		/* Number of wide characters in WSBUF */
       
    33     mbstate_t state;	/* Conversion State */
       
    34 !   size_t wcslength;	/* Number of wide characters produced by the conversion. */
       
    35     const char *end_or_backslash;
       
    36     size_t nms;	/* Number of multibyte characters to convert at one time. */
       
    37 --- 151,155 ----
       
    38     size_t wcnum;		/* Number of wide characters in WSBUF */
       
    39     mbstate_t state;	/* Conversion State */
       
    40 !   size_t n, wcslength;	/* Number of wide characters produced by the conversion. */
       
    41     const char *end_or_backslash;
       
    42     size_t nms;	/* Number of multibyte characters to convert at one time. */
       
    43 ***************
       
    44 *** 172,176 ****
       
    45         tmp_p = p;
       
    46         tmp_state = state;
       
    47 !       wcslength = mbsnrtowcs(NULL, &tmp_p, nms, 0, &tmp_state);
       
    48   
       
    49         /* Conversion failed. */
       
    50 --- 174,189 ----
       
    51         tmp_p = p;
       
    52         tmp_state = state;
       
    53 ! 
       
    54 !       if (nms == 0 && *p == '\\')	/* special initial case */
       
    55 ! 	nms = wcslength = 1;
       
    56 !       else
       
    57 ! 	wcslength = mbsnrtowcs (NULL, &tmp_p, nms, 0, &tmp_state);
       
    58 ! 
       
    59 !       if (wcslength == 0)
       
    60 ! 	{
       
    61 ! 	  tmp_p = p;		/* will need below */
       
    62 ! 	  tmp_state = state;
       
    63 ! 	  wcslength = 1;	/* take a single byte */
       
    64 ! 	}
       
    65   
       
    66         /* Conversion failed. */
       
    67 ***************
       
    68 *** 187,191 ****
       
    69   	  wchar_t *wstmp;
       
    70   
       
    71 ! 	  wsbuf_size = wcnum+wcslength+1;	/* 1 for the L'\0' or the potential L'\\' */
       
    72   
       
    73   	  wstmp = (wchar_t *) realloc (wsbuf, wsbuf_size * sizeof (wchar_t));
       
    74 --- 200,205 ----
       
    75   	  wchar_t *wstmp;
       
    76   
       
    77 ! 	  while (wsbuf_size < wcnum+wcslength+1) /* 1 for the L'\0' or the potential L'\\' */
       
    78 ! 	    wsbuf_size += WSBUF_INC;
       
    79   
       
    80   	  wstmp = (wchar_t *) realloc (wsbuf, wsbuf_size * sizeof (wchar_t));
       
    81 ***************
       
    82 *** 200,207 ****
       
    83   
       
    84         /* Perform the conversion. This is assumed to return 'wcslength'.
       
    85 !        * It may set 'p' to NULL. */
       
    86 !       mbsnrtowcs(wsbuf+wcnum, &p, nms, wsbuf_size-wcnum, &state);
       
    87   
       
    88 !       wcnum += wcslength;
       
    89   
       
    90         if (mbsinit (&state) && (p != NULL) && (*p == '\\'))
       
    91 --- 214,229 ----
       
    92   
       
    93         /* Perform the conversion. This is assumed to return 'wcslength'.
       
    94 ! 	 It may set 'p' to NULL. */
       
    95 !       n = mbsnrtowcs(wsbuf+wcnum, &p, nms, wsbuf_size-wcnum, &state);
       
    96   
       
    97 !       /* Compensate for taking single byte on wcs conversion failure above. */
       
    98 !       if (wcslength == 1 && (n == 0 || n == (size_t)-1))
       
    99 ! 	{
       
   100 ! 	  state = tmp_state;
       
   101 ! 	  p = tmp_p;
       
   102 ! 	  wsbuf[wcnum++] = *p++;
       
   103 ! 	}
       
   104 !       else
       
   105 !         wcnum += wcslength;
       
   106   
       
   107         if (mbsinit (&state) && (p != NULL) && (*p == '\\'))
       
   108 ***************
       
   109 *** 231,236 ****
       
   110      of DESTP and INDICESP are NULL. */
       
   111   
       
   112 - #define WSBUF_INC 32
       
   113 - 
       
   114   size_t
       
   115   xdupmbstowcs (destp, indicesp, src)
       
   116 --- 253,256 ----
       
   117 *** ../bash-4.2-patched/lib/glob/glob.c	2009-11-14 18:39:30.000000000 -0500
       
   118 --- lib/glob/glob.c	2012-07-07 12:09:56.000000000 -0400
       
   119 ***************
       
   120 *** 201,206 ****
       
   121     size_t pat_n, dn_n;
       
   122   
       
   123     pat_n = xdupmbstowcs (&pat_wc, NULL, pat);
       
   124 !   dn_n = xdupmbstowcs (&dn_wc, NULL, dname);
       
   125   
       
   126     ret = 0;
       
   127 --- 201,209 ----
       
   128     size_t pat_n, dn_n;
       
   129   
       
   130 +   pat_wc = dn_wc = (wchar_t *)NULL;
       
   131 + 
       
   132     pat_n = xdupmbstowcs (&pat_wc, NULL, pat);
       
   133 !   if (pat_n != (size_t)-1)
       
   134 !     dn_n = xdupmbstowcs (&dn_wc, NULL, dname);
       
   135   
       
   136     ret = 0;
       
   137 ***************
       
   138 *** 222,225 ****
       
   139 --- 225,230 ----
       
   140   	ret = 1;
       
   141       }
       
   142 +   else
       
   143 +     ret = skipname (pat, dname, flags);
       
   144   
       
   145     FREE (pat_wc);
       
   146 ***************
       
   147 *** 267,272 ****
       
   148     n = xdupmbstowcs (&wpathname, NULL, pathname);
       
   149     if (n == (size_t) -1)
       
   150 !     /* Something wrong. */
       
   151 !     return;
       
   152     orig_wpathname = wpathname;
       
   153   
       
   154 --- 272,280 ----
       
   155     n = xdupmbstowcs (&wpathname, NULL, pathname);
       
   156     if (n == (size_t) -1)
       
   157 !     {
       
   158 !       /* Something wrong.  Fall back to single-byte */
       
   159 !       udequote_pathname (pathname);
       
   160 !       return;
       
   161 !     }
       
   162     orig_wpathname = wpathname;
       
   163   
       
   164 *** ../bash-4.2-patched/patchlevel.h	Sat Jun 12 20:14:48 2010
       
   165 --- patchlevel.h	Thu Feb 24 21:41:34 2011
       
   166 ***************
       
   167 *** 26,30 ****
       
   168      looks for to find the patch level (for the sccs version string). */
       
   169   
       
   170 ! #define PATCHLEVEL 29
       
   171   
       
   172   #endif /* _PATCHLEVEL_H_ */
       
   173 --- 26,30 ----
       
   174      looks for to find the patch level (for the sccs version string). */
       
   175   
       
   176 ! #define PATCHLEVEL 30
       
   177   
       
   178   #endif /* _PATCHLEVEL_H_ */