| [f0590dc] | 1 | Submitted By: Joe Ciccone <jciccone@gmail.com>
 | 
|---|
 | 2 | Date: 2007-07-23
 | 
|---|
 | 3 | Initial Package Version: 3.2
 | 
|---|
 | 4 | Origin: ftp://ftp.cwru.edu/pub/bash/bash-3.2-patches/
 | 
|---|
 | 5 | Upstream Status: From Upstream
 | 
|---|
 | 6 | Description: Contains patches 001-017 from upstream
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 | diff -Naur bash-3.2.orig/array.c bash-3.2/array.c
 | 
|---|
 | 9 | --- bash-3.2.orig/array.c       2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 10 | +++ bash-3.2/array.c    2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 11 | @@ -120,7 +120,6 @@
 | 
|---|
 | 12 |         return(a1);
 | 
|---|
 | 13 |  }
 | 
|---|
 | 14 |  
 | 
|---|
 | 15 | -#ifdef INCLUDE_UNUSED
 | 
|---|
 | 16 |  /*
 | 
|---|
 | 17 |   * Make and return a new array composed of the elements in array A from
 | 
|---|
 | 18 |   * S to E, inclusive.
 | 
|---|
 | 19 | @@ -141,13 +140,12 @@
 | 
|---|
 | 20 |         for (p = s, i = 0; p != e; p = element_forw(p), i++) {
 | 
|---|
 | 21 |                 n = array_create_element (element_index(p), element_value(p));
 | 
|---|
 | 22 |                 ADD_BEFORE(a->head, n);
 | 
|---|
 | 23 | -               mi = element_index(ae);
 | 
|---|
 | 24 | +               mi = element_index(n);
 | 
|---|
 | 25 |         }
 | 
|---|
 | 26 |         a->num_elements = i;
 | 
|---|
 | 27 |         a->max_index = mi;
 | 
|---|
 | 28 |         return a;
 | 
|---|
 | 29 |  }
 | 
|---|
 | 30 | -#endif
 | 
|---|
 | 31 |  
 | 
|---|
 | 32 |  /*
 | 
|---|
 | 33 |   * Walk the array, calling FUNC once for each element, with the array
 | 
|---|
 | 34 | @@ -300,6 +298,23 @@
 | 
|---|
 | 35 |         return array;
 | 
|---|
 | 36 |  }
 | 
|---|
 | 37 |  
 | 
|---|
 | 38 | +ARRAY  *
 | 
|---|
 | 39 | +array_quote_escapes(array)
 | 
|---|
 | 40 | +ARRAY  *array;
 | 
|---|
 | 41 | +{
 | 
|---|
 | 42 | +       ARRAY_ELEMENT   *a;
 | 
|---|
 | 43 | +       char    *t;
 | 
|---|
 | 44 | +
 | 
|---|
 | 45 | +       if (array == 0 || array_head(array) == 0 || array_empty(array))
 | 
|---|
 | 46 | +               return (ARRAY *)NULL;
 | 
|---|
 | 47 | +       for (a = element_forw(array->head); a != array->head; a = element_forw(a)) {
 | 
|---|
 | 48 | +               t = quote_escapes (a->value);
 | 
|---|
 | 49 | +               FREE(a->value);
 | 
|---|
 | 50 | +               a->value = t;
 | 
|---|
 | 51 | +       }
 | 
|---|
 | 52 | +       return array;
 | 
|---|
 | 53 | +}
 | 
|---|
 | 54 | +
 | 
|---|
 | 55 |  /*
 | 
|---|
 | 56 |   * Return a string whose elements are the members of array A beginning at
 | 
|---|
 | 57 |   * index START and spanning NELEM members.  Null elements are counted.
 | 
|---|
 | 58 | @@ -311,9 +326,10 @@
 | 
|---|
 | 59 |  arrayind_t     start, nelem;
 | 
|---|
 | 60 |  int    starsub, quoted;
 | 
|---|
 | 61 |  {
 | 
|---|
 | 62 | +       ARRAY           *a2;
 | 
|---|
 | 63 |         ARRAY_ELEMENT   *h, *p;
 | 
|---|
 | 64 |         arrayind_t      i;
 | 
|---|
 | 65 | -       char            *ifs, sep[2];
 | 
|---|
 | 66 | +       char            *ifs, sep[2], *t;
 | 
|---|
 | 67 |  
 | 
|---|
 | 68 |         p = a ? array_head (a) : 0;
 | 
|---|
 | 69 |         if (p == 0 || array_empty (a) || start > array_max_index(a))
 | 
|---|
 | 70 | @@ -336,6 +352,13 @@
 | 
|---|
 | 71 |         for (i = 0, h = p; p != a->head && i < nelem; i++, p = element_forw(p))
 | 
|---|
 | 72 |                 ;
 | 
|---|
 | 73 |  
 | 
|---|
 | 74 | +       a2 = array_slice(a, h, p);
 | 
|---|
 | 75 | +
 | 
|---|
 | 76 | +       if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))
 | 
|---|
 | 77 | +               array_quote(a2);
 | 
|---|
 | 78 | +       else
 | 
|---|
 | 79 | +               array_quote_escapes(a2);
 | 
|---|
 | 80 | +
 | 
|---|
 | 81 |         if (starsub && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) {
 | 
|---|
 | 82 |                 ifs = getifs();
 | 
|---|
 | 83 |                 sep[0] = ifs ? *ifs : '\0';
 | 
|---|
 | 84 | @@ -343,7 +366,10 @@
 | 
|---|
 | 85 |                 sep[0] = ' ';
 | 
|---|
 | 86 |         sep[1] = '\0';
 | 
|---|
 | 87 |  
 | 
|---|
 | 88 | -       return (array_to_string_internal (h, p, sep, quoted));
 | 
|---|
 | 89 | +       t = array_to_string (a2, sep, 0);
 | 
|---|
 | 90 | +       array_dispose(a2);
 | 
|---|
 | 91 | +
 | 
|---|
 | 92 | +       return t;
 | 
|---|
 | 93 |  }
 | 
|---|
 | 94 |  
 | 
|---|
 | 95 |  char *
 | 
|---|
 | 96 | @@ -367,7 +393,9 @@
 | 
|---|
 | 97 |         }
 | 
|---|
 | 98 |  
 | 
|---|
 | 99 |         if (mflags & MATCH_QUOTED)
 | 
|---|
 | 100 | -               array_quote (a2);
 | 
|---|
 | 101 | +               array_quote(a2);
 | 
|---|
 | 102 | +       else
 | 
|---|
 | 103 | +               array_quote_escapes(a2);
 | 
|---|
 | 104 |         if (mflags & MATCH_STARSUB) {
 | 
|---|
 | 105 |                 ifs = getifs();
 | 
|---|
 | 106 |                 sifs[0] = ifs ? *ifs : '\0';
 | 
|---|
 | 107 | diff -Naur bash-3.2.orig/array.h bash-3.2/array.h
 | 
|---|
 | 108 | --- bash-3.2.orig/array.h       2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 109 | +++ bash-3.2/array.h    2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 110 | @@ -55,6 +55,7 @@
 | 
|---|
 | 111 |  extern ARRAY_ELEMENT *array_unshift_element __P((ARRAY *));
 | 
|---|
 | 112 |  extern int     array_shift_element __P((ARRAY *, char *));
 | 
|---|
 | 113 |  extern ARRAY   *array_quote __P((ARRAY *));
 | 
|---|
 | 114 | +extern ARRAY   *array_quote_escapes __P((ARRAY *));
 | 
|---|
 | 115 |  
 | 
|---|
 | 116 |  extern char    *array_subrange __P((ARRAY *, arrayind_t, arrayind_t, int, int));
 | 
|---|
 | 117 |  extern char    *array_patsub __P((ARRAY *, char *, char *, int));
 | 
|---|
 | 118 | diff -Naur bash-3.2.orig/builtins/common.c bash-3.2/builtins/common.c
 | 
|---|
 | 119 | --- bash-3.2.orig/builtins/common.c     2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 120 | +++ bash-3.2/builtins/common.c  2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 121 | @@ -1,4 +1,4 @@
 | 
|---|
 | 122 | -/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
 | 
|---|
 | 123 | +/* Copyright (C) 1987-2007 Free Software Foundation, Inc.
 | 
|---|
 | 124 |  
 | 
|---|
 | 125 |     This file is part of GNU Bash, the Bourne Again SHell.
 | 
|---|
 | 126 |  
 | 
|---|
 | 127 | @@ -475,7 +475,11 @@
 | 
|---|
 | 128 |  
 | 
|---|
 | 129 |    if (the_current_working_directory == 0)
 | 
|---|
 | 130 |      {
 | 
|---|
 | 131 | +#if defined (GETCWD_BROKEN)
 | 
|---|
 | 132 | +      the_current_working_directory = getcwd (0, PATH_MAX);
 | 
|---|
 | 133 | +#else
 | 
|---|
 | 134 |        the_current_working_directory = getcwd (0, 0);
 | 
|---|
 | 135 | +#endif
 | 
|---|
 | 136 |        if (the_current_working_directory == 0)
 | 
|---|
 | 137 |         {
 | 
|---|
 | 138 |           fprintf (stderr, _("%s: error retrieving current directory: %s: %s\n"),
 | 
|---|
 | 139 | diff -Naur bash-3.2.orig/builtins/printf.def bash-3.2/builtins/printf.def
 | 
|---|
 | 140 | --- bash-3.2.orig/builtins/printf.def   2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 141 | +++ bash-3.2/builtins/printf.def        2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 142 | @@ -1,7 +1,7 @@
 | 
|---|
 | 143 |  This file is printf.def, from which is created printf.c.
 | 
|---|
 | 144 |  It implements the builtin "printf" in Bash.
 | 
|---|
 | 145 |  
 | 
|---|
 | 146 | -Copyright (C) 1997-2005 Free Software Foundation, Inc.
 | 
|---|
 | 147 | +Copyright (C) 1997-2007 Free Software Foundation, Inc.
 | 
|---|
 | 148 |  
 | 
|---|
 | 149 |  This file is part of GNU Bash, the Bourne Again SHell.
 | 
|---|
 | 150 |  
 | 
|---|
 | 151 | @@ -49,6 +49,12 @@
 | 
|---|
 | 152 |  #  define INT_MIN              (-2147483647-1)
 | 
|---|
 | 153 |  #endif
 | 
|---|
 | 154 |  
 | 
|---|
 | 155 | +#if defined (PREFER_STDARG)
 | 
|---|
 | 156 | +#  include <stdarg.h>
 | 
|---|
 | 157 | +#else
 | 
|---|
 | 158 | +#  include <varargs.h>
 | 
|---|
 | 159 | +#endif
 | 
|---|
 | 160 | +
 | 
|---|
 | 161 |  #include <stdio.h>
 | 
|---|
 | 162 |  #include <chartypes.h>
 | 
|---|
 | 163 |  
 | 
|---|
 | 164 | @@ -64,6 +70,10 @@
 | 
|---|
 | 165 |  #include "bashgetopt.h"
 | 
|---|
 | 166 |  #include "common.h"
 | 
|---|
 | 167 |  
 | 
|---|
 | 168 | +#if defined (PRI_MACROS_BROKEN)
 | 
|---|
 | 169 | +#  undef PRIdMAX
 | 
|---|
 | 170 | +#endif
 | 
|---|
 | 171 | +
 | 
|---|
 | 172 |  #if !defined (PRIdMAX)
 | 
|---|
 | 173 |  #  if HAVE_LONG_LONG
 | 
|---|
 | 174 |  #    define PRIdMAX    "lld"
 | 
|---|
 | 175 | @@ -151,6 +161,10 @@
 | 
|---|
 | 176 |  #define SKIP1 "#'-+ 0"
 | 
|---|
 | 177 |  #define LENMODS "hjlLtz"
 | 
|---|
 | 178 |  
 | 
|---|
 | 179 | +#ifndef HAVE_ASPRINTF
 | 
|---|
 | 180 | +extern int asprintf __P((char **, const char *, ...)) __attribute__((__format__ (printf, 2, 3)));
 | 
|---|
 | 181 | +#endif
 | 
|---|
 | 182 | +
 | 
|---|
 | 183 |  static void printf_erange __P((char *));
 | 
|---|
 | 184 |  static int printstr __P((char *, char *, int, int, int));
 | 
|---|
 | 185 |  static int tescape __P((char *, char *, int *));
 | 
|---|
 | 186 | diff -Naur bash-3.2.orig/config-bot.h bash-3.2/config-bot.h
 | 
|---|
 | 187 | --- bash-3.2.orig/config-bot.h  2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 188 | +++ bash-3.2/config-bot.h       2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 189 | @@ -1,7 +1,7 @@
 | 
|---|
 | 190 |  /* config-bot.h */
 | 
