source: patches/bash-4.2-branch_update-7.patch @ 8eacec6

clfs-3.0.0-systemdclfs-3.0.0-sysvinitsystemdsysvinit
Last change on this file since 8eacec6 was e307159, checked in by William Harrington <kb0iic@…>, 11 years ago

Update Bash to patch level 045.

  • Property mode set to 100644
File size: 56.2 KB
RevLine 
[31f34c6]1Submitted By: William Harrington (kb0iic at gmail dot com)
[e307159]2Date: 05-08-2013
[31f34c6]3Initial Package Version: 4.2
4Origin: Upstream
5Upstream Status: Applied
[e307159]6Description: Contains all upstream patches up to 4.2-045
[31f34c6]7
8diff -Naur bash-4.2.orig/assoc.c bash-4.2/assoc.c
9--- bash-4.2.orig/assoc.c       2009-08-06 00:19:40.000000000 +0000
[e307159]10+++ bash-4.2/assoc.c    2013-03-12 21:55:21.530771482 +0000
[31f34c6]11@@ -77,6 +77,11 @@
12   b = hash_search (key, hash, HASH_CREATE);
13   if (b == 0)
14     return -1;
15+  /* If we are overwriting an existing element's value, we're not going to
16+     use the key.  Nothing in the array assignment code path frees the key
17+     string, so we can free it here to avoid a memory leak. */
18+  if (b->key != key)
19+    free (key);
20   FREE (b->data);
21   b->data = value ? savestring (value) : (char *)0;
22   return (0);
23diff -Naur bash-4.2.orig/bashline.c bash-4.2/bashline.c
24--- bash-4.2.orig/bashline.c    2011-01-16 20:32:47.000000000 +0000
[e307159]25+++ bash-4.2/bashline.c 2013-03-12 21:55:21.646771944 +0000
[31f34c6]26@@ -121,6 +121,9 @@
27 static int filename_completion_ignore __P((char **));
28 static int bash_push_line __P((void));
29 
30+static rl_icppfunc_t *save_directory_hook __P((void));
31+static void reset_directory_hook __P((rl_icppfunc_t *));
32+
33 static void cleanup_expansion_error __P((void));
34 static void maybe_make_readline_line __P((char *));
35 static void set_up_new_line __P((char *));
36@@ -243,10 +246,17 @@
37 /* Perform spelling correction on directory names during word completion */
38 int dircomplete_spelling = 0;
39 
40+/* Expand directory names during word/filename completion. */
41+int dircomplete_expand = 0;
42+int dircomplete_expand_relpath = 0;
43+
44 static char *bash_completer_word_break_characters = " \t\n\"'@><=;|&(:";
45 static char *bash_nohostname_word_break_characters = " \t\n\"'><=;|&(:";
46 /* )) */
47 
48+static const char *default_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!:{~";        /*}*/
49+static char *custom_filename_quote_characters = 0;
50+
51 static rl_hook_func_t *old_rl_startup_hook = (rl_hook_func_t *)NULL;
52 
53 static int dot_in_path = 0;
54@@ -501,7 +511,7 @@
55 
56   /* Tell the completer that we might want to follow symbolic links or
57      do other expansion on directory names. */
58-  rl_directory_rewrite_hook = bash_directory_completion_hook;
59+  set_directory_hook ();
60 
61   rl_filename_rewrite_hook = bash_filename_rewrite_hook;
62 
63@@ -529,7 +539,7 @@
64   enable_hostname_completion (perform_hostname_completion);
65 
66   /* characters that need to be quoted when appearing in filenames. */
67-  rl_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!:{~";      /*}*/
68+  rl_filename_quote_characters = default_filename_quote_characters;
69 
70   rl_filename_quoting_function = bash_quote_filename;
71   rl_filename_dequoting_function = bash_dequote_filename;
72@@ -564,8 +574,10 @@
73   tilde_initialize ();
74   rl_attempted_completion_function = attempt_shell_completion;
75   rl_completion_entry_function = NULL;
76-  rl_directory_rewrite_hook = bash_directory_completion_hook;
77   rl_ignore_some_completions_function = filename_completion_ignore;
78+  rl_filename_quote_characters = default_filename_quote_characters;
79+
80+  set_directory_hook ();
81 }
82 
83 /* Contains the line to push into readline. */
84@@ -1279,6 +1291,9 @@
85   matches = (char **)NULL;
86   rl_ignore_some_completions_function = filename_completion_ignore;
87 
88+  rl_filename_quote_characters = default_filename_quote_characters;
89+  set_directory_hook ();
90+
91   /* Determine if this could be a command word.  It is if it appears at
92      the start of the line (ignoring preceding whitespace), or if it
93      appears after a character that separates commands.  It cannot be a
94@@ -1591,6 +1606,12 @@
95            }
96          else
97            {
98+            if (dircomplete_expand && dot_or_dotdot (filename_hint))
99+               {
100+                 dircomplete_expand = 0;
101+                 set_directory_hook ();
102+                 dircomplete_expand = 1;
103+               }
104              mapping_over = 4;
105              goto inner;
106            }
107@@ -1791,6 +1812,9 @@
108 
109  inner:
110   val = rl_filename_completion_function (filename_hint, istate);
111+  if (mapping_over == 4 && dircomplete_expand)
112+    set_directory_hook ();
113+
114   istate = 1;
115 
116   if (val == 0)
117@@ -2693,6 +2717,52 @@
118   return conv;
119 }
120 
121+/* Functions to save and restore the appropriate directory hook */
122+/* This is not static so the shopt code can call it */
123+void
124+set_directory_hook ()
125+{
126+  if (dircomplete_expand)
127+    {
128+      rl_directory_completion_hook = bash_directory_completion_hook;
129+      rl_directory_rewrite_hook = (rl_icppfunc_t *)0;
130+    }
131+  else
132+    {
133+      rl_directory_rewrite_hook = bash_directory_completion_hook;
134+      rl_directory_completion_hook = (rl_icppfunc_t *)0;
135+    }
136+}
137+
138+static rl_icppfunc_t *
139+save_directory_hook ()
140+{
141+  rl_icppfunc_t *ret;
142+
143+  if (dircomplete_expand)
144+    {
145+      ret = rl_directory_completion_hook;
146+      rl_directory_completion_hook = (rl_icppfunc_t *)NULL;
147+    }
148+  else
149+    {
150+      ret = rl_directory_rewrite_hook;
151+      rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL;
152+    }
153+
154+  return ret;
155+}
156+
157+static void
158+restore_directory_hook (hookf)
159+     rl_icppfunc_t *hookf;
160+{
161+  if (dircomplete_expand)
162+    rl_directory_completion_hook = hookf;
163+  else
164+    rl_directory_rewrite_hook = hookf;
165+}
166+
167 /* Handle symbolic link references and other directory name
168    expansions while hacking completion.  This should return 1 if it modifies
169    the DIRNAME argument, 0 otherwise.  It should make sure not to modify
170@@ -2702,20 +2772,31 @@
171      char **dirname;
172 {
173   char *local_dirname, *new_dirname, *t;
174-  int return_value, should_expand_dirname;
175+  int return_value, should_expand_dirname, nextch, closer;
176   WORD_LIST *wl;
177   struct stat sb;
178 
179-  return_value = should_expand_dirname = 0;
180+  return_value = should_expand_dirname = nextch = closer = 0;
181   local_dirname = *dirname;
182 
183-  if (mbschr (local_dirname, '$'))
184-    should_expand_dirname = 1;
185+  if (t = mbschr (local_dirname, '$'))
186+    {
187+      should_expand_dirname = '$';
188+      nextch = t[1];
189+      /* Deliberately does not handle the deprecated $[...] arithmetic
190+        expansion syntax */
191+      if (nextch == '(')
192+       closer = ')';
193+      else if (nextch == '{')
194+       closer = '}';
195+      else
196+       nextch = 0;
197+    }
198   else
199     {
200       t = mbschr (local_dirname, '`');
201       if (t && unclosed_pair (local_dirname, strlen (local_dirname), "`") == 0)
202-       should_expand_dirname = 1;
203+       should_expand_dirname = '`';
204     }
205 
206 #if defined (HAVE_LSTAT)
207@@ -2739,6 +2820,23 @@
208          free (new_dirname);
209          dispose_words (wl);
210          local_dirname = *dirname;
211+         /* XXX - change rl_filename_quote_characters here based on
212+            should_expand_dirname/nextch/closer.  This is the only place
213+            custom_filename_quote_characters is modified. */
214+         if (rl_filename_quote_characters && *rl_filename_quote_characters)
215+           {
216+             int i, j, c;
217+             i = strlen (default_filename_quote_characters);
218+             custom_filename_quote_characters = xrealloc (custom_filename_quote_characters, i+1);
219+             for (i = j = 0; c = default_filename_quote_characters[i]; i++)
220+               {
221+                 if (c == should_expand_dirname || c == nextch || c == closer)
222+                   continue;
223+                 custom_filename_quote_characters[j++] = c;
224+               }
225+             custom_filename_quote_characters[j] = '\0';
226+             rl_filename_quote_characters = custom_filename_quote_characters;
227+           }
228        }
229       else
230        {
231@@ -2758,11 +2856,31 @@
232       local_dirname = *dirname = new_dirname;
233     }
234 
235+  /* no_symbolic_links == 0 -> use (default) logical view of the file system.
236+     local_dirname[0] == '.' && local_dirname[1] == '/' means files in the
237+     current directory (./).
238+     local_dirname[0] == '.' && local_dirname[1] == 0 means relative pathnames
239+     in the current directory (e.g., lib/sh).
240+     XXX - should we do spelling correction on these? */
241+
242+  /* This is test as it was in bash-4.2: skip relative pathnames in current
243+     directory.  Change test to
244+      (local_dirname[0] != '.' || (local_dirname[1] && local_dirname[1] != '/'))
245+     if we want to skip paths beginning with ./ also. */
246   if (no_symbolic_links == 0 && (local_dirname[0] != '.' || local_dirname[1]))
247     {
248       char *temp1, *temp2;
249       int len1, len2;
250 
251+      /* If we have a relative path
252+               (local_dirname[0] != '/' && local_dirname[0] != '.')
253+        that is canonical after appending it to the current directory, then
254+               temp1 = temp2+'/'
255+        That is,
256+               strcmp (temp1, temp2) == 0
257+        after adding a slash to temp2 below.  It should be safe to not
258+        change those.
259+      */
260       t = get_working_directory ("symlink-hook");
261       temp1 = make_absolute (local_dirname, t);
262       free (t);
263@@ -2797,7 +2915,15 @@
264              temp2[len2 + 1] = '\0';
265            }
266        }
267-      return_value |= STREQ (local_dirname, temp2) == 0;
268+
269+      /* dircomplete_expand_relpath == 0 means we want to leave relative
270+        pathnames that are unchanged by canonicalization alone.
271+        *local_dirname != '/' && *local_dirname != '.' == relative pathname
272+        (consistent with general.c:absolute_pathname())
273+        temp1 == temp2 (after appending a slash to temp2) means the pathname
274+        is not changed by canonicalization as described above. */
275+      if (dircomplete_expand_relpath || ((local_dirname[0] != '/' && local_dirname[0] != '.') && STREQ (temp1, temp2) == 0))
276+       return_value |= STREQ (local_dirname, temp2) == 0;
277       free (local_dirname);
278       *dirname = temp2;
279       free (temp1);
280@@ -3002,12 +3128,13 @@
281 
282   orig_func = rl_completion_entry_function;
283   orig_attempt_func = rl_attempted_completion_function;
284-  orig_dir_func = rl_directory_rewrite_hook;
285   orig_ignore_func = rl_ignore_some_completions_function;
286   orig_rl_completer_word_break_characters = rl_completer_word_break_characters;
287+
288+  orig_dir_func = save_directory_hook ();
289+
290   rl_completion_entry_function = rl_filename_completion_function;
291   rl_attempted_completion_function = (rl_completion_func_t *)NULL;
292-  rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL;
293   rl_ignore_some_completions_function = filename_completion_ignore;
294   rl_completer_word_break_characters = " \t\n\"\'";
295 
296@@ -3015,10 +3142,11 @@
297 
298   rl_completion_entry_function = orig_func;
299   rl_attempted_completion_function = orig_attempt_func;
300-  rl_directory_rewrite_hook = orig_dir_func;
301   rl_ignore_some_completions_function = orig_ignore_func;
302   rl_completer_word_break_characters = orig_rl_completer_word_break_characters;
303 
304+  restore_directory_hook (orig_dir_func);
305+
306   return r;
307 }
308 
309diff -Naur bash-4.2.orig/bashline.h bash-4.2/bashline.h
310--- bash-4.2.orig/bashline.h    2009-01-04 19:32:22.000000000 +0000
[e307159]311+++ bash-4.2/bashline.h 2013-03-12 21:55:21.646771944 +0000
[31f34c6]312@@ -33,10 +33,15 @@
313 extern void bashline_reinitialize __P((void));
314 extern int bash_re_edit __P((char *));
315 
316+extern void bashline_set_event_hook __P((void));
317+extern void bashline_reset_event_hook __P((void));
318+
319 extern int bind_keyseq_to_unix_command __P((char *));
320 
321 extern char **bash_default_completion __P((const char *, int, int, int, int));
322 
323+void set_directory_hook __P((void));
324+
325 /* Used by programmable completion code. */
326 extern char *command_word_completion_function __P((const char *, int));
327 extern char *bash_groupname_completion_function __P((const char *, int));
328diff -Naur bash-4.2.orig/builtins/declare.def bash-4.2/builtins/declare.def
329--- bash-4.2.orig/builtins/declare.def  2010-05-30 22:25:21.000000000 +0000
[e307159]330+++ bash-4.2/builtins/declare.def       2013-03-12 21:55:21.587771709 +0000
[31f34c6]331@@ -513,6 +513,11 @@
332              *subscript_start = '[';   /* ] */
333              var = assign_array_element (name, value, 0);      /* XXX - not aflags */
334              *subscript_start = '\0';
335+             if (var == 0)     /* some kind of assignment error */
336+               {
337+                 assign_error++;
338+                 NEXT_VARIABLE ();
339+               }
340            }
341          else if (simple_array_assign)
342            {
343diff -Naur bash-4.2.orig/builtins/fc.def bash-4.2/builtins/fc.def
344--- bash-4.2.orig/builtins/fc.def       2010-05-30 22:25:38.000000000 +0000
[e307159]345+++ bash-4.2/builtins/fc.def    2013-03-12 21:55:21.521771446 +0000
[31f34c6]346@@ -304,7 +304,7 @@
347   last_hist = i - rh - hist_last_line_added;
348 
349   /* XXX */
350-  if (saved_command_line_count > 0 && i == last_hist && hlist[last_hist] == 0)
351+  if (i == last_hist && hlist[last_hist] == 0)
352     while (last_hist >= 0 && hlist[last_hist] == 0)
353       last_hist--;
354   if (last_hist < 0)
355@@ -475,7 +475,7 @@
356      HIST_ENTRY **hlist;
357 {
358   int sign, n, clen, rh;
359-  register int i, j;
360+  register int i, j, last_hist;
361   register char *s;
362 
363   sign = 1;
364@@ -495,7 +495,15 @@
365      has been enabled (interactive or not) should use it in the last_hist
366      calculation as if it were on. */
367   rh = remember_on_history || ((subshell_environment & SUBSHELL_COMSUB) && enable_history_list);
368-  i -= rh + hist_last_line_added;
369+  last_hist = i - rh - hist_last_line_added;
370+
371+  if (i == last_hist && hlist[last_hist] == 0)
372+    while (last_hist >= 0 && hlist[last_hist] == 0)
373+      last_hist--;
374+  if (last_hist < 0)
375+    return (-1);
376+
377+  i = last_hist;
378 
379   /* No specification defaults to most recent command. */
380   if (command == NULL)
381diff -Naur bash-4.2.orig/builtins/mapfile.def bash-4.2/builtins/mapfile.def
382--- bash-4.2.orig/builtins/mapfile.def  2010-05-30 02:09:47.000000000 +0000
[e307159]383+++ bash-4.2/builtins/mapfile.def       2013-03-12 21:55:21.675772060 +0000
[31f34c6]384@@ -195,13 +195,9 @@
385   /* Reset the buffer for bash own stream */
386   interrupt_immediately++;
387   for (array_index = origin, line_count = 1;
388-       zgetline (fd, &line, &line_length, unbuffered_read) != -1;
389-       array_index++, line_count++)
390+       zgetline (fd, &line, &line_length, unbuffered_read) != -1;
391+       array_index++)
392     {
393-      /* Have we exceeded # of lines to store? */
394-      if (line_count_goal != 0 && line_count > line_count_goal)
395-       break;
396-
397       /* Remove trailing newlines? */
398       if (flags & MAPF_CHOP)
399        do_chop (line);
400@@ -217,6 +213,11 @@
401        }
402 
403       bind_array_element (entry, array_index, line, 0);
404+
405+      /* Have we exceeded # of lines to store? */
406+      line_count++;
407+      if (line_count_goal != 0 && line_count > line_count_goal)
408+       break;
409     }
410 
411   xfree (line);
412diff -Naur bash-4.2.orig/builtins/printf.def bash-4.2/builtins/printf.def
413--- bash-4.2.orig/builtins/printf.def   2010-11-23 15:02:55.000000000 +0000
[e307159]414+++ bash-4.2/builtins/printf.def        2013-03-12 21:55:21.615771821 +0000
[31f34c6]415@@ -255,6 +255,8 @@
416 #endif
417            {
418              vflag = 1;
419+             if (vbsize == 0)
420+               vbuf = xmalloc (vbsize = 16);
421              vblen = 0;
422              if (vbuf)
423                vbuf[0] = 0;
424@@ -465,6 +467,9 @@
425                  secs = shell_start_time;      /* roughly $SECONDS */
426                else
427                  secs = arg;
428+#if defined (HAVE_TZSET)
429+               sv_tz ("TZ");           /* XXX -- just make sure */
430+#endif
431                tm = localtime (&secs);
432                n = strftime (timebuf, sizeof (timebuf), timefmt, tm);
433                free (timefmt);
434diff -Naur bash-4.2.orig/builtins/read.def bash-4.2/builtins/read.def
435--- bash-4.2.orig/builtins/read.def     2011-01-04 16:43:36.000000000 +0000
[e307159]436+++ bash-4.2/builtins/read.def  2013-03-12 21:55:21.734772295 +0000
437@@ -385,10 +385,20 @@
438        {
439          /* Tricky.  The top of the unwind-protect stack is the free of
440             input_string.  We want to run all the rest and use input_string,
441-            so we have to remove it from the stack. */
442-         remove_unwind_protect ();
443-         run_unwind_frame ("read_builtin");
444+            so we have to save input_string temporarily, run the unwind-
445+            protects, then restore input_string so we can use it later. */
446+
447          input_string[i] = '\0';       /* make sure it's terminated */
448+         if (i == 0)
449+           {
450+             t = (char *)xmalloc (1);
451+             t[0] = 0;
452+           }
453+         else
454+           t = savestring (input_string);
455+
456+         run_unwind_frame ("read_builtin");
457+         input_string = t;
458          retval = 128+SIGALRM;
459          goto assign_vars;
460        }
461@@ -642,6 +652,12 @@
[31f34c6]462          xfree (input_string);
463          return EXECUTION_FAILURE;     /* readonly or noassign */
464        }
465+      if (assoc_p (var))
466+       {
467+          builtin_error (_("%s: cannot convert associative to indexed array"), arrayname);
468+         xfree (input_string);
469+         return EXECUTION_FAILURE;     /* existing associative array */
470+       }
471       array_flush (array_cell (var));
472 
473       alist = list_string (input_string, ifs_chars, 0);
[e307159]474@@ -731,7 +747,7 @@
[31f34c6]475              xfree (t1);
476            }
477          else
478-           var = bind_read_variable (varname, t);
479+           var = bind_read_variable (varname, t ? t : "");
480        }
481       else
482        {
[e307159]483@@ -785,14 +801,14 @@
[31f34c6]484     }
485 #endif
486 
487-  if (saw_escape)
488+  if (saw_escape && input_string && *input_string)
489     {
490       t = dequote_string (input_string);
491       var = bind_read_variable (list->word->word, t);
492       xfree (t);
493     }
494   else
495-    var = bind_read_variable (list->word->word, input_string);
496+    var = bind_read_variable (list->word->word, input_string ? input_string : "");
497 
498   if (var)
499     {
500diff -Naur bash-4.2.orig/builtins/shopt.def bash-4.2/builtins/shopt.def
501--- bash-4.2.orig/builtins/shopt.def    2010-07-03 02:42:44.000000000 +0000
[e307159]502+++ bash-4.2/builtins/shopt.def 2013-03-12 21:55:21.647771948 +0000
[31f34c6]503@@ -61,6 +61,10 @@
504 #include "common.h"
505 #include "bashgetopt.h"
506 
507+#if defined (READLINE)
508+#  include "../bashline.h"
509+#endif
510+
511 #if defined (HISTORY)
512 #  include "../bashhist.h"
513 #endif
514@@ -94,7 +98,7 @@
515 extern int hist_verify, history_reediting, perform_hostname_completion;
516 extern int no_empty_command_completion;
517 extern int force_fignore;
518-extern int dircomplete_spelling;
519+extern int dircomplete_spelling, dircomplete_expand;
520 
521 extern int enable_hostname_completion __P((int));
522 #endif
523@@ -121,6 +125,10 @@
524 static int set_restricted_shell __P((char *, int));
525 #endif
526 
527+#if defined (READLINE)
528+static int shopt_set_complete_direxpand __P((char *, int));
529+#endif
530+
531 static int shopt_login_shell;
532 static int shopt_compat31;
533 static int shopt_compat32;
534@@ -150,6 +158,7 @@
535   { "compat40", &shopt_compat40, set_compatibility_level },
536   { "compat41", &shopt_compat41, set_compatibility_level },
537 #if defined (READLINE)
538+  { "direxpand", &dircomplete_expand, shopt_set_complete_direxpand },
539   { "dirspell", &dircomplete_spelling, (shopt_set_func_t *)NULL },
540 #endif
541   { "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL },
542@@ -535,6 +544,17 @@
543   return 0;
544 }
545 
546+#if defined (READLINE)
547+static int
548+shopt_set_complete_direxpand (option_name, mode)
549+     char *option_name;
550+     int mode;
551+{
552+  set_directory_hook ();
553+  return 0;
554+}
555+#endif
556+
557 #if defined (RESTRICTED_SHELL)
558 /* Don't allow the value of restricted_shell to be modified. */
559 
560diff -Naur bash-4.2.orig/command.h bash-4.2/command.h
561--- bash-4.2.orig/command.h     2010-08-02 23:36:51.000000000 +0000
[e307159]562+++ bash-4.2/command.h  2013-03-12 21:55:21.619771836 +0000
[31f34c6]563@@ -97,6 +97,7 @@
564 #define W_HASCTLESC    0x200000        /* word contains literal CTLESC characters */
565 #define W_ASSIGNASSOC  0x400000        /* word looks like associative array assignment */
566 #define W_ARRAYIND     0x800000        /* word is an array index being expanded */
567+#define W_ASSNGLOBAL   0x1000000       /* word is a global assignment to declare (declare/typeset -g) */
568 
569 /* Possible values for subshell_environment */
570 #define SUBSHELL_ASYNC 0x01    /* subshell caused by `command &' */
571diff -Naur bash-4.2.orig/doc/bash.1 bash-4.2/doc/bash.1
572--- bash-4.2.orig/doc/bash.1    2011-01-16 20:31:39.000000000 +0000
[e307159]573+++ bash-4.2/doc/bash.1 2013-03-12 21:55:21.650771960 +0000
[31f34c6]574@@ -8948,6 +8948,16 @@
575 quoted.  This is the behavior of posix mode through version 4.1.
576 The default bash behavior remains as in previous versions.
577 .TP 8
578+.B direxpand
579+If set,
580+.B bash
581+replaces directory names with the results of word expansion when performing
582+filename completion.  This changes the contents of the readline editing
583+buffer.
584+If not set,
585+.B bash
586+attempts to preserve what the user typed.
587+.TP 8
588 .B dirspell
589 If set,
590 .B bash
591diff -Naur bash-4.2.orig/doc/bashref.texi bash-4.2/doc/bashref.texi
592--- bash-4.2.orig/doc/bashref.texi      2011-01-16 20:31:57.000000000 +0000
[e307159]593+++ bash-4.2/doc/bashref.texi   2013-03-12 21:55:21.653771972 +0000
[31f34c6]594@@ -4535,6 +4535,13 @@
595 quoted.  This is the behavior of @sc{posix} mode through version 4.1.
596 The default Bash behavior remains as in previous versions.
597 
598+@item direxpand
599+If set, Bash
600+replaces directory names with the results of word expansion when performing
601+filename completion.  This changes the contents of the readline editing
602+buffer.
603+If not set, Bash attempts to preserve what the user typed.
604+
605 @item dirspell
606 If set, Bash
607 attempts spelling correction on directory names during word completion
608diff -Naur bash-4.2.orig/error.c bash-4.2/error.c
609--- bash-4.2.orig/error.c       2009-08-22 02:31:31.000000000 +0000
[e307159]610+++ bash-4.2/error.c    2013-03-12 21:55:21.610771801 +0000
[31f34c6]611@@ -200,7 +200,11 @@
612 
613   va_end (args);
614   if (exit_immediately_on_error)
615-    exit_shell (1);
616+    {
617+      if (last_command_exit_value == 0)
618+       last_command_exit_value = 1;
619+      exit_shell (last_command_exit_value);
620+    }
621 }
622 
623 void
624diff -Naur bash-4.2.orig/execute_cmd.c bash-4.2/execute_cmd.c
625--- bash-4.2.orig/execute_cmd.c 2011-02-09 22:32:25.000000000 +0000
[e307159]626+++ bash-4.2/execute_cmd.c      2013-03-12 21:55:21.627771868 +0000
[31f34c6]627@@ -2196,6 +2196,7 @@
628   if (ignore_return && cmd)
629     cmd->flags |= CMD_IGNORE_RETURN;
630 
631+#if defined (JOB_CONTROL)
632   lastpipe_flag = 0;
633   begin_unwind_frame ("lastpipe-exec");
634   lstdin = -1;
635@@ -2204,7 +2205,7 @@
636      current shell environment. */
637   if (lastpipe_opt && job_control == 0 && asynchronous == 0 && pipe_out == NO_PIPE && prev > 0)
638     {
639-      lstdin = move_to_high_fd (0, 0, 255);
640+      lstdin = move_to_high_fd (0, 1, -1);
641       if (lstdin > 0)
642        {
643          do_piping (prev, pipe_out);
644@@ -2215,15 +2216,19 @@
645          lastpipe_jid = stop_pipeline (0, (COMMAND *)NULL);    /* XXX */
646          add_unwind_protect (lastpipe_cleanup, lastpipe_jid);
647        }
648-      cmd->flags |= CMD_LASTPIPE;
649+      if (cmd)
650+       cmd->flags |= CMD_LASTPIPE;
651     }   
652   if (prev >= 0)
653     add_unwind_protect (close, prev);
654+#endif
655 
656   exec_result = execute_command_internal (cmd, asynchronous, prev, pipe_out, fds_to_close);
657 
658+#if defined (JOB_CONTROL)
659   if (lstdin > 0)
660     restore_stdin (lstdin);
661+#endif
662 
663   if (prev >= 0)
664     close (prev);
665@@ -2246,7 +2251,9 @@
666       unfreeze_jobs_list ();
667     }
668 
669+#if defined (JOB_CONTROL)
670   discard_unwind_frame ("lastpipe-exec");
671+#endif
672 
673   return (exec_result);
674 }
675@@ -3575,13 +3582,13 @@
676 {
677   WORD_LIST *w;
678   struct builtin *b;
679-  int assoc;
680+  int assoc, global;
681 
682   if (words == 0)
683     return;
684 
685   b = 0;
686-  assoc = 0;
687+  assoc = global = 0;
688 
689   for (w = words; w; w = w->next)
690     if (w->word->flags & W_ASSIGNMENT)
691@@ -3598,12 +3605,17 @@
692 #if defined (ARRAY_VARS)
693        if (assoc)
694          w->word->flags |= W_ASSIGNASSOC;
695+       if (global)
696+         w->word->flags |= W_ASSNGLOBAL;
697 #endif
698       }
699 #if defined (ARRAY_VARS)
700     /* Note that we saw an associative array option to a builtin that takes
701        assignment statements.  This is a bit of a kludge. */
702-    else if (w->word->word[0] == '-' && strchr (w->word->word, 'A'))
703+    else if (w->word->word[0] == '-' && (strchr (w->word->word+1, 'A') || strchr (w->word->word+1, 'g')))
704+#else
705+    else if (w->word->word[0] == '-' && strchr (w->word->word+1, 'g'))
706+#endif
707       {
708        if (b == 0)
709          {
710@@ -3613,10 +3625,11 @@
711            else if (b && (b->flags & ASSIGNMENT_BUILTIN))
712              words->word->flags |= W_ASSNBLTIN;
713          }
714-       if (words->word->flags & W_ASSNBLTIN)
715+       if ((words->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'A'))
716          assoc = 1;
717+       if ((words->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'g'))
718+         global = 1;
719       }
720-#endif
721 }
722 
723 /* Return 1 if the file found by searching $PATH for PATHNAME, defaulting
724diff -Naur bash-4.2.orig/expr.c bash-4.2/expr.c
725--- bash-4.2.orig/expr.c        2010-12-21 16:12:13.000000000 +0000
[e307159]726+++ bash-4.2/expr.c     2013-03-12 21:55:21.706772183 +0000
[31f34c6]727@@ -476,19 +476,23 @@
728 
729       if (special)
730        {
731+         if ((op == DIV || op == MOD) && value == 0)
732+           {
733+             if (noeval == 0)
734+               evalerror (_("division by 0"));
735+             else
736+               value = 1;
737+           }
738+
739          switch (op)
740            {
741            case MUL:
742              lvalue *= value;
743              break;
744            case DIV:
745-             if (value == 0)
746-               evalerror (_("division by 0"));
747              lvalue /= value;
748              break;
749            case MOD:
750-             if (value == 0)
751-               evalerror (_("division by 0"));
752              lvalue %= value;
753              break;
754            case PLUS:
755@@ -804,7 +808,12 @@
756       val2 = exppower ();
757 
758       if (((op == DIV) || (op == MOD)) && (val2 == 0))
759-       evalerror (_("division by 0"));
760+       {
761+         if (noeval == 0)
762+           evalerror (_("division by 0"));
763+         else
764+           val2 = 1;
765+       }
766 
767       if (op == MUL)
768        val1 *= val2;
769@@ -1000,6 +1009,12 @@
770   arrayind_t ind;
771 #endif
772 
773+/*itrace("expr_streval: %s: noeval = %d", tok, noeval);*/
774+  /* If we are suppressing evaluation, just short-circuit here instead of
775+     going through the rest of the evaluator. */
776+  if (noeval)
777+    return (0);
778+
779   /* [[[[[ */
780 #if defined (ARRAY_VARS)
781   v = (e == ']') ? array_variable_part (tok, (char **)0, (int *)0) : find_variable (tok);
782@@ -1173,6 +1188,10 @@
783 #endif /* ARRAY_VARS */
784 
785       *cp = '\0';
786+      /* XXX - watch out for pointer aliasing issues here */
787+      if (curlval.tokstr && curlval.tokstr == tokstr)
788+       init_lvalue (&curlval);
789+
790       FREE (tokstr);
791       tokstr = savestring (tp);
792       *cp = c;
793diff -Naur bash-4.2.orig/lib/glob/glob.c bash-4.2/lib/glob/glob.c
794--- bash-4.2.orig/lib/glob/glob.c       2009-11-14 23:39:30.000000000 +0000
[e307159]795+++ bash-4.2/lib/glob/glob.c    2013-03-12 21:55:21.658771992 +0000
[31f34c6]796@@ -200,8 +200,11 @@
797   wchar_t *pat_wc, *dn_wc;
798   size_t pat_n, dn_n;
799 
800+  pat_wc = dn_wc = (wchar_t *)NULL;
801+
802   pat_n = xdupmbstowcs (&pat_wc, NULL, pat);
803-  dn_n = xdupmbstowcs (&dn_wc, NULL, dname);
804+  if (pat_n != (size_t)-1)
805+    dn_n = xdupmbstowcs (&dn_wc, NULL, dname);
806 
807   ret = 0;
808   if (pat_n != (size_t)-1 && dn_n !=(size_t)-1)
809@@ -221,6 +224,8 @@
810           (pat_wc[0] != L'\\' || pat_wc[1] != L'.'))
811        ret = 1;
812     }
813+  else
814+    ret = skipname (pat, dname, flags);
815 
816   FREE (pat_wc);
817   FREE (dn_wc);
818@@ -266,8 +271,11 @@
819   /* Convert the strings into wide characters.  */
820   n = xdupmbstowcs (&wpathname, NULL, pathname);
821   if (n == (size_t) -1)
822-    /* Something wrong. */
823-    return;
824+    {
825+      /* Something wrong.  Fall back to single-byte */
826+      udequote_pathname (pathname);
827+      return;
828+    }
829   orig_wpathname = wpathname;
830 
831   for (i = j = 0; wpathname && wpathname[i]; )
832diff -Naur bash-4.2.orig/lib/glob/gmisc.c bash-4.2/lib/glob/gmisc.c
833--- bash-4.2.orig/lib/glob/gmisc.c      2011-02-05 21:11:17.000000000 +0000
[e307159]834+++ bash-4.2/lib/glob/gmisc.c   2013-03-12 21:55:21.465771223 +0000
[31f34c6]835@@ -77,8 +77,8 @@
836      wchar_t *wpat;
837      size_t wmax;
838 {
839-  wchar_t wc, *wbrack;
840-  int matlen, t, in_cclass, in_collsym, in_equiv;
841+  wchar_t wc;
842+  int matlen, bracklen, t, in_cclass, in_collsym, in_equiv;
843 
844   if (*wpat == 0)
845     return (0);
846@@ -118,58 +118,80 @@
847          break;
848        case L'[':
849          /* scan for ending `]', skipping over embedded [:...:] */
850-         wbrack = wpat;
851+         bracklen = 1;
852          wc = *wpat++;
853          do
854            {
855              if (wc == 0)
856                {
857-                 matlen += wpat - wbrack - 1;  /* incremented below */
858-                 break;
859+                 wpat--;                       /* back up to NUL */
860+                 matlen += bracklen;
861+                 goto bad_bracket;
862                }
863              else if (wc == L'\\')
864                {
865-                 wc = *wpat++;
866-                 if (*wpat == 0)
867-                   break;
868+                 /* *wpat == backslash-escaped character */
869+                 bracklen++;
870+                 /* If the backslash or backslash-escape ends the string,
871+                    bail.  The ++wpat skips over the backslash escape */
872+                 if (*wpat == 0 || *++wpat == 0)
873+                   {
874+                     matlen += bracklen;
875+                     goto bad_bracket;
876+                   }
877                }
878              else if (wc == L'[' && *wpat == L':')     /* character class */
879                {
880                  wpat++;
881+                 bracklen++;
882                  in_cclass = 1;
883                }
884              else if (in_cclass && wc == L':' && *wpat == L']')
885                {
886                  wpat++;
887+                 bracklen++;
888                  in_cclass = 0;
889                }
890              else if (wc == L'[' && *wpat == L'.')     /* collating symbol */
891                {
892                  wpat++;
893+                 bracklen++;
894                  if (*wpat == L']')    /* right bracket can appear as collating symbol */
895-                   wpat++;
896+                   {
897+                     wpat++;
898+                     bracklen++;
899+                   }
900                  in_collsym = 1;
901                }
902              else if (in_collsym && wc == L'.' && *wpat == L']')
903                {
904                  wpat++;
905+                 bracklen++;
906                  in_collsym = 0;
907                }
908              else if (wc == L'[' && *wpat == L'=')     /* equivalence class */
909                {
910                  wpat++;
911+                 bracklen++;
912                  if (*wpat == L']')    /* right bracket can appear as equivalence class */
913-                   wpat++;
914+                   {
915+                     wpat++;
916+                     bracklen++;
917+                   }
918                  in_equiv = 1;
919                }
920              else if (in_equiv && wc == L'=' && *wpat == L']')
921                {
922                  wpat++;
923+                 bracklen++;
924                  in_equiv = 0;
925                }
926+             else
927+               bracklen++;
928            }
929          while ((wc = *wpat++) != L']');
930          matlen++;             /* bracket expression can only match one char */
931+bad_bracket:
932          break;
933        }
934     }
935@@ -213,8 +235,8 @@
936      char *pat;
937      size_t max;
938 {
939-  char c, *brack;
940-  int matlen, t, in_cclass, in_collsym, in_equiv;
941+  char c;
942+  int matlen, bracklen, t, in_cclass, in_collsym, in_equiv;
943 
944   if (*pat == 0)
945     return (0);
946@@ -254,58 +276,80 @@
947          break;
948        case '[':
949          /* scan for ending `]', skipping over embedded [:...:] */
950-         brack = pat;
951+         bracklen = 1;
952          c = *pat++;
953          do
954            {
955              if (c == 0)
956                {
957-                 matlen += pat - brack - 1;    /* incremented below */
958-                 break;
959+                 pat--;                        /* back up to NUL */
960+                 matlen += bracklen;
961+                 goto bad_bracket;
962                }
963              else if (c == '\\')
964                {
965-                 c = *pat++;
966-                 if (*pat == 0)
967-                   break;
968+                 /* *pat == backslash-escaped character */
969+                 bracklen++;
970+                 /* If the backslash or backslash-escape ends the string,
971+                    bail.  The ++pat skips over the backslash escape */
972+                 if (*pat == 0 || *++pat == 0)
973+                   {
974+                     matlen += bracklen;
975+                     goto bad_bracket;
976+                   }
977                }
978              else if (c == '[' && *pat == ':') /* character class */
979                {
980                  pat++;
981+                 bracklen++;
982                  in_cclass = 1;
983                }
984              else if (in_cclass && c == ':' && *pat == ']')
985                {
986                  pat++;
987+                 bracklen++;
988                  in_cclass = 0;
989                }
990              else if (c == '[' && *pat == '.') /* collating symbol */
991                {
992                  pat++;
993+                 bracklen++;
994                  if (*pat == ']')      /* right bracket can appear as collating symbol */
995-                   pat++;
996+                   {
997+                     pat++;
998+                     bracklen++;
999+                   }
1000                  in_collsym = 1;
1001                }
1002              else if (in_collsym && c == '.' && *pat == ']')
1003                {
1004                  pat++;
1005+                 bracklen++;
1006                  in_collsym = 0;
1007                }
1008              else if (c == '[' && *pat == '=') /* equivalence class */
1009                {
1010                  pat++;
1011+                 bracklen++;
1012                  if (*pat == ']')      /* right bracket can appear as equivalence class */
1013-                   pat++;
1014+                   {
1015+                     pat++;
1016+                     bracklen++;
1017+                   }
1018                  in_equiv = 1;
1019                }
1020              else if (in_equiv && c == '=' && *pat == ']')
1021                {
1022                  pat++;
1023+                 bracklen++;
1024                  in_equiv = 0;
1025                }
1026+             else
1027+               bracklen++;
1028            }
1029          while ((c = *pat++) != ']');
1030          matlen++;             /* bracket expression can only match one char */
1031+bad_bracket:
1032          break;
1033        }
1034     }
1035diff -Naur bash-4.2.orig/lib/glob/xmbsrtowcs.c bash-4.2/lib/glob/xmbsrtowcs.c
1036--- bash-4.2.orig/lib/glob/xmbsrtowcs.c 2010-05-30 22:36:27.000000000 +0000
[e307159]1037+++ bash-4.2/lib/glob/xmbsrtowcs.c      2013-03-12 21:55:21.736772303 +0000
[31f34c6]1038@@ -35,6 +35,8 @@
1039 
1040 #if HANDLE_MULTIBYTE
1041 
1042+#define WSBUF_INC 32
1043+
1044 #ifndef FREE
1045 #  define FREE(x)      do { if (x) free (x); } while (0)
1046 #endif
1047@@ -148,7 +150,7 @@
1048   size_t wsbuf_size;   /* Size of WSBUF */
1049   size_t wcnum;                /* Number of wide characters in WSBUF */
1050   mbstate_t state;     /* Conversion State */
1051-  size_t wcslength;    /* Number of wide characters produced by the conversion. */
1052+  size_t n, wcslength; /* Number of wide characters produced by the conversion. */
1053   const char *end_or_backslash;
1054   size_t nms;  /* Number of multibyte characters to convert at one time. */
1055   mbstate_t tmp_state;
1056@@ -171,7 +173,18 @@
1057       /* Compute the number of produced wide-characters. */
1058       tmp_p = p;
1059       tmp_state = state;
1060-      wcslength = mbsnrtowcs(NULL, &tmp_p, nms, 0, &tmp_state);
1061+
1062+      if (nms == 0 && *p == '\\')      /* special initial case */
1063+       nms = wcslength = 1;
1064+      else
1065+       wcslength = mbsnrtowcs (NULL, &tmp_p, nms, 0, &tmp_state);
1066+
1067+      if (wcslength == 0)
1068+       {
1069+         tmp_p = p;            /* will need below */
1070+         tmp_state = state;
1071+         wcslength = 1;        /* take a single byte */
1072+       }
1073 
1074       /* Conversion failed. */
1075       if (wcslength == (size_t)-1)
1076@@ -186,7 +199,8 @@
1077        {
1078          wchar_t *wstmp;
1079 
1080-         wsbuf_size = wcnum+wcslength+1;       /* 1 for the L'\0' or the potential L'\\' */
1081+         while (wsbuf_size < wcnum+wcslength+1) /* 1 for the L'\0' or the potential L'\\' */
1082+           wsbuf_size += WSBUF_INC;
1083 
1084          wstmp = (wchar_t *) realloc (wsbuf, wsbuf_size * sizeof (wchar_t));
1085          if (wstmp == NULL)
[e307159]1086@@ -199,10 +213,30 @@
[31f34c6]1087        }
1088 
1089       /* Perform the conversion. This is assumed to return 'wcslength'.
1090-       * It may set 'p' to NULL. */
1091-      mbsnrtowcs(wsbuf+wcnum, &p, nms, wsbuf_size-wcnum, &state);
1092+        It may set 'p' to NULL. */
1093+      n = mbsnrtowcs(wsbuf+wcnum, &p, nms, wsbuf_size-wcnum, &state);
1094 
1095-      wcnum += wcslength;
[e307159]1096+      if (n == 0 && p == 0)
1097+       {
1098+         wsbuf[wcnum] = L'\0';
1099+         break;
1100+       }
1101+
[31f34c6]1102+      /* Compensate for taking single byte on wcs conversion failure above. */
1103+      if (wcslength == 1 && (n == 0 || n == (size_t)-1))
1104+       {
1105+         state = tmp_state;
1106+         p = tmp_p;
[e307159]1107+         wsbuf[wcnum] = *p;
1108+         if (*p == 0)
1109+           break;
1110+         else
1111+           {
1112+             wcnum++; p++;
1113+           }
[31f34c6]1114+       }
1115+      else
1116+        wcnum += wcslength;
1117 
1118       if (mbsinit (&state) && (p != NULL) && (*p == '\\'))
1119        {
[e307159]1120@@ -230,8 +264,6 @@
[31f34c6]1121    If conversion is failed, the return value is (size_t)-1 and the values
1122    of DESTP and INDICESP are NULL. */
1123 
1124-#define WSBUF_INC 32
1125-
1126 size_t
1127 xdupmbstowcs (destp, indicesp, src)
1128     wchar_t **destp;   /* Store the pointer to the wide character string */
1129diff -Naur bash-4.2.orig/lib/readline/callback.c bash-4.2/lib/readline/callback.c
1130--- bash-4.2.orig/lib/readline/callback.c       2010-06-06 16:18:58.000000000 +0000
[e307159]1131+++ bash-4.2/lib/readline/callback.c    2013-03-12 21:55:21.461771207 +0000
[31f34c6]1132@@ -148,6 +148,9 @@
1133          eof = _rl_vi_domove_callback (_rl_vimvcxt);
1134          /* Should handle everything, including cleanup, numeric arguments,
1135             and turning off RL_STATE_VIMOTION */
1136+         if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0)
1137+           _rl_internal_char_cleanup ();
1138+
1139          return;
1140        }
1141 #endif
1142diff -Naur bash-4.2.orig/lib/readline/input.c bash-4.2/lib/readline/input.c
1143--- bash-4.2.orig/lib/readline/input.c  2010-05-30 22:33:01.000000000 +0000
[e307159]1144+++ bash-4.2/lib/readline/input.c       2013-03-12 21:55:21.661772004 +0000
[31f34c6]1145@@ -409,7 +409,7 @@
1146 int
1147 rl_read_key ()
1148 {
1149-  int c;
1150+  int c, r;
1151 
1152   rl_key_sequence_length++;
1153 
1154@@ -429,14 +429,18 @@
1155        {
1156          while (rl_event_hook)
1157            {
1158-             if (rl_gather_tyi () < 0) /* XXX - EIO */
1159+             if (rl_get_char (&c) != 0)
1160+               break;
1161+               
1162+             if ((r = rl_gather_tyi ()) < 0)   /* XXX - EIO */
1163                {
1164                  rl_done = 1;
1165                  return ('\n');
1166                }
1167+             else if (r == 1)                  /* read something */
1168+               continue;
1169+
1170              RL_CHECK_SIGNALS ();
1171-             if (rl_get_char (&c) != 0)
1172-               break;
1173              if (rl_done)              /* XXX - experimental */
1174                return ('\n');
1175              (*rl_event_hook) ();
1176diff -Naur bash-4.2.orig/lib/readline/vi_mode.c bash-4.2/lib/readline/vi_mode.c
1177--- bash-4.2.orig/lib/readline/vi_mode.c        2010-11-21 00:51:39.000000000 +0000
[e307159]1178+++ bash-4.2/lib/readline/vi_mode.c     2013-03-12 21:55:21.698772151 +0000
[31f34c6]1179@@ -1114,7 +1114,7 @@
1180       rl_beg_of_line (1, c);
1181       _rl_vi_last_motion = c;
1182       RL_UNSETSTATE (RL_STATE_VIMOTION);
1183-      return (0);
1184+      return (vidomove_dispatch (m));
1185     }
1186 #if defined (READLINE_CALLBACKS)
1187   /* XXX - these need to handle rl_universal_argument bindings */
1188@@ -1234,11 +1234,19 @@
1189       _rl_vimvcxt->motion = '$';
1190       r = rl_domove_motion_callback (_rl_vimvcxt);
1191     }
1192-  else if (vi_redoing)
1193+  else if (vi_redoing && _rl_vi_last_motion != 'd')    /* `dd' is special */
1194     {
1195       _rl_vimvcxt->motion = _rl_vi_last_motion;
1196       r = rl_domove_motion_callback (_rl_vimvcxt);
1197     }
1198+  else if (vi_redoing)         /* handle redoing `dd' here */
1199+    {
1200+      _rl_vimvcxt->motion = _rl_vi_last_motion;
1201+      rl_mark = rl_end;
1202+      rl_beg_of_line (1, key);
1203+      RL_UNSETSTATE (RL_STATE_VIMOTION);
1204+      r = vidomove_dispatch (_rl_vimvcxt);
1205+    }
1206 #if defined (READLINE_CALLBACKS)
1207   else if (RL_ISSTATE (RL_STATE_CALLBACK))
1208     {
1209@@ -1316,11 +1324,19 @@
1210       _rl_vimvcxt->motion = '$';
1211       r = rl_domove_motion_callback (_rl_vimvcxt);
1212     }
1213-  else if (vi_redoing)
1214+  else if (vi_redoing && _rl_vi_last_motion != 'c')    /* `cc' is special */
1215     {
1216       _rl_vimvcxt->motion = _rl_vi_last_motion;
1217       r = rl_domove_motion_callback (_rl_vimvcxt);
1218     }
1219+  else if (vi_redoing)         /* handle redoing `cc' here */
1220+    {
1221+      _rl_vimvcxt->motion = _rl_vi_last_motion;
1222+      rl_mark = rl_end;
1223+      rl_beg_of_line (1, key);
1224+      RL_UNSETSTATE (RL_STATE_VIMOTION);
1225+      r = vidomove_dispatch (_rl_vimvcxt);
1226+    }
1227 #if defined (READLINE_CALLBACKS)
1228   else if (RL_ISSTATE (RL_STATE_CALLBACK))
1229     {
1230@@ -1377,6 +1393,19 @@
1231       _rl_vimvcxt->motion = '$';
1232       r = rl_domove_motion_callback (_rl_vimvcxt);
1233     }
1234+  else if (vi_redoing && _rl_vi_last_motion != 'y')    /* `yy' is special */
1235+    {
1236+      _rl_vimvcxt->motion = _rl_vi_last_motion;
1237+      r = rl_domove_motion_callback (_rl_vimvcxt);
1238+    }
1239+  else if (vi_redoing)                 /* handle redoing `yy' here */
1240+    {
1241+      _rl_vimvcxt->motion = _rl_vi_last_motion;
1242+      rl_mark = rl_end;
1243+      rl_beg_of_line (1, key);
1244+      RL_UNSETSTATE (RL_STATE_VIMOTION);
1245+      r = vidomove_dispatch (_rl_vimvcxt);
1246+    }
1247 #if defined (READLINE_CALLBACKS)
1248   else if (RL_ISSTATE (RL_STATE_CALLBACK))
1249     {
1250diff -Naur bash-4.2.orig/lib/sh/eaccess.c bash-4.2/lib/sh/eaccess.c
1251--- bash-4.2.orig/lib/sh/eaccess.c      2011-01-09 01:50:10.000000000 +0000
[e307159]1252+++ bash-4.2/lib/sh/eaccess.c   2013-03-12 21:55:21.668772032 +0000
[31f34c6]1253@@ -82,6 +82,8 @@
1254      const char *path;
1255      struct stat *finfo;
1256 {
1257+  static char *pbuf = 0;
1258+
1259   if (*path == '\0')
1260     {
1261       errno = ENOENT;
1262@@ -106,7 +108,7 @@
1263      trailing slash.  Make sure /dev/fd/xx really uses DEV_FD_PREFIX/xx.
1264      On most systems, with the notable exception of linux, this is
1265      effectively a no-op. */
1266-      char pbuf[32];
1267+      pbuf = xrealloc (pbuf, sizeof (DEV_FD_PREFIX) + strlen (path + 8));
1268       strcpy (pbuf, DEV_FD_PREFIX);
1269       strcat (pbuf, path + 8);
1270       return (stat (pbuf, finfo));
1271diff -Naur bash-4.2.orig/lib/sh/zread.c bash-4.2/lib/sh/zread.c
1272--- bash-4.2.orig/lib/sh/zread.c        2009-03-02 13:54:45.000000000 +0000
[e307159]1273+++ bash-4.2/lib/sh/zread.c     2013-03-12 21:55:21.601771765 +0000
[31f34c6]1274@@ -160,14 +160,13 @@
1275 zsyncfd (fd)
1276      int fd;
1277 {
1278-  off_t off;
1279-  int r;
1280+  off_t off, r;
1281 
1282   off = lused - lind;
1283   r = 0;
1284   if (off > 0)
1285     r = lseek (fd, -off, SEEK_CUR);
1286 
1287-  if (r >= 0)
1288+  if (r != -1)
1289     lused = lind = 0;
1290 }
1291diff -Naur bash-4.2.orig/parse.y bash-4.2/parse.y
1292--- bash-4.2.orig/parse.y       2011-01-02 20:48:11.000000000 +0000
[e307159]1293+++ bash-4.2/parse.y    2013-03-12 21:55:21.731772283 +0000
1294@@ -2393,6 +2393,7 @@
1295           is the last character).  If it's not the last character, we need
1296           to consume the quoted newline and move to the next character in
1297           the expansion. */
1298+#if defined (ALIAS)
1299        if (expanding_alias () && shell_input_line[shell_input_line_index+1] == '\0')
1300          {
1301            uc = 0;
1302@@ -2403,7 +2404,8 @@
1303            shell_input_line_index++;   /* skip newline */
1304            goto next_alias_char;       /* and get next character */
1305          }
1306-       else       
1307+       else
1308+#endif
1309          goto restart_read;
1310     }
1311 
1312@@ -2499,7 +2501,7 @@
[31f34c6]1313         We do this only if it is time to do so. Notice that only here
1314         is the mail alarm reset; nothing takes place in check_mail ()
1315         except the checking of mail.  Please don't change this. */
1316-      if (prompt_is_ps1 && time_to_check_mail ())
1317+      if (prompt_is_ps1 && parse_and_execute_level == 0 && time_to_check_mail ())
1318        {
1319          check_mail ();
1320          reset_mail_timer ();
[e307159]1321@@ -3842,6 +3844,7 @@
[31f34c6]1322      int flags;
1323 {
1324   sh_parser_state_t ps;
1325+  sh_input_line_state_t ls;
1326   int orig_ind, nc, sflags;
1327   char *ret, *s, *ep, *ostring;
1328 
[e307159]1329@@ -3849,10 +3852,12 @@
[31f34c6]1330   orig_ind = *indp;
1331   ostring = string;
1332 
1333+/*itrace("xparse_dolparen: size = %d shell_input_line = `%s'", shell_input_line_size, shell_input_line);*/
1334   sflags = SEVAL_NONINT|SEVAL_NOHIST|SEVAL_NOFREE;
1335   if (flags & SX_NOLONGJMP)
1336     sflags |= SEVAL_NOLONGJMP;
1337   save_parser_state (&ps);
1338+  save_input_line_state (&ls);
1339 
1340   /*(*/
1341   parser_state |= PST_CMDSUBST|PST_EOFTOKEN;   /* allow instant ')' */ /*(*/
[e307159]1342@@ -3861,6 +3866,8 @@
[31f34c6]1343 
1344   restore_parser_state (&ps);
1345   reset_parser ();
1346+  /* reset_parser clears shell_input_line and associated variables */
1347+  restore_input_line_state (&ls);
1348   if (interactive)
1349     token_to_read = 0;
1350 
[e307159]1351@@ -4895,6 +4902,9 @@
[31f34c6]1352       return (current_command_line_count == 2 ? "\n" : "");
1353     }
1354 
1355+  if (parser_state & PST_COMPASSIGN)
1356+    return (" ");
1357+
1358   /* First, handle some special cases. */
1359   /*(*/
1360   /* If we just read `()', assume it's a function definition, and don't
[e307159]1361@@ -5135,6 +5145,9 @@
[31f34c6]1362            case 'A':
1363              /* Make the current time/date into a string. */
1364              (void) time (&the_time);
1365+#if defined (HAVE_TZSET)
1366+             sv_tz ("TZ");             /* XXX -- just make sure */
1367+#endif
1368              tm = localtime (&the_time);
1369 
1370              if (c == 'd')
[e307159]1371@@ -5905,6 +5918,12 @@
[31f34c6]1372   ps->expand_aliases = expand_aliases;
1373   ps->echo_input_at_read = echo_input_at_read;
1374 
1375+  ps->token = token;
1376+  ps->token_buffer_size = token_buffer_size;
1377+  /* Force reallocation on next call to read_token_word */
1378+  token = 0;
1379+  token_buffer_size = 0;
1380+
1381   return (ps);
1382 }
1383 
[e307159]1384@@ -5946,6 +5965,42 @@
[31f34c6]1385 
1386   expand_aliases = ps->expand_aliases;
1387   echo_input_at_read = ps->echo_input_at_read;
1388+
1389+  FREE (token);
1390+  token = ps->token;
1391+  token_buffer_size = ps->token_buffer_size;
1392+}
1393+
1394+sh_input_line_state_t *
1395+save_input_line_state (ls)
1396+     sh_input_line_state_t *ls;
1397+{
1398+  if (ls == 0)
1399+    ls = (sh_input_line_state_t *)xmalloc (sizeof (sh_input_line_state_t));
1400+  if (ls == 0)
1401+    return ((sh_input_line_state_t *)NULL);
1402+
1403+  ls->input_line = shell_input_line;
1404+  ls->input_line_size = shell_input_line_size;
1405+  ls->input_line_len = shell_input_line_len;
1406+  ls->input_line_index = shell_input_line_index;
1407+
1408+  /* force reallocation */
1409+  shell_input_line = 0;
1410+  shell_input_line_size = shell_input_line_len = shell_input_line_index = 0;
1411+}
1412+
1413+void
1414+restore_input_line_state (ls)
1415+     sh_input_line_state_t *ls;
1416+{
1417+  FREE (shell_input_line);
1418+  shell_input_line = ls->input_line;
1419+  shell_input_line_size = ls->input_line_size;
1420+  shell_input_line_len = ls->input_line_len;
1421+  shell_input_line_index = ls->input_line_index;
1422+
1423+  set_line_mbstate ();
1424 }
1425 
1426 /************************************************
1427diff -Naur bash-4.2.orig/patchlevel.h bash-4.2/patchlevel.h
1428--- bash-4.2.orig/patchlevel.h  2010-06-13 00:14:48.000000000 +0000
[e307159]1429+++ bash-4.2/patchlevel.h       2013-03-12 21:55:21.740772319 +0000
[31f34c6]1430@@ -25,6 +25,6 @@
1431    regexp `^#define[   ]*PATCHLEVEL', since that's what support/mkversion.sh
1432    looks for to find the patch level (for the sccs version string). */
1433 
1434-#define PATCHLEVEL 0
[e307159]1435+#define PATCHLEVEL 45
[31f34c6]1436 
1437 #endif /* _PATCHLEVEL_H_ */
1438diff -Naur bash-4.2.orig/pathexp.c bash-4.2/pathexp.c
1439--- bash-4.2.orig/pathexp.c     2010-08-14 03:21:57.000000000 +0000
[e307159]1440+++ bash-4.2/pathexp.c  2013-03-12 21:55:21.550771561 +0000
[31f34c6]1441@@ -196,7 +196,7 @@
1442        {
1443          if ((qflags & QGLOB_FILENAME) && pathname[i+1] == '/')
1444            continue;
1445-         if ((qflags & QGLOB_REGEXP) && ere_char (pathname[i+1]) == 0)
1446+         if (pathname[i+1] != CTLESC && (qflags & QGLOB_REGEXP) && ere_char (pathname[i+1]) == 0)
1447            continue;
1448          temp[j++] = '\\';
1449          i++;
1450diff -Naur bash-4.2.orig/print_cmd.c bash-4.2/print_cmd.c
1451--- bash-4.2.orig/print_cmd.c   2010-05-30 22:34:08.000000000 +0000
[e307159]1452+++ bash-4.2/print_cmd.c        2013-03-12 21:55:21.526771466 +0000
[31f34c6]1453@@ -315,6 +315,7 @@
1454          cprintf ("( ");
1455          skip_this_indent++;
1456          make_command_string_internal (command->value.Subshell->command);
1457+         PRINT_DEFERRED_HEREDOCS ("");
1458          cprintf (" )");
1459          break;
1460 
1461@@ -592,6 +593,7 @@
1462   newline ("do\n");
1463   indentation += indentation_amount;
1464   make_command_string_internal (arith_for_command->action);
1465+  PRINT_DEFERRED_HEREDOCS ("");
1466   semicolon ();
1467   indentation -= indentation_amount;
1468   newline ("done");
1469@@ -653,6 +655,7 @@
1470     }
1471 
1472   make_command_string_internal (group_command->command);
1473+  PRINT_DEFERRED_HEREDOCS ("");
1474 
1475   if (inside_function_def)
1476     {
[e307159]1477diff -Naur bash-4.2.orig/redir.c bash-4.2/redir.c
1478--- bash-4.2.orig/redir.c       2011-01-02 21:00:31.000000000 +0000
1479+++ bash-4.2/redir.c    2013-03-12 21:55:21.740772319 +0000
1480@@ -1007,6 +1007,16 @@
1481                close (redirector);
1482              REDIRECTION_ERROR (r, errno, -1);
1483            }
1484+         if ((flags & RX_UNDOABLE) && (ri == r_move_input || ri == r_move_output))
1485+           {
1486+             /* r_move_input and r_move_output add an additional close()
1487+                that needs to be undone */
1488+             if (fcntl (redirector, F_GETFD, 0) != -1)
1489+               {
1490+                 r = add_undo_redirect (redir_fd, r_close_this, -1);
1491+                 REDIRECTION_ERROR (r, errno, -1);
1492+               }
1493+           }
1494 #if defined (BUFFERED_INPUT)
1495          check_bash_input (redirector);
1496 #endif
1497@@ -1091,10 +1101,12 @@
1498 
1499 #if defined (BUFFERED_INPUT)
1500          check_bash_input (redirector);
1501-         close_buffered_fd (redirector);
1502+         r = close_buffered_fd (redirector);
1503 #else /* !BUFFERED_INPUT */
1504-         close (redirector);
1505+         r = close (redirector);
1506 #endif /* !BUFFERED_INPUT */
1507+         if (r < 0 && (flags & RX_INTERNAL) && (errno == EIO || errno == ENOSPC))
1508+           REDIRECTION_ERROR (r, errno, -1);
1509        }
1510       break;
1511 
[31f34c6]1512diff -Naur bash-4.2.orig/shell.h bash-4.2/shell.h
1513--- bash-4.2.orig/shell.h       2011-01-07 03:16:55.000000000 +0000
[e307159]1514+++ bash-4.2/shell.h    2013-03-12 21:55:21.537771510 +0000
[31f34c6]1515@@ -136,6 +136,9 @@
1516   int parser_state;
1517   int *token_state;
1518 
1519+  char *token;
1520+  int token_buffer_size;
1521+
1522   /* input line state -- line number saved elsewhere */
1523   int input_line_terminator;
1524   int eof_encountered;
1525@@ -166,6 +169,16 @@
1526   
1527 } sh_parser_state_t;
1528 
1529+typedef struct _sh_input_line_state_t {
1530+  char *input_line;
1531+  int input_line_index;
1532+  int input_line_size;
1533+  int input_line_len;
1534+} sh_input_line_state_t;
1535+
1536 /* Let's try declaring these here. */
1537 extern sh_parser_state_t *save_parser_state __P((sh_parser_state_t *));
1538 extern void restore_parser_state __P((sh_parser_state_t *));
1539+
1540+extern sh_input_line_state_t *save_input_line_state __P((sh_input_line_state_t *));
1541+extern void restore_input_line_state __P((sh_input_line_state_t *));
1542diff -Naur bash-4.2.orig/sig.c bash-4.2/sig.c
1543--- bash-4.2.orig/sig.c 2010-11-23 13:21:22.000000000 +0000
[e307159]1544+++ bash-4.2/sig.c      2013-03-12 21:55:21.516771426 +0000
[31f34c6]1545@@ -46,6 +46,7 @@
1546 
1547 #if defined (READLINE)
1548 #  include "bashline.h"
1549+#  include <readline/readline.h>
1550 #endif
1551 
1552 #if defined (HISTORY)
1553@@ -62,6 +63,7 @@
1554 #if defined (HISTORY)
1555 extern int history_lines_this_session;
1556 #endif
1557+extern int no_line_editing;
1558 
1559 extern void initialize_siglist ();
1560 
1561@@ -505,7 +507,10 @@
1562     {
1563 #if defined (HISTORY)
1564       /* XXX - will inhibit history file being written */
1565-      history_lines_this_session = 0;
1566+#  if defined (READLINE)
1567+      if (interactive_shell == 0 || interactive == 0 || (sig != SIGHUP && sig != SIGTERM) || no_line_editing || (RL_ISSTATE (RL_STATE_READCMD) == 0))
1568+#  endif
1569+        history_lines_this_session = 0;
1570 #endif
1571       terminate_immediately = 0;
1572       termsig_handler (sig);
1573diff -Naur bash-4.2.orig/subst.c bash-4.2/subst.c
1574--- bash-4.2.orig/subst.c       2011-01-02 21:12:51.000000000 +0000
[e307159]1575+++ bash-4.2/subst.c    2013-03-12 21:55:21.726772263 +0000
[31f34c6]1576@@ -366,6 +366,11 @@
1577       f &= ~W_ASSNBLTIN;
1578       fprintf (stderr, "W_ASSNBLTIN%s", f ? "|" : "");
1579     }
1580+  if (f & W_ASSNGLOBAL)
1581+    {
1582+      f &= ~W_ASSNGLOBAL;
1583+      fprintf (stderr, "W_ASSNGLOBAL%s", f ? "|" : "");
1584+    }
1585   if (f & W_COMPASSIGN)
1586     {
1587       f &= ~W_COMPASSIGN;
1588@@ -1379,10 +1384,12 @@
1589   slen = strlen (string + *sindex) + *sindex;
1590 
1591   /* The handling of dolbrace_state needs to agree with the code in parse.y:
1592-     parse_matched_pair() */
1593-  dolbrace_state = 0;
1594-  if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
1595-    dolbrace_state = (flags & SX_POSIXEXP) ? DOLBRACE_QUOTE : DOLBRACE_PARAM;
1596+     parse_matched_pair().  The different initial value is to handle the
1597+     case where this function is called to parse the word in
1598+     ${param op word} (SX_WORD). */
1599+  dolbrace_state = (flags & SX_WORD) ? DOLBRACE_WORD : DOLBRACE_PARAM;
1600+  if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && (flags & SX_POSIXEXP))
1601+    dolbrace_state = DOLBRACE_QUOTE;
1602 
1603   i = *sindex;
1604   while (c = string[i])
1605@@ -2801,7 +2808,7 @@
1606     }
1607   else if (assign_list)
1608     {
1609-      if (word->flags & W_ASSIGNARG)
1610+      if ((word->flags & W_ASSIGNARG) && (word->flags & W_ASSNGLOBAL) == 0)
1611        aflags |= ASS_MKLOCAL;
1612       if (word->flags & W_ASSIGNASSOC)
1613        aflags |= ASS_MKASSOC;
1614@@ -3371,7 +3378,7 @@
1615   if (string == 0 || *string == '\0')
1616     return (WORD_LIST *)NULL;
1617 
1618-  td.flags = 0;
1619+  td.flags = W_NOSPLIT2;               /* no splitting, remove "" and '' */
1620   td.word = string;
1621   tresult = call_expand_word_internal (&td, quoted, 1, dollar_at_p, has_dollar_at);
1622   return (tresult);
1623@@ -3704,7 +3711,10 @@
1624            break;
1625        }
1626       else if (string[i] == CTLNUL)
1627-       i++;
1628+       {
1629+         i++;
1630+         continue;
1631+       }
1632 
1633       prev_i = i;
1634       ADVANCE_CHAR (string, slen, i);
1635@@ -4156,7 +4166,7 @@
1636   simple = (wpat[0] != L'\\' && wpat[0] != L'*' && wpat[0] != L'?' && wpat[0] != L'[');
1637 #if defined (EXTENDED_GLOB)
1638   if (extended_glob)
1639-    simple |= (wpat[1] != L'(' || (wpat[0] != L'*' && wpat[0] != L'?' && wpat[0] != L'+' && wpat[0] != L'!' && wpat[0] != L'@')); /*)*/
1640+    simple &= (wpat[1] != L'(' || (wpat[0] != L'*' && wpat[0] != L'?' && wpat[0] != L'+' && wpat[0] != L'!' && wpat[0] != L'@')); /*)*/
1641 #endif
1642 
1643   /* If the pattern doesn't match anywhere in the string, go ahead and
1644@@ -4607,6 +4617,7 @@
1645   if (ifs_firstc == 0)
1646 #endif
1647     word->flags |= W_NOSPLIT;
1648+  word->flags |= W_NOSPLIT2;
1649   result = call_expand_word_internal (word, quoted, 0, (int *)NULL, (int *)NULL);
1650   expand_no_split_dollar_star = 0;
1651 
[e307159]1652@@ -5113,6 +5124,10 @@
1653   dev_fd_list[parent_pipe_fd] = 0;
1654 #endif /* HAVE_DEV_FD */
1655 
1656+  /* subshells shouldn't have this flag, which controls using the temporary
1657+     environment for variable lookups. */
1658+  expanding_redir = 0;
1659+
1660   result = parse_and_execute (string, "process substitution", (SEVAL_NONINT|SEVAL_NOHIST));
1661 
1662 #if !defined (HAVE_DEV_FD)
1663@@ -5798,6 +5813,16 @@
[31f34c6]1664         is the only expansion that creates more than one word. */
1665       if (qdollaratp && ((hasdol && quoted) || l->next))
1666        *qdollaratp = 1;
1667+      /* If we have a quoted null result (QUOTED_NULL(temp)) and the word is
1668+        a quoted null (l->next == 0 && QUOTED_NULL(l->word->word)), the
1669+        flags indicate it (l->word->flags & W_HASQUOTEDNULL), and the
1670+        expansion is quoted (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
1671+        (which is more paranoia than anything else), we need to return the
1672+        quoted null string and set the flags to indicate it. */
1673+      if (l->next == 0 && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && QUOTED_NULL(temp) && QUOTED_NULL(l->word->word) && (l->word->flags & W_HASQUOTEDNULL))
1674+       {
1675+         w->flags |= W_HASQUOTEDNULL;
1676+       }
1677       dispose_words (l);
1678     }
1679   else if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && hasdol)
[e307159]1680@@ -7176,7 +7201,7 @@
[31f34c6]1681     {
1682       /* Extract the contents of the ${ ... } expansion
1683         according to the Posix.2 rules. */
1684-      value = extract_dollar_brace_string (string, &sindex, quoted, (c == '%' || c == '#') ? SX_POSIXEXP : 0);
1685+      value = extract_dollar_brace_string (string, &sindex, quoted, (c == '%' || c == '#' || c =='/' || c == '^' || c == ',' || c ==':') ? SX_POSIXEXP|SX_WORD : SX_WORD);
1686       if (string[sindex] == RBRACE)
1687        sindex++;
1688       else
[e307159]1689@@ -7268,6 +7293,7 @@
[31f34c6]1690     default:
1691     case '\0':
1692     bad_substitution:
1693+      last_command_exit_value = EXECUTION_FAILURE;
1694       report_error (_("%s: bad substitution"), string ? string : "??");
1695       FREE (value);
1696       FREE (temp);
[e307159]1697@@ -7900,7 +7926,7 @@
[31f34c6]1698 
1699   /* State flags */
1700   int had_quoted_null;
1701-  int has_dollar_at;
1702+  int has_dollar_at, temp_has_dollar_at;
1703   int tflag;
1704   int pflags;                  /* flags passed to param_expand */
1705 
[e307159]1706@@ -8105,13 +8131,14 @@
[31f34c6]1707          if (expanded_something)
1708            *expanded_something = 1;
1709 
1710-         has_dollar_at = 0;
1711+         temp_has_dollar_at = 0;
1712          pflags = (word->flags & W_NOCOMSUB) ? PF_NOCOMSUB : 0;
1713          if (word->flags & W_NOSPLIT2)
1714            pflags |= PF_NOSPLIT2;
1715          tword = param_expand (string, &sindex, quoted, expanded_something,
1716-                              &has_dollar_at, &quoted_dollar_at,
1717+                              &temp_has_dollar_at, &quoted_dollar_at,
1718                               &had_quoted_null, pflags);
1719+         has_dollar_at += temp_has_dollar_at;
1720 
1721          if (tword == &expand_wdesc_error || tword == &expand_wdesc_fatal)
1722            {
[e307159]1723@@ -8129,6 +8156,14 @@
[31f34c6]1724          temp = tword->word;
1725          dispose_word_desc (tword);
1726 
1727+         /* Kill quoted nulls; we will add them back at the end of
1728+            expand_word_internal if nothing else in the string */
1729+         if (had_quoted_null && temp && QUOTED_NULL (temp))
1730+           {
1731+             FREE (temp);
1732+             temp = (char *)NULL;
1733+           }
1734+
1735          goto add_string;
1736          break;
1737 
[e307159]1738@@ -8244,9 +8279,10 @@
[31f34c6]1739 
1740              temp = (char *)NULL;
1741 
1742-             has_dollar_at = 0;
1743+             temp_has_dollar_at = 0;   /* XXX */
1744              /* Need to get W_HASQUOTEDNULL flag through this function. */
1745-             list = expand_word_internal (tword, Q_DOUBLE_QUOTES, 0, &has_dollar_at, (int *)NULL);
1746+             list = expand_word_internal (tword, Q_DOUBLE_QUOTES, 0, &temp_has_dollar_at, (int *)NULL);
1747+             has_dollar_at += temp_has_dollar_at;
1748 
1749              if (list == &expand_word_error || list == &expand_word_fatal)
1750                {
[e307159]1751@@ -8533,7 +8569,7 @@
[31f34c6]1752        tword->flags |= W_NOEXPAND;     /* XXX */
1753       if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
1754        tword->flags |= W_QUOTED;
1755-      if (had_quoted_null)
1756+      if (had_quoted_null && QUOTED_NULL (istring))
1757        tword->flags |= W_HASQUOTEDNULL;
1758       list = make_word_list (tword, (WORD_LIST *)NULL);
1759     }
[e307159]1760@@ -8564,7 +8600,7 @@
[31f34c6]1761            tword->flags |= W_NOGLOB;
1762          if (word->flags & W_NOEXPAND)
1763            tword->flags |= W_NOEXPAND;
1764-         if (had_quoted_null)
1765+         if (had_quoted_null && QUOTED_NULL (istring))
1766            tword->flags |= W_HASQUOTEDNULL;    /* XXX */
1767          list = make_word_list (tword, (WORD_LIST *)NULL);
1768        }
1769diff -Naur bash-4.2.orig/subst.h bash-4.2/subst.h
1770--- bash-4.2.orig/subst.h       2010-12-03 01:21:29.000000000 +0000
[e307159]1771+++ bash-4.2/subst.h    2013-03-12 21:55:21.450771163 +0000
[31f34c6]1772@@ -56,6 +56,7 @@
1773 #define SX_NOLONGJMP   0x0040  /* don't longjmp on fatal error */
1774 #define SX_ARITHSUB    0x0080  /* extracting $(( ... )) (currently unused) */
1775 #define SX_POSIXEXP    0x0100  /* extracting new Posix pattern removal expansions in extract_dollar_brace_string */
1776+#define SX_WORD                0x0200  /* extracting word in ${param op word} */
1777 
1778 /* Remove backslashes which are quoting backquotes from STRING.  Modifies
1779    STRING, and returns a pointer to it. */
1780diff -Naur bash-4.2.orig/support/shobj-conf bash-4.2/support/shobj-conf
1781--- bash-4.2.orig/support/shobj-conf    2009-10-28 13:20:21.000000000 +0000
[e307159]1782+++ bash-4.2/support/shobj-conf 2013-03-12 21:55:21.592771729 +0000
[31f34c6]1783@@ -157,7 +157,7 @@
1784        ;;
1785 
1786 # Darwin/MacOS X
1787-darwin[89]*|darwin10*)
1788+darwin[89]*|darwin1[012]*)
1789        SHOBJ_STATUS=supported
1790        SHLIB_STATUS=supported
1791       
1792@@ -186,7 +186,7 @@
1793        SHLIB_LIBSUFF='dylib'
1794 
1795        case "${host_os}" in
1796-       darwin[789]*|darwin10*) SHOBJ_LDFLAGS=''
1797+       darwin[789]*|darwin1[012]*)     SHOBJ_LDFLAGS=''
1798                        SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
1799                        ;;
1800        *)              SHOBJ_LDFLAGS='-dynamic'
1801diff -Naur bash-4.2.orig/tests/shopt.right bash-4.2/tests/shopt.right
1802--- bash-4.2.orig/tests/shopt.right     2010-07-03 03:36:30.000000000 +0000
[e307159]1803+++ bash-4.2/tests/shopt.right  2013-03-12 21:55:21.653771972 +0000
[31f34c6]1804@@ -12,6 +12,7 @@
1805 shopt -u compat32
1806 shopt -u compat40
1807 shopt -u compat41
1808+shopt -u direxpand
1809 shopt -u dirspell
1810 shopt -u dotglob
1811 shopt -u execfail
1812@@ -68,6 +69,7 @@
1813 shopt -u compat32
1814 shopt -u compat40
1815 shopt -u compat41
1816+shopt -u direxpand
1817 shopt -u dirspell
1818 shopt -u dotglob
1819 shopt -u execfail
1820@@ -101,6 +103,7 @@
1821 compat32               off
1822 compat40               off
1823 compat41               off
1824+direxpand              off
1825 dirspell               off
1826 dotglob                off
1827 execfail               off
1828diff -Naur bash-4.2.orig/variables.c bash-4.2/variables.c
1829--- bash-4.2.orig/variables.c   2011-01-25 01:07:48.000000000 +0000
[e307159]1830+++ bash-4.2/variables.c        2013-03-12 21:55:21.499771358 +0000
[31f34c6]1831@@ -3653,6 +3653,22 @@
1832   return n;
1833 }
1834 
1835+int
1836+chkexport (name)
1837+     char *name;
1838+{
1839+  SHELL_VAR *v;
1840+
1841+  v = find_variable (name);
1842+  if (v && exported_p (v))
1843+    {
1844+      array_needs_making = 1;
1845+      maybe_make_export_env ();
1846+      return 1;
1847+    }
1848+  return 0;
1849+}
1850+
1851 void
1852 maybe_make_export_env ()
1853 {
1854@@ -4214,7 +4230,7 @@
1855   { "TEXTDOMAIN", sv_locale },
1856   { "TEXTDOMAINDIR", sv_locale },
1857 
1858-#if defined (HAVE_TZSET) && defined (PROMPT_STRING_DECODE)
1859+#if defined (HAVE_TZSET)
1860   { "TZ", sv_tz },
1861 #endif
1862 
1863@@ -4558,12 +4574,13 @@
1864 }
1865 #endif /* HISTORY */
1866 
1867-#if defined (HAVE_TZSET) && defined (PROMPT_STRING_DECODE)
1868+#if defined (HAVE_TZSET)
1869 void
1870 sv_tz (name)
1871      char *name;
1872 {
1873-  tzset ();
1874+  if (chkexport (name))
1875+    tzset ();
1876 }
1877 #endif
1878 
1879diff -Naur bash-4.2.orig/variables.h bash-4.2/variables.h
1880--- bash-4.2.orig/variables.h   2010-12-03 01:22:01.000000000 +0000
[e307159]1881+++ bash-4.2/variables.h        2013-03-12 21:55:21.486771306 +0000
[31f34c6]1882@@ -313,6 +313,7 @@
1883 
1884 extern void sort_variables __P((SHELL_VAR **));
1885 
1886+extern int chkexport __P((char *));
1887 extern void maybe_make_export_env __P((void));
1888 extern void update_export_env_inplace __P((char *, int, char *));
1889 extern void put_command_name_into_env __P((char *));
Note: See TracBrowser for help on using the repository browser.