From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marcel Lorenz To: development@lists.ipfire.org Subject: Re: [PATCH] bash: update to 4.3.30 Date: Fri, 03 Jun 2016 19:04:42 +0200 Message-ID: <2b73875c762cb6813df2488787f36f5f@mail01.ipfire.org> In-Reply-To: <1464967247.24121.53.camel@ipfire.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============6116876103156185873==" List-Id: --===============6116876103156185873== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Am 2016-06-03 17:20, schrieb Michael Tremer: > On Thu, 2016-06-02 at 19:43 +0200, Marcel Lorenz wrote: >> Old bash patches are removed >=20 > Why? We need those. ok, for what? The bash-4.3.30-upstream_fixes-3.patch is new... Marcel >=20 >>=20 >> Signed-off-by: Marcel Lorenz >> --- >> =C2=A0config/rootfiles/common/bash=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0|= =C2=A0=C2=A012 + >> =C2=A0lfs/bash=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0|=C2=A0=C2=A020 +- >> =C2=A0src/patches/bash-3.2-ssh_source_bash.patch=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0|=C2=A0=C2=A012 - >> =C2=A0src/patches/bash-4.0-paths-1.patch=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0|=C2=A0=C2=A011 - >> =C2=A0src/patches/bash-4.0-profile-1.patch=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0|=C2=A0=C2=A012 - >> =C2=A0src/patches/bash-4.3.30-upstream_fixes-3.patch | 488 >> +++++++++++++++++++++++++ >> =C2=A06 files changed, 505 insertions(+), 50 deletions(-) >> =C2=A0delete mode 100644 src/patches/bash-3.2-ssh_source_bash.patch >> =C2=A0delete mode 100644 src/patches/bash-4.0-paths-1.patch >> =C2=A0delete mode 100644 src/patches/bash-4.0-profile-1.patch >> =C2=A0create mode 100644 src/patches/bash-4.3.30-upstream_fixes-3.patch >>=20 >> diff --git a/config/rootfiles/common/bash=20 >> b/config/rootfiles/common/bash >> index 84f587f..743a71a 100644 >> --- a/config/rootfiles/common/bash >> +++ b/config/rootfiles/common/bash >> @@ -57,3 +57,15 @@ bin/bash >> =C2=A0#usr/share/locale/zh_TW/LC_MESSAGES/bash.mo >> =C2=A0#usr/share/man/man1/bash.1 >> =C2=A0#usr/share/man/man1/bashbug.1 >> +#usr/share/doc/bash-4.3.30 >> +#usr/share/doc/bash-4.3.30/CHANGES >> +#usr/share/doc/bash-4.3.30/COMPAT >> +#usr/share/doc/bash-4.3.30/FAQ >> +#usr/share/doc/bash-4.3.30/INTRO >> +#usr/share/doc/bash-4.3.30/NEWS >> +#usr/share/doc/bash-4.3.30/POSIX >> +#usr/share/doc/bash-4.3.30/RBASH >> +#usr/share/doc/bash-4.3.30/README >> +#usr/share/doc/bash-4.3.30/bash.html >> +#usr/share/doc/bash-4.3.30/bashref.html >> + >> diff --git a/lfs/bash b/lfs/bash >> index c215b5a..416b382 100644 >> --- a/lfs/bash >> +++ b/lfs/bash >> @@ -24,7 +24,7 @@ >> =C2=A0 >> =C2=A0include Config >> =C2=A0 >> -VER=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=3D 4.3 >> +VER=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=3D 4.3.30 >> =C2=A0 >> =C2=A0THISAPP=C2=A0=C2=A0=C2=A0=C2=A0=3D bash-$(VER) >> =C2=A0DL_FILE=C2=A0=C2=A0=C2=A0=C2=A0=3D $(THISAPP).tar.gz >> @@ -43,7 +43,8 @@ else >> =C2=A0endif >> =C2=A0 >> =C2=A0CONFIGURE_OPTIONS +=3D \ >> - --without-bash-malloc >> + --without-bash-malloc \ >> + --docdir=3D/usr/share/doc/bash-4.3.30 >> =C2=A0 >> =C2=A0####################################################################= ######### >> ## >> =C2=A0# Top-level Rules >> @@ -53,7 +54,7 @@ objects =3D $(DL_FILE) >> =C2=A0 >> =C2=A0$(DL_FILE)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=3D $(DL_FROM)/$(DL_FILE) >> =C2=A0 >> -$(DL_FILE)_MD5=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=3D 8= 1348932d5da294953e15d4814c74dd1 >> +$(DL_FILE)_MD5=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=3D a= 27b3ee9be83bd3ba448c0ff52b28447 >> =C2=A0 >> =C2=A0install : $(TARGET) >> =C2=A0 >> @@ -83,18 +84,7 @@ $(subst %,%_MD5,$(objects)) : >> =C2=A0$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) >> =C2=A0 @$(PREBUILD) >> =C2=A0 @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zaxf $(DIR_DL)/$(DL_FILE) >> - >> - sed -e "s/filename, RTLD_LAZY/filename, RTLD_NOW/" \ >> - -i $(DIR_APP)/builtins/enable.def >> - >> - for i in $$(seq 1 30); do \ >> - cd $(DIR_APP) && patch -Np0 < >> $(DIR_SRC)/src/patches/bash/bash43-$$(printf "%03d" "$${i}") || exit=20 >> 1; \ >> - done >> - >> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/bash-4.0-paths- >> 1.patch >> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/bash-4.0- >> profile-1.patch >> - cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/bash-3.2- >> ssh_source_bash.patch >> - >> + cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/bash-4.3.30- >> upstream_fixes-3.patch >> =C2=A0 cd $(DIR_APP) && ./configure $(CONFIGURE_OPTIONS) >> =C2=A0 cd $(DIR_APP) && make $(MAKETUNING) >> =C2=A0 cd $(DIR_APP) && make install >> diff --git a/src/patches/bash-3.2-ssh_source_bash.patch=20 >> b/src/patches/bash- >> 3.2-ssh_source_bash.patch >> deleted file mode 100644 >> index 5bd19ce..0000000 >> --- a/src/patches/bash-3.2-ssh_source_bash.patch >> +++ /dev/null >> @@ -1,12 +0,0 @@ >> -diff -up bash-4.0/config-top.h.ssh_source_bash bash-4.0/config-top.h >> ---- bash-4.0/config-top.h.ssh_source_bash 2009-01-21 >> 15:20:06.000000000 +0100 >> -+++ bash-4.0/config-top.h 2009-01-21 15:25:46.000000000 +0100 >> -@@ -90,7 +90,7 @@ >> -=C2=A0=C2=A0=C2=A0=C2=A0sshd and source the .bashrc if so (like the rshd = behavior).=C2=A0=C2=A0This=20 >> checks >> -=C2=A0=C2=A0=C2=A0=C2=A0for the presence of SSH_CLIENT or SSH2_CLIENT in = the initial=20 >> environment, >> -=C2=A0=C2=A0=C2=A0=C2=A0which can be fooled under certain not-uncommon ci= rcumstances. */ >> --/* #define SSH_SOURCE_BASHRC */ >> -+#define SSH_SOURCE_BASHRC >> -=C2=A0 >> - /* Define if you want the case-capitalizing operators (~[~]) and the >> -=C2=A0=C2=A0=C2=A0=C2=A0`capcase' variable attribute (declare -c). */ >> diff --git a/src/patches/bash-4.0-paths-1.patch=20 >> b/src/patches/bash-4.0-paths- >> 1.patch >> deleted file mode 100644 >> index 24ec5cc..0000000 >> --- a/src/patches/bash-4.0-paths-1.patch >> +++ /dev/null >> @@ -1,11 +0,0 @@ >> ---- bash-3.0/config-top.h.paths 2003-08-05 15:36:12.000000000 +0100 >> -+++ bash-3.0/config-top.h 2004-07-28 09:36:27.117205637 +0100 >> -@@ -66,7 +66,7 @@ >> -=C2=A0=C2=A0=C2=A0=C2=A0the Posix.2 confstr () function, or CS_PATH defin= e are not=20 >> present. */ >> - #ifndef STANDARD_UTILS_PATH >> - #define STANDARD_UTILS_PATH \ >> --=C2=A0=C2=A0"/bin:/usr/bin:/sbin:/usr/sbin:/etc:/usr/etc" >> -+=C2=A0=C2=A0"/bin:/usr/bin:/usr/sbin:/sbin" >> - #endif >> -=C2=A0 >> - /* Default primary and secondary prompt strings. */ >> diff --git a/src/patches/bash-4.0-profile-1.patch=20 >> b/src/patches/bash-4.0- >> profile-1.patch >> deleted file mode 100644 >> index ba3344b..0000000 >> --- a/src/patches/bash-4.0-profile-1.patch >> +++ /dev/null >> @@ -1,12 +0,0 @@ >> -diff -up bash-3.2/config-top.h.profile bash-3.2/config-top.h >> ---- bash-3.2/config-top.h.profile 2008-07-17 13:35:39.000000000 +0200 >> -+++ bash-3.2/config-top.h 2008-07-17 13:42:18.000000000 +0200 >> -@@ -26,6 +26,8 @@ >> -=C2=A0=C2=A0=C2=A0=C2=A0what POSIX.2 specifies. */ >> - #define CONTINUE_AFTER_KILL_ERROR >> -=C2=A0 >> -+#define NON_INTERACTIVE_LOGIN_SHELLS >> -+ >> - /* Define BREAK_COMPLAINS if you want the non-standard, but useful >> -=C2=A0=C2=A0=C2=A0=C2=A0error messages about `break' and `continue' out o= f context. */ >> - #define BREAK_COMPLAINS >> diff --git a/src/patches/bash-4.3.30-upstream_fixes-3.patch >> b/src/patches/bash-4.3.30-upstream_fixes-3.patch >> new file mode 100644 >> index 0000000..459ce26 >> --- /dev/null >> +++ b/src/patches/bash-4.3.30-upstream_fixes-3.patch >> @@ -0,0 +1,488 @@ >> +Submitted By:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0Armin K. >> +Date:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A02016-02-16 >> +Initial Package Version: 4.3 >> +Upstream Status:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0Alr= eady in upstream patch repo >> +Origin:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0Upstream >> +Description:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0This patch contains upstream patch numbers=20 >> 031 thru >> 042 >> + >> +--- a/arrayfunc.c 2014-10-01 18:57:35.000000000 +0200 >> ++++ b/arrayfunc.c 2015-09-06 22:57:56.328941059 +0200 >> +@@ -404,6 +404,9 @@ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0(*var->assign_func) (var, l->wo= rd->word, i, 0); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0array_insert (a, i, l->word->wo= rd); >> ++ >> ++=C2=A0=C2=A0VUNSETATTR (var, att_invisible); /* no longer invisible */ >> ++ >> +=C2=A0=C2=A0=C2=A0return var; >> + } >> +=C2=A0 >> +@@ -634,6 +637,10 @@ >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0if (nlist) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0dispose_words (nlist); >> ++ >> ++=C2=A0=C2=A0if (var) >> ++=C2=A0=C2=A0=C2=A0=C2=A0VUNSETATTR (var, att_invisible); /* no longer in= visible */ >> ++ >> +=C2=A0=C2=A0=C2=A0return (var); >> + } >> +=C2=A0 >> +--- a/assoc.c 2011-11-05 21:39:05.000000000 +0100 >> ++++ b/assoc.c 2015-09-06 22:57:56.328941059 +0200 >> +@@ -436,6 +436,8 @@ >> + #if 1 >> +=C2=A0 if (sh_contains_shell_metas (tlist->key)) >> +=C2=A0 =C2=A0=C2=A0istr =3D sh_double_quote (tlist->key); >> ++ else if (ALL_ELEMENT_SUB (tlist->key[0]) && tlist->key[1] =3D=3D '\0') >> ++ =C2=A0=C2=A0istr =3D sh_double_quote (tlist->key); >> +=C2=A0 else >> +=C2=A0 =C2=A0=C2=A0istr =3D tlist->key; >> + #else >> +--- a/bashline.c 2014-10-01 18:57:30.000000000 +0200 >> ++++ b/bashline.c 2015-09-06 22:58:34.711768943 +0200 >> +@@ -202,6 +202,7 @@ >> + extern int last_command_exit_value; >> + extern int array_needs_making; >> + extern int posixly_correct, no_symbolic_links; >> ++extern int sigalrm_seen; >> + extern char *current_prompt_string, *ps1_prompt; >> + extern STRING_INT_ALIST word_token_alist[]; >> + extern sh_builtin_func_t *last_shell_builtin, *this_shell_builtin; >> +@@ -1467,10 +1468,23 @@ >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0os =3D start; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0n =3D 0; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0was_assignment =3D 0; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0s =3D find_cmd_start (os); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0e =3D find_cmd_end (end); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0do >> +=C2=A0 { >> ++ =C2=A0=C2=A0/* Don't read past the end of rl_line_buffer */ >> ++ =C2=A0=C2=A0if (s > rl_end) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0s1 =3D s =3D e1; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ =C2=A0=C2=A0/* Or past point if point is within an assignment statement= */ >> ++ =C2=A0=C2=A0else if (was_assignment && s > rl_point) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0s1 =3D s =3D e1; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 =C2=A0=C2=A0/* Skip over assignment statements preceding a command= name.=C2=A0=C2=A0If >> we >> +=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0don't find a command name at all, we= can perform command name >> +=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0completion.=C2=A0=C2=A0If we find a = partial command name, we should >> perform >> +@@ -4208,8 +4222,9 @@ >> + { >> +=C2=A0=C2=A0=C2=A0/* If we're going to longjmp to top_level, make sure we= clean up=20 >> readline. >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0check_signals will call QUIT, which w= ill eventually longjmp to >> top_level, >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0calling run_interrupt_trap along the way. = */ >> +-=C2=A0=C2=A0if (interrupt_state) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0calling run_interrupt_trap along the way.= =C2=A0=C2=A0The check for=20 >> sigalrm_seen >> is >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0to clean up the read builtin's state. */ >> ++=C2=A0=C2=A0if (terminating_signal || interrupt_state || sigalrm_seen) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0rl_cleanup_after_signal (); >> +=C2=A0=C2=A0=C2=A0bashline_reset_event_hook (); >> +=C2=A0=C2=A0=C2=A0check_signals_and_traps (); /* XXX */ >> +--- a/builtins/common.h 2014-10-01 18:57:47.000000000 +0200 >> ++++ b/builtins/common.h 2015-09-06 22:57:56.330941103 +0200 >> +@@ -122,6 +122,10 @@ >> + /* Functions from getopts.def */ >> + extern void getopts_reset __P((int)); >> +=C2=A0 >> ++/* Functions from read.def */ >> ++extern void read_tty_cleanup __P((void)); >> ++extern int read_tty_modified __P((void)); >> ++ >> + /* Functions from set.def */ >> + extern int minus_o_option_value __P((char *)); >> + extern void list_minus_o_opts __P((int, int)); >> +--- a/builtins/read.def 2014-10-01 18:57:38.000000000 +0200 >> ++++ b/builtins/read.def 2015-09-06 22:57:56.335941212 +0200 >> +@@ -140,10 +140,12 @@ >> + procenv_t alrmbuf; >> + int sigalrm_seen; >> +=C2=A0 >> +-static int reading; >> ++static int reading, tty_modified; >> + static SigHandler *old_alrm; >> + static unsigned char delim; >> +=C2=A0 >> ++static struct ttsave termsave; >> ++ >> + /* In all cases, SIGALRM just sets a flag that we check=20 >> periodically.=C2=A0=C2=A0This >> +=C2=A0=C2=A0=C2=A0=C2=A0avoids problems with the semi-tricky stuff we do = with the xfree=20 >> of >> +=C2=A0=C2=A0=C2=A0=C2=A0input_string at the top of the unwind-protect lis= t (see below).=20 >> */ >> +@@ -188,7 +190,6 @@ >> +=C2=A0=C2=A0=C2=A0struct stat tsb; >> +=C2=A0=C2=A0=C2=A0SHELL_VAR *var; >> +=C2=A0=C2=A0=C2=A0TTYSTRUCT ttattrs, ttset; >> +-=C2=A0=C2=A0struct ttsave termsave; >> + #if defined (ARRAY_VARS) >> +=C2=A0=C2=A0=C2=A0WORD_LIST *alist; >> + #endif >> +@@ -221,7 +222,7 @@ >> +=C2=A0=C2=A0=C2=A0USE_VAR(ps2); >> +=C2=A0=C2=A0=C2=A0USE_VAR(lastsig); >> +=C2=A0 >> +-=C2=A0=C2=A0sigalrm_seen =3D reading =3D 0; >> ++=C2=A0=C2=A0sigalrm_seen =3D reading =3D tty_modified =3D 0; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0i =3D 0; /* Index into the string that we are reading.= */ >> +=C2=A0=C2=A0=C2=A0raw =3D edit =3D 0; /* Not reading raw input by default= . */ >> +@@ -438,6 +439,8 @@ >> +=C2=A0 =C2=A0=C2=A0retval =3D 128+SIGALRM; >> +=C2=A0 =C2=A0=C2=A0goto assign_vars; >> +=C2=A0 } >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (interactive_shell =3D=3D 0) >> ++ initialize_terminating_signals (); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0old_alrm =3D set_signal_handler= (SIGALRM, sigalrm); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0add_unwind_protect (reset_alarm= , (char *)NULL); >> + #if defined (READLINE) >> +@@ -482,7 +485,10 @@ >> +=C2=A0 =C2=A0=C2=A0i =3D silent ? ttfd_cbreak (fd, &ttset) : ttfd_onechar= (fd,=20 >> &ttset); >> +=C2=A0 =C2=A0=C2=A0if (i < 0) >> +=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0sh_ttyerror (1); >> ++ =C2=A0=C2=A0tty_modified =3D 1; >> +=C2=A0 =C2=A0=C2=A0add_unwind_protect ((Function *)ttyrestore, (char *)&t= ermsave); >> ++ =C2=A0=C2=A0if (interactive_shell =3D=3D 0) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0initialize_terminating_signals (); >> +=C2=A0 } >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0else if (silent) /* turn off echo but leave term in can= onical mode >> */ >> +@@ -497,7 +503,10 @@ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (i < 0) >> +=C2=A0 sh_ttyerror (1); >> +=C2=A0 >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0tty_modified =3D 1; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0add_unwind_protect ((Function *= )ttyrestore, (char=20 >> *)&termsave); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (interactive_shell =3D=3D 0) >> ++ initialize_terminating_signals (); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0/* This *must* be the top unwind-protect on the stack, = so the=20 >> manipulation >> +@@ -588,6 +597,8 @@ >> +=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 =C2=A0=C2=A0else >> +=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0lastsig =3D 0; >> ++ =C2=A0=C2=A0if (terminating_signal && tty_modified) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0ttyrestore (&termsave); /* fix terminal before = exiting */ >> +=C2=A0 =C2=A0=C2=A0CHECK_TERMSIG; >> +=C2=A0 =C2=A0=C2=A0eof =3D 1; >> +=C2=A0 =C2=A0=C2=A0break; >> +@@ -978,6 +989,20 @@ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0struct ttsave *ttp; >> + { >> +=C2=A0=C2=A0=C2=A0ttsetattr (ttp->fd, ttp->attrs); >> ++=C2=A0=C2=A0tty_modified =3D 0; >> ++} >> ++ >> ++void >> ++read_tty_cleanup () >> ++{ >> ++=C2=A0=C2=A0if (tty_modified) >> ++=C2=A0=C2=A0=C2=A0=C2=A0ttyrestore (&termsave); >> ++} >> ++ >> ++int >> ++read_tty_modified () >> ++{ >> ++=C2=A0=C2=A0return (tty_modified); >> + } >> +=C2=A0 >> + #if defined (READLINE) >> +--- a/builtins/set.def 2013-04-19 13:20:34.000000000 +0200 >> ++++ b/builtins/set.def 2015-09-06 22:57:56.336941234 +0200 >> +@@ -751,9 +751,11 @@ >> +=C2=A0=C2=A0=C2=A0WORD_LIST *list; >> + { >> +=C2=A0=C2=A0=C2=A0int unset_function, unset_variable, unset_array, opt, n= ameref,=20 >> any_failed; >> ++=C2=A0=C2=A0int global_unset_func, global_unset_var; >> +=C2=A0=C2=A0=C2=A0char *name; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0unset_function =3D unset_variable =3D unset_array =3D n= ameref =3D=20 >> any_failed =3D 0; >> ++=C2=A0=C2=A0global_unset_func =3D global_unset_var =3D 0; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0reset_internal_getopt (); >> +=C2=A0=C2=A0=C2=A0while ((opt =3D internal_getopt (list, "fnv")) !=3D -1) >> +@@ -761,10 +763,10 @@ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0switch (opt) >> +=C2=A0 { >> +=C2=A0 case 'f': >> +- =C2=A0=C2=A0unset_function =3D 1; >> ++ =C2=A0=C2=A0global_unset_func =3D 1; >> +=C2=A0 =C2=A0=C2=A0break; >> +=C2=A0 case 'v': >> +- =C2=A0=C2=A0unset_variable =3D 1; >> ++ =C2=A0=C2=A0global_unset_var =3D 1; >> +=C2=A0 =C2=A0=C2=A0break; >> +=C2=A0 case 'n': >> +=C2=A0 =C2=A0=C2=A0nameref =3D 1; >> +@@ -777,7 +779,7 @@ >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0list =3D loptend; >> +=C2=A0 >> +-=C2=A0=C2=A0if (unset_function && unset_variable) >> ++=C2=A0=C2=A0if (global_unset_func && global_unset_var) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0builtin_error (_("cannot simult= aneously unset a function and a >> variable")); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return (EXECUTION_FAILURE); >> +@@ -795,6 +797,9 @@ >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0name =3D list->word->word; >> +=C2=A0 >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0unset_function =3D global_unset_func; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0unset_variable =3D global_unset_var; >> ++ >> + #if defined (ARRAY_VARS) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0unset_array =3D 0; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (!unset_function && valid_ar= ray_reference (name)) >> +--- a/jobs.c 2014-10-01 18:57:26.000000000 +0200 >> ++++ b/jobs.c 2015-09-06 22:57:56.340941321 +0200 >> +@@ -3339,7 +3339,9 @@ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (posixly_correct && this_she= ll_builtin &&=20 >> this_shell_builtin =3D=3D >> wait_builtin) >> +=C2=A0 { >> +=C2=A0 =C2=A0=C2=A0interrupt_immediately =3D 0; >> +- =C2=A0=C2=A0trap_handler (SIGCHLD); /* set pending_traps[SIGCHLD] */ >> ++ =C2=A0=C2=A0/* This was trap_handler (SIGCHLD) but that can lose traps = if >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0children_exited > 1 */ >> ++ =C2=A0=C2=A0queue_sigchld_trap (children_exited); >> +=C2=A0 =C2=A0=C2=A0wait_signal_received =3D SIGCHLD; >> +=C2=A0 =C2=A0=C2=A0/* If we're in a signal handler, let CHECK_WAIT_INTR p= ick it up; >> +=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0run_pending_traps will call run_sigc= hld_trap later=C2=A0=C2=A0*/ >> +--- a/lib/readline/complete.c 2013-10-14 15:27:10.000000000 +0200 >> ++++ b/lib/readline/complete.c 2015-09-06 22:58:34.712768964 +0200 >> +@@ -689,6 +689,8 @@ >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0if (temp =3D=3D 0 || *temp =3D=3D '\0') >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return (pathname); >> ++=C2=A0=C2=A0else if (temp[1] =3D=3D 0 && temp =3D=3D pathname) >> ++=C2=A0=C2=A0=C2=A0=C2=A0return (pathname); >> +=C2=A0=C2=A0=C2=A0/* If the basename is NULL, we might have a pathname li= ke=20 >> '/usr/src/'. >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0Look for a previous slash and, if one= is found, return the=20 >> portion >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0following that slash.=C2=A0=C2=A0If t= here's no previous slash, just=20 >> return the >> +--- a/lib/sh/unicode.c 2014-01-30 22:47:19.000000000 +0100 >> ++++ b/lib/sh/unicode.c 2015-09-06 22:57:56.341941343 +0200 >> +@@ -78,13 +78,15 @@ >> +=C2=A0=C2=A0=C2=A0s =3D strrchr (locale, '.'); >> +=C2=A0=C2=A0=C2=A0if (s) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0strcpy (charsetbuf, s+1); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0strncpy (charsetbuf, s+1, sizeof (ch= arsetbuf) - 1); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0charsetbuf[sizeof (charsetbuf) - 1] = =3D '\0'; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0t =3D strchr (charsetbuf, '@'); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (t) >> +=C2=A0 *t =3D 0; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return charsetbuf; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +-=C2=A0=C2=A0strcpy (charsetbuf, locale); >> ++=C2=A0=C2=A0strncpy (charsetbuf, locale, sizeof (charsetbuf) - 1); >> ++=C2=A0=C2=A0charsetbuf[sizeof (charsetbuf) - 1] =3D '\0'; >> +=C2=A0=C2=A0=C2=A0return charsetbuf; >> + } >> + #endif >> +--- a/parse.y 2014-10-05 19:52:50.000000000 +0200 >> ++++ b/parse.y 2015-09-06 22:58:35.245780313 +0200 >> +@@ -2818,11 +2818,16 @@ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case AND_AND: >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case OR_OR: >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case '&': >> ++=C2=A0=C2=A0=C2=A0=C2=A0case WHILE: >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case DO: >> ++=C2=A0=C2=A0=C2=A0=C2=A0case UNTIL: >> ++=C2=A0=C2=A0=C2=A0=C2=A0case IF: >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case THEN: >> ++=C2=A0=C2=A0=C2=A0=C2=A0case ELIF: >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case ELSE: >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case '{': /* } */ >> +-=C2=A0=C2=A0=C2=A0=C2=A0case '(': /* ) */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0case '(': /* )( */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0case ')': /* only valid in case statement */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case BANG: /* ! time pipeline */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case TIME: /* time time pipeline */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case TIMEOPT: /* time -p time pipeline */ >> +@@ -3703,6 +3708,8 @@ >> + /*itrace("parse_comsub:%d: lex_inword -> 1 ch =3D `%c' (%d)",=20 >> line_number, ch, >> __LINE__);*/ >> +=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0tflags |=3D LEX_INWORD; >> +=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0lex_wlen =3D 0; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (tflags & LEX_RESWDOK) >> ++ lex_rwlen =3D 0; >> +=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 } >> +=C2=A0 >> +--- a/patchlevel.h 2014-10-05 19:52:50.000000000 +0200 >> ++++ b/patchlevel.h 2015-09-06 22:58:35.248780377 +0200 >> +@@ -25,6 +25,6 @@ >> +=C2=A0=C2=A0=C2=A0=C2=A0regexp `^#define[=C2=A0 ]*PATCHLEVEL', since that= 's what >> support/mkversion.sh >> +=C2=A0=C2=A0=C2=A0=C2=A0looks for to find the patch level (for the sccs v= ersion string).=20 >> */ >> +=C2=A0 >> +-#define PATCHLEVEL 30 >> ++#define PATCHLEVEL 42 >> +=C2=A0 >> + #endif /* _PATCHLEVEL_H_ */ >> +--- a/shell.c 2014-01-14 14:04:32.000000000 +0100 >> ++++ b/shell.c 2015-09-06 22:57:56.343941387 +0200 >> +@@ -73,6 +73,7 @@ >> + #endif >> +=C2=A0 >> + #if defined (READLINE) >> ++#=C2=A0=C2=A0include >> + #=C2=A0=C2=A0include "bashline.h" >> + #endif >> +=C2=A0 >> +@@ -909,6 +910,14 @@ >> +=C2=A0=C2=A0=C2=A0fflush (stdout); /* XXX */ >> +=C2=A0=C2=A0=C2=A0fflush (stderr); >> +=C2=A0 >> ++=C2=A0=C2=A0/* Clean up the terminal if we are in a state where it's bee= n=20 >> modified. */ >> ++#if defined (READLINE) >> ++=C2=A0=C2=A0if (RL_ISSTATE (RL_STATE_TERMPREPPED) && rl_deprep_term_func= tion) >> ++=C2=A0=C2=A0=C2=A0=C2=A0(*rl_deprep_term_function) (); >> ++#endif >> ++=C2=A0=C2=A0if (read_tty_modified ()) >> ++=C2=A0=C2=A0=C2=A0=C2=A0read_tty_cleanup (); >> ++ >> +=C2=A0=C2=A0=C2=A0/* Do trap[0] if defined.=C2=A0=C2=A0Allow it to overri= de the exit status >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0passed to us. */ >> +=C2=A0=C2=A0=C2=A0if (signal_is_trapped (0)) >> +--- a/sig.c 2014-01-10 21:06:06.000000000 +0100 >> ++++ b/sig.c 2015-09-06 22:57:56.344941408 +0200 >> +@@ -532,8 +532,10 @@ >> + #if defined (READLINE) >> +=C2=A0=C2=A0=C2=A0/* Set the event hook so readline will call it after th= e signal=20 >> handlers >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0finish executing, so if this interrup= ted character input we can=20 >> get >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0quick response. */ >> +-=C2=A0=C2=A0if (interactive_shell && interactive && no_line_editing =3D= =3D 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0quick response.=C2=A0=C2=A0If readline is = active or has modified the=20 >> terminal we >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0need to set this no matter what the signal= is, though the check=20 >> for >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0RL_STATE_TERMPREPPED is possibly redundant= . */ >> ++=C2=A0=C2=A0if (RL_ISSTATE (RL_STATE_SIGHANDLER) || RL_ISSTATE=20 >> (RL_STATE_TERMPREPPED)) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bashline_set_event_hook (); >> + #endif >> +=C2=A0 >> +--- a/subst.c 2014-10-01 18:57:47.000000000 +0200 >> ++++ b/subst.c 2015-09-06 22:58:34.177757570 +0200 >> +@@ -5782,7 +5782,7 @@ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* XXX - does this leak if name= [@] or name[*]? */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (pflags & PF_ASSIGNRHS) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0temp =3D arr= ay_variable_name (name, &tt, (int *)0); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0var =3D arra= y_variable_part (name, &tt, (int *)0); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (ALL= _ELEMENT_SUB (tt[0]) && tt[1] =3D=3D ']') >> +=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0temp =3D array_value (name, quoted|Q_DOUBL= E_QUOTES, 0, &atype, >> &ind); >> +=C2=A0 =C2=A0=C2=A0else >> +--- a/subst.h 2014-10-01 18:57:43.000000000 +0200 >> ++++ b/subst.h 2015-09-06 22:57:56.344941408 +0200 >> +@@ -47,6 +47,7 @@ >> + #define ASS_MKASSOC 0x0004 >> + #define ASS_MKGLOBAL 0x0008 /* force global assignment */ >> + #define ASS_NAMEREF 0x0010 /* assigning to nameref variable */ >> ++#define ASS_FROMREF 0x0020 /* assigning from value of nameref >> variable */ >> +=C2=A0 >> + /* Flags for the string extraction functions. */ >> + #define SX_NOALLOC 0x0001 /* just skip; don't return substring >> */ >> +--- a/variables.c 2014-10-01 18:57:51.000000000 +0200 >> ++++ b/variables.c 2015-09-06 22:57:56.345941430 +0200 >> +@@ -2516,10 +2516,27 @@ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0HASH_TABLE *table; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0int hflags, aflags; >> + { >> +-=C2=A0=C2=A0char *newval; >> ++=C2=A0=C2=A0char *newname, *newval; >> +=C2=A0=C2=A0=C2=A0SHELL_VAR *entry; >> ++#if defined (ARRAY_VARS) >> ++=C2=A0=C2=A0arrayind_t ind; >> ++=C2=A0=C2=A0char *subp; >> ++=C2=A0=C2=A0int sublen; >> ++#endif >> +=C2=A0 >> ++=C2=A0=C2=A0newname =3D 0; >> ++#if defined (ARRAY_VARS) >> ++=C2=A0=C2=A0if ((aflags & ASS_FROMREF) && (hflags & HASH_NOSRCH) =3D=3D = 0 && >> valid_array_reference (name)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0newname =3D array_variable_name (nam= e, &subp, &sublen); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (newname =3D=3D 0) >> ++ return (SHELL_VAR *)NULL; /* XXX */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0entry =3D hash_lookup (newname, tabl= e); >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0else >> ++#endif >> +=C2=A0=C2=A0=C2=A0entry =3D (hflags & HASH_NOSRCH) ? (SHELL_VAR *)NULL : = hash_lookup=20 >> (name, >> table); >> ++ >> +=C2=A0=C2=A0=C2=A0/* Follow the nameref chain here if this is the global = variables=20 >> table */ >> +=C2=A0=C2=A0=C2=A0if (entry && nameref_p (entry) && (invisible_p (entry) = =3D=3D 0) &&=20 >> table =3D=3D >> global_variables->table) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +@@ -2550,6 +2567,16 @@ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0var_setvalue (entry, make_varia= ble_value (entry, value, 0)); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++#if defined (ARRAY_VARS) >> ++=C2=A0=C2=A0else if (entry =3D=3D 0 && newname) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0entry =3D make_new_array_variable (n= ewname); /* indexed array by >> default */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (entry =3D=3D 0) >> ++ return entry; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0ind =3D array_expand_index (name, su= bp, sublen); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bind_array_element (entry, ind, valu= e, aflags); >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++#endif >> +=C2=A0=C2=A0=C2=A0else if (entry =3D=3D 0) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0entry =3D make_new_variable (na= me, table); >> +@@ -2670,7 +2697,8 @@ >> +=C2=A0 =C2=A0normal. */ >> +=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (nameref_cell (nv) =3D=3D = 0) >> +=C2=A0 return (bind_variable_internal (nv->name, value, >> nvc->table, 0, flags)); >> +- =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return (bind_variable_internal (na= meref_cell (nv), >> value, nvc->table, 0, flags)); >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* XXX - bug here with ref=3Darray= [index] */ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return (bind_variable_internal (na= meref_cell (nv), >> value, nvc->table, 0, flags|ASS_FROMREF)); >> +=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 =C2=A0=C2=A0else >> +=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0v =3D nv; >> +@@ -2805,10 +2833,12 @@ >> + #endif >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0v =3D bind_variable (lhs, rhs, 0); >> +=C2=A0 >> +-=C2=A0=C2=A0if (v && isint) >> +-=C2=A0=C2=A0=C2=A0=C2=A0VSETATTR (v, att_integer); >> +- >> +-=C2=A0=C2=A0VUNSETATTR (v, att_invisible); >> ++=C2=A0=C2=A0if (v) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (isint) >> ++ VSETATTR (v, att_integer); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0VUNSETATTR (v, att_invisible); >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0return (v); >> + } >> +--- a/y.tab.c 2014-10-05 19:52:50.000000000 +0200 >> ++++ b/y.tab.c 2015-09-06 22:58:35.247780356 +0200 >> +@@ -5130,11 +5130,16 @@ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case AND_AND: >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case OR_OR: >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case '&': >> ++=C2=A0=C2=A0=C2=A0=C2=A0case WHILE: >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case DO: >> ++=C2=A0=C2=A0=C2=A0=C2=A0case UNTIL: >> ++=C2=A0=C2=A0=C2=A0=C2=A0case IF: >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case THEN: >> ++=C2=A0=C2=A0=C2=A0=C2=A0case ELIF: >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case ELSE: >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case '{': /* } */ >> +-=C2=A0=C2=A0=C2=A0=C2=A0case '(': /* ) */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0case '(': /* )( */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0case ')': /* only valid in case statement */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case BANG: /* ! time pipeline */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case TIME: /* time time pipeline */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case TIMEOPT: /* time -p time pipeline */ >> +@@ -6015,6 +6020,8 @@ >> + /*itrace("parse_comsub:%d: lex_inword -> 1 ch =3D `%c' (%d)",=20 >> line_number, ch, >> __LINE__);*/ >> +=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0tflags |=3D LEX_INWORD; >> +=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0lex_wlen =3D 0; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (tflags & LEX_RESWDOK) >> ++ lex_rwlen =3D 0; >> +=C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 } >> +=C2=A0 --===============6116876103156185873==--