|---|
 | 191 |  /* modify settings or make new ones based on what autoconf tells us. */
 | 
|---|
 | 192 |  
 | 
|---|
 | 193 | -/* Copyright (C) 1989-2002 Free Software Foundation, Inc.
 | 
|---|
 | 194 | +/* Copyright (C) 1989-2007 Free Software Foundation, Inc.
 | 
|---|
 | 195 |  
 | 
|---|
 | 196 |     This file is part of GNU Bash, the Bourne Again SHell.
 | 
|---|
 | 197 |  
 | 
|---|
 | 198 | @@ -70,9 +70,11 @@
 | 
|---|
 | 199 |  #  define TERMIOS_MISSING
 | 
|---|
 | 200 |  #endif
 | 
|---|
 | 201 |  
 | 
|---|
 | 202 | -/* If we have a getcwd(3), but it calls popen(), #undef HAVE_GETCWD so
 | 
|---|
 | 203 | -   the replacement in getcwd.c will be built. */
 | 
|---|
 | 204 | -#if defined (HAVE_GETCWD) && defined (GETCWD_BROKEN)
 | 
|---|
 | 205 | +/* If we have a getcwd(3), but one that does not dynamically allocate memory,
 | 
|---|
 | 206 | +   #undef HAVE_GETCWD so the replacement in getcwd.c will be built.  We do
 | 
|---|
 | 207 | +   not do this on Solaris, because their implementation of loopback mounts
 | 
|---|
 | 208 | +   breaks the traditional file system assumptions that getcwd uses. */
 | 
|---|
 | 209 | +#if defined (HAVE_GETCWD) && defined (GETCWD_BROKEN) && !defined (SOLARIS)
 | 
|---|
 | 210 |  #  undef HAVE_GETCWD
 | 
|---|
 | 211 |  #endif
 | 
|---|
 | 212 |  
 | 
|---|
 | 213 | diff -Naur bash-3.2.orig/config.h.in bash-3.2/config.h.in
 | 
|---|
 | 214 | --- bash-3.2.orig/config.h.in   2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 215 | +++ bash-3.2/config.h.in        2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 216 | @@ -1,6 +1,6 @@
 | 
|---|
 | 217 |  /* config.h -- Configuration file for bash. */
 | 
|---|
 | 218 |  
 | 
|---|
 | 219 | -/* Copyright (C) 1987-2006 Free Software Foundation, Inc.
 | 
|---|
 | 220 | +/* Copyright (C) 1987-2007 Free Software Foundation, Inc.
 | 
|---|
 | 221 |  
 | 
|---|
 | 222 |     This file is part of GNU Bash, the Bourne Again SHell.
 | 
|---|
 | 223 |  
 | 
|---|
 | 224 | @@ -413,6 +413,8 @@
 | 
|---|
 | 225 |  
 | 
|---|
 | 226 |  #undef HAVE_DECL_STRTOLD
 | 
|---|
 | 227 |  
 | 
|---|
 | 228 | +#undef PRI_MACROS_BROKEN
 | 
|---|
 | 229 | +
 | 
|---|
 | 230 |  #undef STRTOLD_BROKEN
 | 
|---|
 | 231 |  
 | 
|---|
 | 232 |  /* Define if WCONTINUED is defined in system headers, but rejected by waitpid */
 | 
|---|
 | 233 | @@ -1006,6 +1008,9 @@
 | 
|---|
 | 234 |  /* Define if you have the `dcgettext' function. */
 | 
|---|
 | 235 |  #undef HAVE_DCGETTEXT
 | 
|---|
 | 236 |  
 | 
|---|
 | 237 | +/* Define if you have the `localeconv' function. */
 | 
|---|
 | 238 | +#undef HAVE_LOCALECONV
 | 
|---|
 | 239 | +
 | 
|---|
 | 240 |  /* Define if your system has a working `malloc' function. */
 | 
|---|
 | 241 |  /* #undef HAVE_MALLOC */
 | 
|---|
 | 242 |  
 | 
|---|
 | 243 | diff -Naur bash-3.2.orig/configure bash-3.2/configure
 | 
|---|
 | 244 | --- bash-3.2.orig/configure     2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 245 | +++ bash-3.2/configure  2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 246 | @@ -27316,7 +27316,8 @@
 | 
|---|
 | 247 |  sco3.2v4*)     LOCAL_CFLAGS="-DMUST_UNBLOCK_CHLD -DPATH_MAX=1024" ;;
 | 
|---|
 | 248 |  sco3.2*)       LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;;
 | 
|---|
 | 249 |  sunos4*)       LOCAL_CFLAGS=-DSunOS4 ;;
 | 
|---|
 | 250 | -solaris2.5*)   LOCAL_CFLAGS=-DSunOS5 ;;
 | 
|---|
 | 251 | +solaris2.5*)   LOCAL_CFLAGS="-DSunOS5 -DSOLARIS" ;;
 | 
|---|
 | 252 | +solaris2*)     LOCAL_CFLAGS=-DSOLARIS ;;
 | 
|---|
 | 253 |  lynxos*)       LOCAL_CFLAGS=-DRECYCLES_PIDS ;;
 | 
|---|
 | 254 |  linux*)                LOCAL_LDFLAGS=-rdynamic          # allow dynamic loading
 | 
|---|
 | 255 |                 case "`uname -r`" in
 | 
|---|
 | 256 | diff -Naur bash-3.2.orig/configure.in bash-3.2/configure.in
 | 
|---|
 | 257 | --- bash-3.2.orig/configure.in  2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 258 | +++ bash-3.2/configure.in       2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 259 | @@ -5,7 +5,7 @@
 | 
|---|
 | 260 |  dnl
 | 
|---|
 | 261 |  dnl Process this file with autoconf to produce a configure script.
 | 
|---|
 | 262 |  
 | 
|---|
 | 263 | -# Copyright (C) 1987-2006 Free Software Foundation, Inc.
 | 
|---|
 | 264 | +# Copyright (C) 1987-2007 Free Software Foundation, Inc.
 | 
|---|
 | 265 |  
 | 
|---|
 | 266 |  # This program is free software; you can redistribute it and/or modify
 | 
|---|
 | 267 |  # it under the terms of the GNU General Public License as published by
 | 
|---|
 | 268 | @@ -991,7 +991,8 @@
 | 
|---|
 | 269 |  sco3.2v4*)     LOCAL_CFLAGS="-DMUST_UNBLOCK_CHLD -DPATH_MAX=1024" ;;
 | 
|---|
 | 270 |  sco3.2*)       LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;;
 | 
|---|
 | 271 |  sunos4*)       LOCAL_CFLAGS=-DSunOS4 ;;
 | 
|---|
 | 272 | -solaris2.5*)   LOCAL_CFLAGS=-DSunOS5 ;;
 | 
|---|
 | 273 | +solaris2.5*)   LOCAL_CFLAGS="-DSunOS5 -DSOLARIS" ;;
 | 
|---|
 | 274 | +solaris2*)     LOCAL_CFLAGS=-DSOLARIS ;;
 | 
|---|
 | 275 |  lynxos*)       LOCAL_CFLAGS=-DRECYCLES_PIDS ;;
 | 
|---|
 | 276 |  linux*)                LOCAL_LDFLAGS=-rdynamic          # allow dynamic loading
 | 
|---|
 | 277 |                 case "`uname -r`" in
 | 
|---|
 | 278 | diff -Naur bash-3.2.orig/execute_cmd.c bash-3.2/execute_cmd.c
 | 
|---|
 | 279 | --- bash-3.2.orig/execute_cmd.c 2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 280 | +++ bash-3.2/execute_cmd.c      2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 281 | @@ -1,6 +1,6 @@
 | 
|---|
 | 282 |  /* execute_cmd.c -- Execute a COMMAND structure. */
 | 
|---|
 | 283 |  
 | 
|---|
 | 284 | -/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
 | 
|---|
 | 285 | +/* Copyright (C) 1987-2007 Free Software Foundation, Inc.
 | 
|---|
 | 286 |  
 | 
|---|
 | 287 |     This file is part of GNU Bash, the Bourne Again SHell.
 | 
|---|
 | 288 |  
 | 
|---|
 | 289 | @@ -2546,7 +2546,7 @@
 | 
|---|
 | 290 |        arg1 = cond_expand_word (cond->left->op, 0);
 | 
|---|
 | 291 |        if (arg1 == 0)
 | 
|---|
 | 292 |         arg1 = nullstr;
 | 
|---|
 | 293 | -      arg2 = cond_expand_word (cond->right->op, patmatch||rmatch);
 | 
|---|
 | 294 | +      arg2 = cond_expand_word (cond->right->op, rmatch ? 2 : (patmatch ? 1 : 0));
 | 
|---|
 | 295 |        if (arg2 == 0)
 | 
|---|
 | 296 |         arg2 = nullstr;
 | 
|---|
 | 297 |  
 | 
|---|
 | 298 | @@ -3050,6 +3050,11 @@
 | 
|---|
 | 299 |    if (command_line == 0)
 | 
|---|
 | 300 |      command_line = savestring (the_printed_command_except_trap);
 | 
|---|
 | 301 |  
 | 
|---|
 | 302 | +#if defined (PROCESS_SUBSTITUTION)
 | 
|---|
 | 303 | +  if ((subshell_environment & SUBSHELL_COMSUB) && (simple_command->flags & CMD_NO_FORK) && fifos_pending() > 0)
 | 
|---|
 | 304 | +    simple_command->flags &= ~CMD_NO_FORK;
 | 
|---|
 | 305 | +#endif
 | 
|---|
 | 306 | +
 | 
|---|
 | 307 |    execute_disk_command (words, simple_command->redirects, command_line,
 | 
|---|
 | 308 |                         pipe_in, pipe_out, async, fds_to_close,
 | 
|---|
 | 309 |                         simple_command->flags);
 | 
|---|
 | 310 | diff -Naur bash-3.2.orig/findcmd.c bash-3.2/findcmd.c
 | 
|---|
 | 311 | --- bash-3.2.orig/findcmd.c     2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 312 | +++ bash-3.2/findcmd.c  2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 313 | @@ -308,7 +308,7 @@
 | 
|---|
 | 314 |    if (hashed_file && (posixly_correct || check_hashed_filenames))
 | 
|---|
 | 315 |      {
 | 
|---|
 | 316 |        st = file_status (hashed_file);
 | 
|---|
 | 317 | -      if ((st ^ (FS_EXISTS | FS_EXECABLE)) != 0)
 | 
|---|
 | 318 | +      if ((st & (FS_EXISTS|FS_EXECABLE)) != (FS_EXISTS|FS_EXECABLE))
 | 
|---|
 | 319 |         {
 | 
|---|
 | 320 |           phash_remove (pathname);
 | 
|---|
 | 321 |           free (hashed_file);
 | 
|---|
 | 322 | diff -Naur bash-3.2.orig/jobs.c bash-3.2/jobs.c
 | 
|---|
 | 323 | --- bash-3.2.orig/jobs.c        2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 324 | +++ bash-3.2/jobs.c     2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 325 | @@ -984,8 +984,6 @@
 | 
|---|
 | 326 |    temp = jobs[job_index];
 | 
|---|
 | 327 |    if (temp == 0)
 | 
|---|
 | 328 |      return;
 | 
|---|
 | 329 | -  if (job_index == js.j_current || job_index == js.j_previous)
 | 
|---|
 | 330 | -    reset_current ();
 | 
|---|
 | 331 |  
 | 
|---|
 | 332 |    if ((dflags & DEL_NOBGPID) == 0)
 | 
|---|
 | 333 |      {
 | 
|---|
 | 334 | @@ -1028,6 +1026,9 @@
 | 
|---|
 | 335 |      js.j_firstj = js.j_lastj = 0;
 | 
|---|
 | 336 |    else if (jobs[js.j_firstj] == 0 || jobs[js.j_lastj] == 0)
 | 
|---|
 | 337 |      reset_job_indices ();
 | 
|---|
 | 338 | +
 | 
|---|
 | 339 | +  if (job_index == js.j_current || job_index == js.j_previous)
 | 
|---|
 | 340 | +    reset_current ();
 | 
|---|
 | 341 |  }
 | 
|---|
 | 342 |  
 | 
|---|
 | 343 |  /* Must be called with SIGCHLD blocked. */
 | 
|---|
 | 344 | diff -Naur bash-3.2.orig/lib/readline/display.c bash-3.2/lib/readline/display.c
 | 
|---|
 | 345 | --- bash-3.2.orig/lib/readline/display.c        2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 346 | +++ bash-3.2/lib/readline/display.c     2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 347 | @@ -561,6 +561,17 @@
 | 
|---|
 | 348 |        wrap_offset = prompt_invis_chars_first_line = 0;
 | 
|---|
 | 349 |      }
 | 
|---|
 | 350 |  
 | 
|---|
 | 351 | +#if defined (HANDLE_MULTIBYTE)
 | 
|---|
 | 352 | +#define CHECK_INV_LBREAKS() \
 | 
|---|
 | 353 | +      do { \
 | 
|---|
 | 354 | +       if (newlines >= (inv_lbsize - 2)) \
 | 
|---|
 | 355 | +         { \
 | 
|---|
 | 356 | +           inv_lbsize *= 2; \
 | 
|---|
 | 357 | +           inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
 | 
|---|
 | 358 | +           _rl_wrapped_line = (int *)xrealloc (_rl_wrapped_line, inv_lbsize * sizeof (int)); \
 | 
|---|
 | 359 | +         } \
 | 
|---|
 | 360 | +      } while (0)
 | 
|---|
 | 361 | +#else
 | 
|---|
 | 362 |  #define CHECK_INV_LBREAKS() \
 | 
|---|
 | 363 |        do { \
 | 
|---|
 | 364 |         if (newlines >= (inv_lbsize - 2)) \
 | 
|---|
 | 365 | @@ -569,6 +580,7 @@
 | 
|---|
 | 366 |             inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \
 | 
|---|
 | 367 |           } \
 | 
|---|
 | 368 |        } while (0)
 | 
|---|
 | 369 | +#endif /* HANDLE_MULTIBYTE */
 | 
|---|
 | 370 |  
 | 
|---|
 | 371 |  #if defined (HANDLE_MULTIBYTE)   
 | 
|---|
 | 372 |  #define CHECK_LPOS() \
 | 
|---|
 | 373 | @@ -1586,8 +1598,22 @@
 | 
|---|
 | 374 |           temp = nls - nfd;
 | 
|---|
 | 375 |           if (temp > 0)
 | 
|---|
 | 376 |             {
 | 
|---|
 | 377 | +             /* If nfd begins at the prompt, or before the invisible
 | 
|---|
 | 378 | +                characters in the prompt, we need to adjust _rl_last_c_pos
 | 
|---|
 | 379 | +                in a multibyte locale to account for the wrap offset and
 | 
|---|
 | 380 | +                set cpos_adjusted accordingly. */
 | 
|---|
 | 381 |               _rl_output_some_chars (nfd, temp);
 | 
|---|
 | 382 | -             _rl_last_c_pos += _rl_col_width (nfd, 0, temp);;
 | 
|---|
 | 383 | +             if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
 | 
|---|
 | 384 | +               {
 | 
|---|
 | 385 | +                  _rl_last_c_pos += _rl_col_width (nfd, 0, temp);
 | 
|---|
 | 386 | +                  if (current_line == 0 && wrap_offset &&  ((nfd - new) <= prompt_last_invisible))
 | 
|---|
 | 387 | +                   {
 | 
|---|
 | 388 | +                     _rl_last_c_pos -= wrap_offset;
 | 
|---|
 | 389 | +                     cpos_adjusted = 1;
 | 
|---|
 | 390 | +                   }
 | 
|---|
 | 391 | +               }
 | 
|---|
 | 392 | +              else
 | 
|---|
 | 393 | +                _rl_last_c_pos += temp;
 | 
|---|
 | 394 |             }
 | 
|---|
 | 395 |         }
 | 
|---|
 | 396 |        /* Otherwise, print over the existing material. */
 | 
|---|
 | 397 | @@ -1595,8 +1621,20 @@
 | 
|---|
 | 398 |         {
 | 
|---|
 | 399 |           if (temp > 0)
 | 
|---|
 | 400 |             {
 | 
|---|
 | 401 | +             /* If nfd begins at the prompt, or before the invisible
 | 
|---|
 | 402 | +                characters in the prompt, we need to adjust _rl_last_c_pos
 | 
|---|
 | 403 | +                in a multibyte locale to account for the wrap offset and
 | 
|---|
 | 404 | +                set cpos_adjusted accordingly. */
 | 
|---|
 | 405 |               _rl_output_some_chars (nfd, temp);
 | 
|---|
 | 406 |               _rl_last_c_pos += col_temp;               /* XXX */
 | 
|---|
 | 407 | +             if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
 | 
|---|
 | 408 | +               {
 | 
|---|
 | 409 | +                 if (current_line == 0 && wrap_offset &&  ((nfd - new) <= prompt_last_invisible))
 | 
|---|
 | 410 | +                   {
 | 
|---|
 | 411 | +                     _rl_last_c_pos -= wrap_offset;
 | 
|---|
 | 412 | +                     cpos_adjusted = 1;
 | 
|---|
 | 413 | +                   }
 | 
|---|
 | 414 | +               }
 | 
|---|
 | 415 |             }
 | 
|---|
 | 416 |           lendiff = (oe - old) - (ne - new);
 | 
|---|
 | 417 |           if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
 | 
|---|
 | 418 | @@ -1732,7 +1770,10 @@
 | 
|---|
 | 419 |    if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
 | 
|---|
 | 420 |      {
 | 
|---|
 | 421 |        dpos = _rl_col_width (data, 0, new);
 | 
|---|
 | 422 | -      if (dpos > prompt_last_invisible)                /* XXX - don't use woff here */
 | 
|---|
 | 423 | +      /* Use NEW when comparing against the last invisible character in the
 | 
|---|
 | 424 | +        prompt string, since they're both buffer indices and DPOS is a
 | 
|---|
 | 425 | +        desired display position. */
 | 
|---|
 | 426 | +      if (new > prompt_last_invisible)         /* XXX - don't use woff here */
 | 
|---|
 | 427 |         {
 | 
|---|
 | 428 |           dpos -= woff;
 | 
|---|
 | 429 |           /* Since this will be assigned to _rl_last_c_pos at the end (more
 | 
|---|
 | 430 | @@ -2380,6 +2421,8 @@
 | 
|---|
 | 431 |  
 | 
|---|
 | 432 |    if (end <= start)
 | 
|---|
 | 433 |      return 0;
 | 
|---|
 | 434 | +  if (MB_CUR_MAX == 1 || rl_byte_oriented)
 | 
|---|
 | 435 | +    return (end - start);
 | 
|---|
 | 436 |  
 | 
|---|
 | 437 |    memset (&ps, 0, sizeof (mbstate_t));
 | 
|---|
 | 438 |  
 | 
|---|
 | 439 | diff -Naur bash-3.2.orig/lib/sh/snprintf.c bash-3.2/lib/sh/snprintf.c
 | 
|---|
 | 440 | --- bash-3.2.orig/lib/sh/snprintf.c     2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 441 | +++ bash-3.2/lib/sh/snprintf.c  2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 442 | @@ -471,6 +471,8 @@
 | 
|---|
 | 443 |           10^x ~= r
 | 
|---|
 | 444 |   * log_10(200) = 2;
 | 
|---|
 | 445 |   * log_10(250) = 2;
 | 
|---|
 | 446 | + *
 | 
|---|
 | 447 | + * NOTE: do not call this with r == 0 -- an infinite loop results.
 | 
|---|
 | 448 |   */
 | 
|---|
 | 449 |  static int
 | 
|---|
 | 450 |  log_10(r)
 | 
|---|
 | 451 | @@ -576,8 +578,11 @@
 | 
|---|
 | 452 |      { 
 | 
|---|
 | 453 |        integral_part[0] = '0';
 | 
|---|
 | 454 |        integral_part[1] = '\0';
 | 
|---|
 | 455 | -      fraction_part[0] = '0';
 | 
|---|
 | 456 | -      fraction_part[1] = '\0';
 | 
|---|
 | 457 | +      /* The fractional part has to take the precision into account */
 | 
|---|
 | 458 | +      for (ch = 0; ch < precision-1; ch++)
 | 
|---|
 | 459 | +       fraction_part[ch] = '0';
 | 
|---|
 | 460 | +      fraction_part[ch] = '0';
 | 
|---|
 | 461 | +      fraction_part[ch+1] = '\0';
 | 
|---|
 | 462 |        if (fract)
 | 
|---|
 | 463 |         *fract = fraction_part;
 | 
|---|
 | 464 |        return integral_part;
 | 
|---|
 | 465 | @@ -663,7 +668,8 @@
 | 
|---|
 | 466 |      p->flags &= ~PF_ZEROPAD;
 | 
|---|
 | 467 |  
 | 
|---|
 | 468 |    sd = d;      /* signed for ' ' padding in base 10 */
 | 
|---|
 | 469 | -  flags = (*p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0;
 | 
|---|
 | 470 | +  flags = 0;
 | 
|---|
 | 471 | +  flags = (*p->pf == 'x' || *p->pf == 'X' || *p->pf == 'o' || *p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0;
 | 
|---|
 | 472 |    if (*p->pf == 'X')
 | 
|---|
 | 473 |      flags |= FL_HEXUPPER;
 | 
|---|
 | 474 |  
 | 
|---|
 | 475 | @@ -733,7 +739,7 @@
 | 
|---|
 | 476 |      p->flags &= ~PF_ZEROPAD;
 | 
|---|
 | 477 |  
 | 
|---|
 | 478 |    sd = d;      /* signed for ' ' padding in base 10 */
 | 
|---|
 | 479 | -  flags = (*p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0;
 | 
|---|
 | 480 | +  flags = (*p->pf == 'x' || *p->pf == 'X' || *p->pf == 'o' || *p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0;
 | 
|---|
 | 481 |    if (*p->pf == 'X')
 | 
|---|
 | 482 |      flags |= FL_HEXUPPER;
 | 
|---|
 | 483 |  
 | 
|---|
 | 484 | @@ -805,6 +811,7 @@
 | 
|---|
 | 485 |        PUT_CHAR(*tmp, p);
 | 
|---|
 | 486 |        tmp++;
 | 
|---|
 | 487 |      }
 | 
|---|
 | 488 | +
 | 
|---|
 | 489 |    PAD_LEFT(p);
 | 
|---|
 | 490 |  }
 | 
|---|
 | 491 |  
 | 
|---|
 | 492 | @@ -972,11 +979,21 @@
 | 
|---|
 | 493 |    if ((p->flags & PF_THOUSANDS) && grouping && (t = groupnum (tmp)))
 | 
|---|
 | 494 |      tmp = t;
 | 
|---|
 | 495 |  
 | 
|---|
 | 496 | +  if ((*p->pf == 'g' || *p->pf == 'G') && (p->flags & PF_ALTFORM) == 0)
 | 
|---|
 | 497 | +    {
 | 
|---|
 | 498 | +      /* smash the trailing zeros unless altform */
 | 
|---|
 | 499 | +      for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] == '0'; i--)
 | 
|---|
 | 500 | +        tmp2[i] = '\0'; 
 | 
|---|
 | 501 | +      if (tmp2[0] == '\0')
 | 
|---|
 | 502 | +       p->precision = 0;
 | 
|---|
 | 503 | +    }
 | 
|---|
 | 504 | +
 | 
|---|
 | 505 |    /* calculate the padding. 1 for the dot */
 | 
|---|
 | 506 |    p->width = p->width -
 | 
|---|
 | 507 |             ((d > 0. && p->justify == RIGHT) ? 1:0) -
 | 
|---|
 | 508 |             ((p->flags & PF_SPACE) ? 1:0) -
 | 
|---|
 | 509 | -           strlen(tmp) - p->precision - 1;
 | 
|---|
 | 510 | +           strlen(tmp) - p->precision -
 | 
|---|
 | 511 | +           ((p->precision != 0 || (p->flags & PF_ALTFORM)) ? 1 : 0);   /* radix char */
 | 
|---|
 | 512 |    PAD_RIGHT(p);  
 | 
|---|
 | 513 |    PUT_PLUS(d, p, 0.);
 | 
|---|
 | 514 |    PUT_SPACE(d, p, 0.);
 | 
|---|
 | 515 | @@ -991,11 +1008,6 @@
 | 
|---|
 | 516 |    if (p->precision != 0 || (p->flags & PF_ALTFORM))
 | 
|---|
 | 517 |      PUT_CHAR(decpoint, p);  /* put the '.' */
 | 
|---|
 | 518 |  
 | 
|---|
 | 519 | -  if ((*p->pf == 'g' || *p->pf == 'G') && (p->flags & PF_ALTFORM) == 0)
 | 
|---|
 | 520 | -    /* smash the trailing zeros unless altform */
 | 
|---|
 | 521 | -    for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] == '0'; i--)
 | 
|---|
 | 522 | -      tmp2[i] = '\0'; 
 | 
|---|
 | 523 | -
 | 
|---|
 | 524 |    for (; *tmp2; tmp2++)
 | 
|---|
 | 525 |      PUT_CHAR(*tmp2, p); /* the fraction */
 | 
|---|
 | 526 |    
 | 
|---|
 | 527 | @@ -1011,14 +1023,19 @@
 | 
|---|
 | 528 |    char *tmp, *tmp2;
 | 
|---|
 | 529 |    int j, i;
 | 
|---|
 | 530 |  
 | 
|---|
 | 531 | -  if (chkinfnan(p, d, 1) || chkinfnan(p, d, 2))
 | 
|---|
 | 532 | +  if (d != 0 && (chkinfnan(p, d, 1) || chkinfnan(p, d, 2)))
 | 
|---|
 | 533 |      return;    /* already printed nan or inf */
 | 
|---|
 | 534 |  
 | 
|---|
 | 535 |    GETLOCALEDATA(decpoint, thoussep, grouping);
 | 
|---|
 | 536 |    DEF_PREC(p);
 | 
|---|
 | 537 | -  j = log_10(d);
 | 
|---|
 | 538 | -  d = d / pow_10(j);  /* get the Mantissa */
 | 
|---|
 | 539 | -  d = ROUND(d, p);               
 | 
|---|
 | 540 | +  if (d == 0.)
 | 
|---|
 | 541 | +    j = 0;
 | 
|---|
 | 542 | +  else
 | 
|---|
 | 543 | +    {
 | 
|---|
 | 544 | +      j = log_10(d);
 | 
|---|
 | 545 | +      d = d / pow_10(j);  /* get the Mantissa */
 | 
|---|
 | 546 | +      d = ROUND(d, p);           
 | 
|---|
 | 547 | +    }
 | 
|---|
 | 548 |    tmp = dtoa(d, p->precision, &tmp2);
 | 
|---|
 | 549 |  
 | 
|---|
 | 550 |    /* 1 for unit, 1 for the '.', 1 for 'e|E',
 | 
|---|
 | 551 | @@ -1076,6 +1093,7 @@
 | 
|---|
 | 552 |         PUT_CHAR(*tmp, p);
 | 
|---|
 | 553 |         tmp++;
 | 
|---|
 | 554 |       }
 | 
|---|
 | 555 | +
 | 
|---|
 | 556 |     PAD_LEFT(p);
 | 
|---|
 | 557 |  }
 | 
|---|
 | 558 |  #endif
 | 
|---|
 | 559 | @@ -1358,7 +1376,7 @@
 | 
|---|
 | 560 |                 STAR_ARGS(data);
 | 
|---|
 | 561 |                 DEF_PREC(data);
 | 
|---|
 | 562 |                 d = GETDOUBLE(data);
 | 
|---|
 | 563 | -               i = log_10(d);
 | 
|---|
 | 564 | +               i = (d != 0.) ? log_10(d) : -1;
 | 
|---|
 | 565 |                 /*
 | 
|---|
 | 566 |                  * for '%g|%G' ANSI: use f if exponent
 | 
|---|
 | 567 |                  * is in the range or [-4,p] exclusively
 | 
|---|
 | 568 | diff -Naur bash-3.2.orig/parse.y bash-3.2/parse.y
 | 
|---|
 | 569 | --- bash-3.2.orig/parse.y       2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 570 | +++ bash-3.2/parse.y    2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 571 | @@ -1029,6 +1029,7 @@
 | 
|---|
 | 572 |  #define PST_CMDTOKEN   0x1000          /* command token OK - unused */
 | 
|---|
 | 573 |  #define PST_COMPASSIGN 0x2000          /* parsing x=(...) compound assignment */
 | 
|---|
 | 574 |  #define PST_ASSIGNOK   0x4000          /* assignment statement ok in this context */
 | 
|---|
 | 575 | +#define PST_REGEXP     0x8000          /* parsing an ERE/BRE as a single word */
 | 
|---|
 | 576 |  
 | 
|---|
 | 577 |  /* Initial size to allocate for tokens, and the
 | 
|---|
 | 578 |     amount to grow them by. */
 | 
|---|
 | 579 | @@ -2591,6 +2592,9 @@
 | 
|---|
 | 580 |        return (character);
 | 
|---|
 | 581 |      }
 | 
|---|
 | 582 |  
 | 
|---|
 | 583 | +  if (parser_state & PST_REGEXP)
 | 
|---|
 | 584 | +    goto tokword;
 | 
|---|
 | 585 | +
 | 
|---|
 | 586 |    /* Shell meta-characters. */
 | 
|---|
 | 587 |    if MBTEST(shellmeta (character) && ((parser_state & PST_DBLPAREN) == 0))
 | 
|---|
 | 588 |      {
 | 
|---|
 | 589 | @@ -2698,6 +2702,7 @@
 | 
|---|
 | 590 |    if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND))
 | 
|---|
 | 591 |      return (character);
 | 
|---|
 | 592 |  
 | 
|---|
 | 593 | +tokword:
 | 
|---|
 | 594 |    /* Okay, if we got this far, we have to read a word.  Read one,
 | 
|---|
 | 595 |       and then check it against the known ones. */
 | 
|---|
 | 596 |    result = read_token_word (character);
 | 
|---|
 | 597 | @@ -2735,7 +2740,7 @@
 | 
|---|
 | 598 |  /* itrace("parse_matched_pair: open = %c close = %c", open, close); */
 | 
|---|
 | 599 |    count = 1;
 | 
|---|
 | 600 |    pass_next_character = backq_backslash = was_dollar = in_comment = 0;
 | 
|---|
 | 601 | -  check_comment = (flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0;
 | 
|---|
 | 602 | +  check_comment = (flags & P_COMMAND) && qc != '`' && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0;
 | 
|---|
 | 603 |  
 | 
|---|
 | 604 |    /* RFLAGS is the set of flags we want to pass to recursive calls. */
 | 
|---|
 | 605 |    rflags = (qc == '"') ? P_DQUOTE : (flags & P_DQUOTE);
 | 
|---|
 | 606 | @@ -3202,8 +3207,11 @@
 | 
|---|
 | 607 |        if (tok == WORD && test_binop (yylval.word->word))
 | 
|---|
 | 608 |         op = yylval.word;
 | 
|---|
 | 609 |  #if defined (COND_REGEXP)
 | 
|---|
 | 610 | -      else if (tok == WORD && STREQ (yylval.word->word,"=~"))
 | 
|---|
 | 611 | -       op = yylval.word;
 | 
|---|
 | 612 | +      else if (tok == WORD && STREQ (yylval.word->word, "=~"))
 | 
|---|
 | 613 | +       {
 | 
|---|
 | 614 | +         op = yylval.word;
 | 
|---|
 | 615 | +         parser_state |= PST_REGEXP;
 | 
|---|
 | 616 | +       }
 | 
|---|
 | 617 |  #endif
 | 
|---|
 | 618 |        else if (tok == '<' || tok == '>')
 | 
|---|
 | 619 |         op = make_word_from_token (tok);  /* ( */
 | 
|---|
 | 620 | @@ -3234,6 +3242,7 @@
 | 
|---|
 | 621 |  
 | 
|---|
 | 622 |        /* rhs */
 | 
|---|
 | 623 |        tok = read_token (READ);
 | 
|---|
 | 624 | +      parser_state &= ~PST_REGEXP;
 | 
|---|
 | 625 |        if (tok == WORD)
 | 
|---|
 | 626 |         {
 | 
|---|
 | 627 |           tright = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL);
 | 
|---|
 | 628 | @@ -3419,9 +3428,34 @@
 | 
|---|
 | 629 |           goto next_character;
 | 
|---|
 | 630 |         }
 | 
|---|
 | 631 |  
 | 
|---|
 | 632 | +#ifdef COND_REGEXP
 | 
|---|
 | 633 | +      /* When parsing a regexp as a single word inside a conditional command,
 | 
|---|
 | 634 | +        we need to special-case characters special to both the shell and
 | 
|---|
 | 635 | +        regular expressions.  Right now, that is only '(' and '|'. */ /*)*/
 | 
|---|
 | 636 | +      if MBTEST((parser_state & PST_REGEXP) && (character == '(' || character == '|'))         /*)*/
 | 
|---|
 | 637 | +        {
 | 
|---|
 | 638 | +          if (character == '|')
 | 
|---|
 | 639 | +            goto got_character;
 | 
|---|
 | 640 | +
 | 
|---|
 | 641 | +         push_delimiter (dstack, character);
 | 
|---|
 | 642 | +         ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0);
 | 
|---|
 | 643 | +         pop_delimiter (dstack);
 | 
|---|
 | 644 | +         if (ttok == &matched_pair_error)
 | 
|---|
 | 645 | +           return -1;          /* Bail immediately. */
 | 
|---|
 | 646 | +         RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
 | 
|---|
 | 647 | +                                 token_buffer_size, TOKEN_DEFAULT_GROW_SIZE);
 | 
|---|
 | 648 | +         token[token_index++] = character;
 | 
|---|
 | 649 | +         strcpy (token + token_index, ttok);
 | 
|---|
 | 650 | +         token_index += ttoklen;
 | 
|---|
 | 651 | +         FREE (ttok);
 | 
|---|
 | 652 | +         dollar_present = all_digit_token = 0;
 | 
|---|
 | 653 | +         goto next_character;
 | 
|---|
 | 654 | +        }
 | 
|---|
 | 655 | +#endif /* COND_REGEXP */
 | 
|---|
 | 656 | +
 | 
|---|
 | 657 |  #ifdef EXTENDED_GLOB
 | 
|---|
 | 658 |        /* Parse a ksh-style extended pattern matching specification. */
 | 
|---|
 | 659 | -      if (extended_glob && PATTERN_CHAR (character))
 | 
|---|
 | 660 | +      if MBTEST(extended_glob && PATTERN_CHAR (character))
 | 
|---|
 | 661 |         {
 | 
|---|
 | 662 |           peek_char = shell_getc (1);
 | 
|---|
 | 663 |           if MBTEST(peek_char == '(')           /* ) */
 | 
|---|
 | 664 | diff -Naur bash-3.2.orig/patchlevel.h bash-3.2/patchlevel.h
 | 
|---|
 | 665 | --- bash-3.2.orig/patchlevel.h  2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 666 | +++ bash-3.2/patchlevel.h       2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 667 | @@ -25,6 +25,6 @@
 | 
|---|
 | 668 |     regexp `^#define[   ]*PATCHLEVEL', since that's what support/mkversion.sh
 | 
|---|
 | 669 |     looks for to find the patch level (for the sccs version string). */
 | 
|---|
 | 670 |  
 | 
|---|
 | 671 | -#define PATCHLEVEL 0
 | 
|---|
 | 672 | +#define PATCHLEVEL 17
 | 
|---|
 | 673 |  
 | 
|---|
 | 674 |  #endif /* _PATCHLEVEL_H_ */
 | 
|---|
 | 675 | diff -Naur bash-3.2.orig/pathexp.c bash-3.2/pathexp.c
 | 
|---|
 | 676 | --- bash-3.2.orig/pathexp.c     2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 677 | +++ bash-3.2/pathexp.c  2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 678 | @@ -1,6 +1,6 @@
 | 
|---|
 | 679 |  /* pathexp.c -- The shell interface to the globbing library. */
 | 
|---|
 | 680 |  
 | 
|---|
 | 681 | -/* Copyright (C) 1995-2002 Free Software Foundation, Inc.
 | 
|---|
 | 682 | +/* Copyright (C) 1995-2007 Free Software Foundation, Inc.
 | 
|---|
 | 683 |  
 | 
|---|
 | 684 |     This file is part of GNU Bash, the Bourne Again SHell.
 | 
|---|
 | 685 |  
 | 
|---|
 | 686 | @@ -110,6 +110,33 @@
 | 
|---|
 | 687 |    return (0);
 | 
|---|
 | 688 |  }
 | 
|---|
 | 689 |  
 | 
|---|
 | 690 | +/* Return 1 if C is a character that is `special' in a POSIX ERE and needs to
 | 
|---|
 | 691 | +   be quoted to match itself. */
 | 
|---|
 | 692 | +static inline int
 | 
|---|
 | 693 | +ere_char (c)
 | 
|---|
 | 694 | +     int c;
 | 
|---|
 | 695 | +{
 | 
|---|
 | 696 | +  switch (c)
 | 
|---|
 | 697 | +    {
 | 
|---|
 | 698 | +    case '.':
 | 
|---|
 | 699 | +    case '[':
 | 
|---|
 | 700 | +    case '\\':
 | 
|---|
 | 701 | +    case '(':
 | 
|---|
 | 702 | +    case ')':
 | 
|---|
 | 703 | +    case '*':
 | 
|---|
 | 704 | +    case '+':
 | 
|---|
 | 705 | +    case '?':
 | 
|---|
 | 706 | +    case '{':
 | 
|---|
 | 707 | +    case '|':
 | 
|---|
 | 708 | +    case '^':
 | 
|---|
 | 709 | +    case '$':
 | 
|---|
 | 710 | +      return 1;
 | 
|---|
 | 711 | +    default: 
 | 
|---|
 | 712 | +      return 0;
 | 
|---|
 | 713 | +    }
 | 
|---|
 | 714 | +  return (0);
 | 
|---|
 | 715 | +}
 | 
|---|
 | 716 | +
 | 
|---|
 | 717 |  /* PATHNAME can contain characters prefixed by CTLESC; this indicates
 | 
|---|
 | 718 |     that the character is to be quoted.  We quote it here in the style
 | 
|---|
 | 719 |     that the glob library recognizes.  If flags includes QGLOB_CVTNULL,
 | 
|---|
 | 720 | @@ -142,6 +169,8 @@
 | 
|---|
 | 721 |         {
 | 
|---|
 | 722 |           if ((qflags & QGLOB_FILENAME) && pathname[i+1] == '/')
 | 
|---|
 | 723 |             continue;
 | 
|---|
 | 724 | +         if ((qflags & QGLOB_REGEXP) && ere_char (pathname[i+1]) == 0)
 | 
|---|
 | 725 | +           continue;
 | 
|---|
 | 726 |           temp[j++] = '\\';
 | 
|---|
 | 727 |           i++;
 | 
|---|
 | 728 |           if (pathname[i] == '\0')
 | 
|---|
 | 729 | diff -Naur bash-3.2.orig/pathexp.h bash-3.2/pathexp.h
 | 
|---|
 | 730 | --- bash-3.2.orig/pathexp.h     2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 731 | +++ bash-3.2/pathexp.h  2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 732 | @@ -1,6 +1,6 @@
 | 
|---|
 | 733 |  /* pathexp.h -- The shell interface to the globbing library. */
 | 
|---|
 | 734 |  
 | 
|---|
 | 735 | -/* Copyright (C) 1987-2005 Free Software Foundation, Inc.
 | 
|---|
 | 736 | +/* Copyright (C) 1987-2007 Free Software Foundation, Inc.
 | 
|---|
 | 737 |  
 | 
|---|
 | 738 |     This file is part of GNU Bash, the Bourne Again SHell.
 | 
|---|
 | 739 |  
 | 
|---|
 | 740 | @@ -32,6 +32,7 @@
 | 
|---|
 | 741 |  /* Flag values for quote_string_for_globbing */
 | 
|---|
 | 742 |  #define QGLOB_CVTNULL  0x01    /* convert QUOTED_NULL strings to '\0' */
 | 
|---|
 | 743 |  #define QGLOB_FILENAME 0x02    /* do correct quoting for matching filenames */
 | 
|---|
 | 744 | +#define QGLOB_REGEXP   0x04    /* quote an ERE for regcomp/regexec */
 | 
|---|
 | 745 |  
 | 
|---|
 | 746 |  #if defined (EXTENDED_GLOB)
 | 
|---|
 | 747 |  /* Flags to OR with other flag args to strmatch() to enabled the extended
 | 
|---|
 | 748 | diff -Naur bash-3.2.orig/po/ru.po bash-3.2/po/ru.po
 | 
|---|
 | 749 | --- bash-3.2.orig/po/ru.po      2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 750 | +++ bash-3.2/po/ru.po   2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 751 | @@ -12,7 +12,7 @@
 | 
|---|
 | 752 |  "Last-Translator: Evgeniy Dushistov <dushistov@mail.ru>\n"
 | 
|---|
 | 753 |  "Language-Team: Russian <ru@li.org>\n"
 | 
|---|
 | 754 |  "MIME-Version: 1.0\n"
 | 
|---|
 | 755 | -"Content-Type: text/plain; charset=UTF-8\n"
 | 
|---|
 | 756 | +"Content-Type: text/plain; charset=KOI8-R\n"
 | 
|---|
 | 757 |  "Content-Transfer-Encoding: 8bit\n"
 | 
|---|
 | 758 |  "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 | 
|---|
 | 759 |  
 | 
|---|
 | 760 | diff -Naur bash-3.2.orig/subst.c bash-3.2/subst.c
 | 
|---|
 | 761 | --- bash-3.2.orig/subst.c       2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 762 | +++ bash-3.2/subst.c    2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 763 | @@ -4,7 +4,7 @@
 | 
|---|
 | 764 |  /* ``Have a little faith, there's magic in the night.  You ain't a
 | 
|---|
 | 765 |       beauty, but, hey, you're alright.'' */
 | 
|---|
 | 766 |  
 | 
|---|
 | 767 | -/* Copyright (C) 1987-2006 Free Software Foundation, Inc.
 | 
|---|
 | 768 | +/* Copyright (C) 1987-2007 Free Software Foundation, Inc.
 | 
|---|
 | 769 |  
 | 
|---|
 | 770 |     This file is part of GNU Bash, the Bourne Again SHell.
 | 
|---|
 | 771 |  
 | 
|---|
 | 772 | @@ -1887,7 +1887,13 @@
 | 
|---|
 | 773 |    sep[1] = '\0';
 | 
|---|
 | 774 |  #endif
 | 
|---|
 | 775 |  
 | 
|---|
 | 776 | +  /* XXX -- why call quote_list if ifs == 0?  we can get away without doing
 | 
|---|
 | 777 | +     it now that quote_escapes quotes spaces */
 | 
|---|
 | 778 | +#if 0
 | 
|---|
 | 779 |    tlist = ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (ifs && *ifs == 0))
 | 
|---|
 | 780 | +#else
 | 
|---|
 | 781 | +  tlist = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
 | 
|---|
 | 782 | +#endif
 | 
|---|
 | 783 |                 ? quote_list (list)
 | 
|---|
 | 784 |                 : list_quote_escapes (list);
 | 
|---|
 | 785 |  
 | 
|---|
 | 786 | @@ -2646,11 +2652,12 @@
 | 
|---|
 | 787 |  
 | 
|---|
 | 788 |  /* This needs better error handling. */
 | 
|---|
 | 789 |  /* Expand W for use as an argument to a unary or binary operator in a
 | 
|---|
 | 790 | -   [[...]] expression.  If SPECIAL is nonzero, this is the rhs argument
 | 
|---|
 | 791 | +   [[...]] expression.  If SPECIAL is 1, this is the rhs argument
 | 
|---|
 | 792 |     to the != or == operator, and should be treated as a pattern.  In
 | 
|---|
 | 793 | -   this case, we quote the string specially for the globbing code.  The
 | 
|---|
 | 794 | -   caller is responsible for removing the backslashes if the unquoted
 | 
|---|
 | 795 | -   words is needed later. */   
 | 
|---|
 | 796 | +   this case, we quote the string specially for the globbing code.  If
 | 
|---|
 | 797 | +   SPECIAL is 2, this is an rhs argument for the =~ operator, and should
 | 
|---|
 | 798 | +   be quoted appropriately for regcomp/regexec.  The caller is responsible
 | 
|---|
 | 799 | +   for removing the backslashes if the unquoted word is needed later. */   
 | 
|---|
 | 800 |  char *
 | 
|---|
 | 801 |  cond_expand_word (w, special)
 | 
|---|
 | 802 |       WORD_DESC *w;
 | 
|---|
 | 803 | @@ -2658,6 +2665,7 @@
 | 
|---|
 | 804 |  {
 | 
|---|
 | 805 |    char *r, *p;
 | 
|---|
 | 806 |    WORD_LIST *l;
 | 
|---|
 | 807 | +  int qflags;
 | 
|---|
 | 808 |  
 | 
|---|
 | 809 |    if (w->word == 0 || w->word[0] == '\0')
 | 
|---|
 | 810 |      return ((char *)NULL);
 | 
|---|
 | 811 | @@ -2672,8 +2680,11 @@
 | 
|---|
 | 812 |         }
 | 
|---|
 | 813 |        else
 | 
|---|
 | 814 |         {
 | 
|---|
 | 815 | +         qflags = QGLOB_CVTNULL;
 | 
|---|
 | 816 | +         if (special == 2)
 | 
|---|
 | 817 | +           qflags |= QGLOB_REGEXP;
 | 
|---|
 | 818 |           p = string_list (l);
 | 
|---|
 | 819 | -         r = quote_string_for_globbing (p, QGLOB_CVTNULL);
 | 
|---|
 | 820 | +         r = quote_string_for_globbing (p, qflags);
 | 
|---|
 | 821 |           free (p);
 | 
|---|
 | 822 |         }
 | 
|---|
 | 823 |        dispose_words (l);
 | 
|---|
 | 824 | @@ -2916,7 +2927,12 @@
 | 
|---|
 | 825 |  
 | 
|---|
 | 826 |  /* Quote escape characters in string s, but no other characters.  This is
 | 
|---|
 | 827 |     used to protect CTLESC and CTLNUL in variable values from the rest of
 | 
|---|
 | 828 | -   the word expansion process after the variable is expanded. */
 | 
|---|
 | 829 | +   the word expansion process after the variable is expanded.  If IFS is
 | 
|---|
 | 830 | +   null, we quote spaces as well, just in case we split on spaces later
 | 
|---|
 | 831 | +   (in the case of unquoted $@, we will eventually attempt to split the
 | 
|---|
 | 832 | +   entire word on spaces).  Corresponding code exists in dequote_escapes.
 | 
|---|
 | 833 | +   Even if we don't end up splitting on spaces, quoting spaces is not a
 | 
|---|
 | 834 | +   problem. */
 | 
|---|
 | 835 |  char *
 | 
|---|
 | 836 |  quote_escapes (string)
 | 
|---|
 | 837 |       char *string;
 | 
|---|
 | 838 | @@ -2924,17 +2940,19 @@
 | 
|---|
 | 839 |    register char *s, *t;
 | 
|---|
 | 840 |    size_t slen;
 | 
|---|
 | 841 |    char *result, *send;
 | 
|---|
 | 842 | +  int quote_spaces;
 | 
|---|
 | 843 |    DECLARE_MBSTATE; 
 | 
|---|
 | 844 |  
 | 
|---|
 | 845 |    slen = strlen (string);
 | 
|---|
 | 846 |    send = string + slen;
 | 
|---|
 | 847 |  
 | 
|---|
 | 848 | +  quote_spaces = (ifs_value && *ifs_value == 0);
 | 
|---|
 | 849 |    t = result = (char *)xmalloc ((slen * 2) + 1);
 | 
|---|
 | 850 |    s = string;
 | 
|---|
 | 851 |  
 | 
|---|
 | 852 |    while (*s)
 | 
|---|
 | 853 |      {
 | 
|---|
 | 854 | -      if (*s == CTLESC || *s == CTLNUL)
 | 
|---|
 | 855 | +      if (*s == CTLESC || *s == CTLNUL || (quote_spaces && *s == ' '))
 | 
|---|
 | 856 |         *t++ = CTLESC;
 | 
|---|
 | 857 |        COPY_CHAR_P (t, s, send);
 | 
|---|
 | 858 |      }
 | 
|---|
 | 859 | @@ -2976,6 +2994,7 @@
 | 
|---|
 | 860 |    register char *s, *t;
 | 
|---|
 | 861 |    size_t slen;
 | 
|---|
 | 862 |    char *result, *send;
 | 
|---|
 | 863 | +  int quote_spaces;
 | 
|---|
 | 864 |    DECLARE_MBSTATE;
 | 
|---|
 | 865 |  
 | 
|---|
 | 866 |    if (string == 0)
 | 
|---|
 | 867 | @@ -2990,9 +3009,10 @@
 | 
|---|
 | 868 |    if (strchr (string, CTLESC) == 0)
 | 
|---|
 | 869 |      return (strcpy (result, s));
 | 
|---|
 | 870 |  
 | 
|---|
 | 871 | +  quote_spaces = (ifs_value && *ifs_value == 0);
 | 
|---|
 | 872 |    while (*s)
 | 
|---|
 | 873 |      {
 | 
|---|
 | 874 | -      if (*s == CTLESC && (s[1] == CTLESC || s[1] == CTLNUL))
 | 
|---|
 | 875 | +      if (*s == CTLESC && (s[1] == CTLESC || s[1] == CTLNUL || (quote_spaces && s[1] == ' ')))
 | 
|---|
 | 876 |         {
 | 
|---|
 | 877 |           s++;
 | 
|---|
 | 878 |           if (*s == '\0')
 | 
|---|
 | 879 | @@ -4123,6 +4143,12 @@
 | 
|---|
 | 880 |      nfifo = 0;
 | 
|---|
 | 881 |  }
 | 
|---|
 | 882 |  
 | 
|---|
 | 883 | +int
 | 
|---|
 | 884 | +fifos_pending ()
 | 
|---|
 | 885 | +{
 | 
|---|
 | 886 | +  return nfifo;
 | 
|---|
 | 887 | +}
 | 
|---|
 | 888 | +
 | 
|---|
 | 889 |  static char *
 | 
|---|
 | 890 |  make_named_pipe ()
 | 
|---|
 | 891 |  {
 | 
|---|
 | 892 | @@ -4172,6 +4198,12 @@
 | 
|---|
 | 893 |    nfds++;
 | 
|---|
 | 894 |  }
 | 
|---|
 | 895 |  
 | 
|---|
 | 896 | +int
 | 
|---|
 | 897 | +fifos_pending ()
 | 
|---|
 | 898 | +{
 | 
|---|
 | 899 | +  return 0;    /* used for cleanup; not needed with /dev/fd */
 | 
|---|
 | 900 | +}
 | 
|---|
 | 901 | +
 | 
|---|
 | 902 |  void
 | 
|---|
 | 903 |  unlink_fifo_list ()
 | 
|---|
 | 904 |  {
 | 
|---|
 | 905 | @@ -4456,7 +4488,15 @@
 | 
|---|
 | 906 |        /* Add the character to ISTRING, possibly after resizing it. */
 | 
|---|
 | 907 |        RESIZE_MALLOCED_BUFFER (istring, istring_index, 2, istring_size, DEFAULT_ARRAY_SIZE);
 | 
|---|
 | 908 |  
 | 
|---|
 | 909 | -      if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || c == CTLESC || c == CTLNUL)
 | 
|---|
 | 910 | +      /* This is essentially quote_string inline */
 | 
|---|
 | 911 | +      if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) /* || c == CTLESC || c == CTLNUL */)
 | 
|---|
 | 912 | +       istring[istring_index++] = CTLESC;
 | 
|---|
 | 913 | +      /* Escape CTLESC and CTLNUL in the output to protect those characters
 | 
|---|
 | 914 | +        from the rest of the word expansions (word splitting and globbing.)
 | 
|---|
 | 915 | +        This is essentially quote_escapes inline. */
 | 
|---|
 | 916 | +      else if (c == CTLESC)
 | 
|---|
 | 917 | +       istring[istring_index++] = CTLESC;
 | 
|---|
 | 918 | +      else if (c == CTLNUL || (c == ' ' && (ifs_value && *ifs_value == 0)))
 | 
|---|
 | 919 |         istring[istring_index++] = CTLESC;
 | 
|---|
 | 920 |  
 | 
|---|
 | 921 |        istring[istring_index++] = c;
 | 
|---|
 | 922 | @@ -4665,6 +4705,9 @@
 | 
|---|
 | 923 |  
 | 
|---|
 | 924 |        last_command_exit_value = rc;
 | 
|---|
 | 925 |        rc = run_exit_trap ();
 | 
|---|
 | 926 | +#if defined (PROCESS_SUBSTITUTION)
 | 
|---|
 | 927 | +      unlink_fifo_list ();
 | 
|---|
 | 928 | +#endif
 | 
|---|
 | 929 |        exit (rc);
 | 
|---|
 | 930 |      }
 | 
|---|
 | 931 |    else
 | 
|---|
 | 932 | @@ -5546,12 +5589,16 @@
 | 
|---|
 | 933 |          so verify_substring_values just returns the numbers specified and we
 | 
|---|
 | 934 |          rely on array_subrange to understand how to deal with them). */
 | 
|---|
 | 935 |        tt = array_subrange (array_cell (v), e1, e2, starsub, quoted);
 | 
|---|
 | 936 | +#if 0
 | 
|---|
 | 937 | +      /* array_subrange now calls array_quote_escapes as appropriate, so the
 | 
|---|
 | 938 | +        caller no longer needs to. */
 | 
|---|
 | 939 |        if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) == 0)
 | 
|---|
 | 940 |         {
 | 
|---|
 | 941 |           temp = tt ? quote_escapes (tt) : (char *)NULL;
 | 
|---|
 | 942 |           FREE (tt);
 | 
|---|
 | 943 |         }
 | 
|---|
 | 944 |        else
 | 
|---|
 | 945 | +#endif
 | 
|---|
 | 946 |         temp = tt;
 | 
|---|
 | 947 |        break;
 | 
|---|
 | 948 |  #endif
 | 
|---|
 | 949 | @@ -5707,6 +5754,11 @@
 | 
|---|
 | 950 |    vtype &= ~VT_STARSUB;
 | 
|---|
 | 951 |  
 | 
|---|
 | 952 |    mflags = 0;
 | 
|---|
 | 953 | +  if (patsub && *patsub == '/')
 | 
|---|
 | 954 | +    {
 | 
|---|
 | 955 | +      mflags |= MATCH_GLOBREP;
 | 
|---|
 | 956 | +      patsub++;
 | 
|---|
 | 957 | +    }
 | 
|---|
 | 958 |  
 | 
|---|
 | 959 |    /* Malloc this because expand_string_if_necessary or one of the expansion
 | 
|---|
 | 960 |       functions in its call chain may free it on a substitution error. */
 | 
|---|
 | 961 | @@ -5741,13 +5793,12 @@
 | 
|---|
 | 962 |      }
 | 
|---|
 | 963 |  
 | 
|---|
 | 964 |    /* ksh93 doesn't allow the match specifier to be a part of the expanded
 | 
|---|
 | 965 | -     pattern.  This is an extension. */
 | 
|---|
 | 966 | +     pattern.  This is an extension.  Make sure we don't anchor the pattern
 | 
|---|
 | 967 | +     at the beginning or end of the string if we're doing global replacement,
 | 
|---|
 | 968 | +     though. */
 | 
|---|
 | 969 |    p = pat;
 | 
|---|
 | 970 | -  if (pat && pat[0] == '/')
 | 
|---|
 | 971 | -    {
 | 
|---|
 | 972 | -      mflags |= MATCH_GLOBREP|MATCH_ANY;
 | 
|---|
 | 973 | -      p++;
 | 
|---|
 | 974 | -    }
 | 
|---|
 | 975 | +  if (mflags & MATCH_GLOBREP)
 | 
|---|
 | 976 | +    mflags |= MATCH_ANY;
 | 
|---|
 | 977 |    else if (pat && pat[0] == '#')
 | 
|---|
 | 978 |      {
 | 
|---|
 | 979 |        mflags |= MATCH_BEG;
 | 
|---|
 | 980 | @@ -5798,12 +5849,16 @@
 | 
|---|
 | 981 |  #if defined (ARRAY_VARS)
 | 
|---|
 | 982 |      case VT_ARRAYVAR:
 | 
|---|
 | 983 |        temp = array_patsub (array_cell (v), p, rep, mflags);
 | 
|---|
 | 984 | +#if 0
 | 
|---|
 | 985 | +      /* Don't need to do this anymore; array_patsub calls array_quote_escapes
 | 
|---|
 | 986 | +        as appropriate before adding the space separators. */
 | 
|---|
 | 987 |        if (temp && (mflags & MATCH_QUOTED) == 0)
 | 
|---|
 | 988 |         {
 | 
|---|
 | 989 |           tt = quote_escapes (temp);
 | 
|---|
 | 990 |           free (temp);
 | 
|---|
 | 991 |           temp = tt;
 | 
|---|
 | 992 |         }
 | 
|---|
 | 993 | +#endif
 | 
|---|
 | 994 |        break;
 | 
|---|
 | 995 |  #endif
 | 
|---|
 | 996 |      }
 | 
|---|
 | 997 | diff -Naur bash-3.2.orig/subst.h bash-3.2/subst.h
 | 
|---|
 | 998 | --- bash-3.2.orig/subst.h       2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 999 | +++ bash-3.2/subst.h    2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 1000 | @@ -222,6 +222,7 @@
 | 
|---|
 | 1001 |  extern char *command_substitute __P((char *, int));
 | 
|---|
 | 1002 |  extern char *pat_subst __P((char *, char *, char *, int));
 | 
|---|
 | 1003 |  
 | 
|---|
 | 1004 | +extern int fifos_pending __P((void));
 | 
|---|
 | 1005 |  extern void unlink_fifo_list __P((void));
 | 
|---|
 | 1006 |  
 | 
|---|
 | 1007 |  extern WORD_LIST *list_string_with_quotes __P((char *));
 | 
|---|
 | 1008 | diff -Naur bash-3.2.orig/tests/new-exp.right bash-3.2/tests/new-exp.right
 | 
|---|
 | 1009 | --- bash-3.2.orig/tests/new-exp.right   2007-07-23 19:54:02.000000000 -0400
 | 
|---|
 | 1010 | +++ bash-3.2/tests/new-exp.right        2007-07-23 19:58:47.000000000 -0400
 | 
|---|
 | 1011 | @@ -430,7 +430,7 @@
 | 
|---|
 | 1012 |  Case06---1---A B C::---
 | 
|---|
 | 1013 |  Case07---3---A:B:C---
 | 
|---|
 | 1014 |  Case08---3---A:B:C---
 | 
|---|
 | 1015 | -./new-exp.tests: line 506: /${$(($#-1))}: bad substitution
 | 
|---|
 | 1016 | +./new-exp.tests: line 506: ${$(($#-1))}: bad substitution
 | 
|---|
 | 1017 |  argv[1] = <a>
 | 
|---|
 | 1018 |  argv[2] = <b>
 | 
|---|
 | 1019 |  argv[3] = <c>
 | 
|---|