diff --git a/bash-3.2-286861.patch b/bash-3.2-286861.patch new file mode 100644 index 0000000..3ce4d7c --- /dev/null +++ b/bash-3.2-286861.patch @@ -0,0 +1,23 @@ +286861: Wrong input confuses bash's arithmetic unit permanently + +If evalerror (thus longjmp) is called while noeval != 0, it stays nonzero and +assignments cease to work. Such expressions are for example: + +let tmp="foo.a"+0 (only in bash 3.2) +let x=(0?(3?4):3) + +I think we should reset noeval to zero in the evalexp function (or restore +expr_stack[0], probably). + +Written-by: Tomas Janousek + +--- bash-3.2/expr.c.286861 2007-10-23 14:48:38.000000000 +0200 ++++ bash-3.2/expr.c 2007-11-06 18:48:24.000000000 +0100 +@@ -337,6 +337,7 @@ + return (0); + } + ++ noeval = 0; + val = subexpr (expr); + + if (validp) diff --git a/bash-3.2-344411.patch b/bash-3.2-344411.patch new file mode 100644 index 0000000..06c8afa --- /dev/null +++ b/bash-3.2-344411.patch @@ -0,0 +1,46 @@ +344411: $RANDOM stays the same when job executed in the background + +In bash 3.0, random was seeded whenever subshell_environment != 0. + +In bash 3.2, random was seeded whenever subshell_environment != 0 && +seeded_subshell == 0. And when it was seeded, seeded_subshell was set to 1. + +Therefore, in 3.2, if you seeded random in a subshell and in this subshell +invoked another one, it wasn't reseeded as it should have been. A testcase for +that is this: + ( echo $RANDOM; ( echo $RANDOM ); ( echo $RANDOM ) ) + +Tomas's patch (bash-3.2-rng.patch) changed the code to use subshell_level. +subshell_level is not increased for simple async commands, however. So, +although he fixed the previous case, he introduced another. Here's a testcase: + echo $RANDOM; echo $RANDOM & echo $RANDOM & + +I decided to just compare the pids, that should be safe enough. + +Written-by: Tomas Janousek +Reviewed-by: Tomas Mraz + +--- bash-3.2/variables.c.344411 2007-11-06 19:26:42.000000000 +0100 ++++ bash-3.2/variables.c 2007-11-06 20:27:25.000000000 +0100 +@@ -1211,7 +1211,7 @@ + arrayind_t unused; + { + sbrand ((unsigned int)strtoul (value, (char **)NULL, 10)); +- seeded_subshell = subshell_level; ++ seeded_subshell = getpid(); + return (self); + } + +@@ -1221,10 +1221,10 @@ + int rv; + + /* Reset for command and process substitution. */ +- if (seeded_subshell < subshell_level) ++ if (seeded_subshell != getpid()) + { + seed_random (); +- seeded_subshell = subshell_level; ++ seeded_subshell = getpid(); + } + + do diff --git a/bash-3.2-rng.patch b/bash-3.2-rng.patch new file mode 100644 index 0000000..44c6ec7 --- /dev/null +++ b/bash-3.2-rng.patch @@ -0,0 +1,184 @@ +diff -up bash-3.2/config.h.in.rng.patch bash-3.2/config.h.in +--- bash-3.2/config.h.in.rng.patch 2007-08-20 13:42:49.000000000 +0200 ++++ bash-3.2/config.h.in 2007-08-20 13:42:49.000000000 +0200 +@@ -203,6 +203,8 @@ + + #define DEFAULT_MAIL_DIRECTORY "/var/spool/mail" + ++#undef PATH_RANDOMDEV ++ + /* Characteristics of the system's header files and libraries that affect + the compilation environment. */ + +@@ -817,6 +819,10 @@ + /* Define if you have the wcwidth function. */ + #undef HAVE_WCWIDTH + ++#undef HAVE_RANDOM ++ ++#undef HAVE_SRANDOM ++ + /* Presence of certain system include files. */ + + /* Define if you have the header file. */ +diff -up bash-3.2/configure.in.rng.patch bash-3.2/configure.in +--- bash-3.2/configure.in.rng.patch 2007-08-20 13:42:49.000000000 +0200 ++++ bash-3.2/configure.in 2007-08-20 13:42:49.000000000 +0200 +@@ -111,6 +111,7 @@ AC_ARG_WITH(gnu-malloc, AC_HELP_STRING([ + AC_ARG_WITH(installed-readline, AC_HELP_STRING([--with-installed-readline], [use a version of the readline library that is already installed]), opt_with_installed_readline=$withval) + AC_ARG_WITH(purecov, AC_HELP_STRING([--with-purecov], [configure to postprocess with pure coverage]), opt_purecov=$withval) + AC_ARG_WITH(purify, AC_HELP_STRING([--with-purify], [configure to postprocess with purify]), opt_purify=$withval) ++AC_ARG_WITH(random, AC_HELP_STRING([--with-randomdev=path], [use specified random device instead of /dev/urandom]), opt_randomdev=$withval) + + if test "$opt_bash_malloc" = yes; then + MALLOC_TARGET=malloc +@@ -152,6 +153,15 @@ if test -z "${DEBUGGER_START_FILE}"; the + DEBUGGER_START_FILE=${ac_default_prefix}/share/bashdb/bashdb-main.inc + fi + ++if test "$opt_randomdev" = yes -o -z "$opt_randomdev"; then ++ opt_randomdev="/dev/urandom" ++elif test "$opt_randomdev" = no; then ++ opt_randomdev= ++fi ++if test -n "$opt_randomdev"; then ++ AC_DEFINE_UNQUOTED(PATH_RANDOMDEV, "$opt_randomdev", [Random device path.]) ++fi ++ + dnl optional shell features in config.h.in + opt_minimal_config=no + +@@ -708,6 +718,8 @@ AC_CHECK_FUNCS(bcopy bzero confstr fnmat + setenv setlinebuf setlocale setvbuf siginterrupt strchr \ + sysconf tcgetattr times ttyname tzset unsetenv) + ++AC_CHECK_FUNCS(random srandom) ++ + AC_CHECK_FUNCS(vsnprintf snprintf vasprintf asprintf) + AC_CHECK_FUNCS(isascii isblank isgraph isprint isspace isxdigit) + AC_CHECK_FUNCS(getpwent getpwnam getpwuid) +diff -up bash-3.2/variables.c.rng.patch bash-3.2/variables.c +--- bash-3.2/variables.c.rng.patch 2006-09-08 19:33:32.000000000 +0200 ++++ bash-3.2/variables.c 2007-08-20 16:16:56.000000000 +0200 +@@ -42,6 +42,11 @@ + #include "bashansi.h" + #include "bashintl.h" + ++#if defined (PATH_RANDOMDEV) ++# include ++# include "filecntl.h" ++#endif ++ + #include "shell.h" + #include "flags.h" + #include "execute_cmd.h" +@@ -182,7 +187,8 @@ static SHELL_VAR *get_seconds __P((SHELL + static SHELL_VAR *init_seconds_var __P((void)); + + static int brand __P((void)); +-static void sbrand __P((unsigned long)); /* set bash random number generator. */ ++static void sbrand __P((unsigned int)); /* set bash random number generator. */ ++static void seed_random __P((void)); /* seed the generator randomly */ + static SHELL_VAR *assign_random __P((SHELL_VAR *, char *, arrayind_t)); + static SHELL_VAR *get_random __P((SHELL_VAR *)); + +@@ -494,9 +500,6 @@ initialize_shell_variables (env, privmod + } + #endif /* HISTORY */ + +- /* Seed the random number generator. */ +- sbrand (dollar_dollar_pid + shell_start_time); +- + /* Handle some "special" variables that we may have inherited from a + parent shell. */ + if (interactive_shell) +@@ -1143,9 +1146,11 @@ init_seconds_var () + } + + /* The random number seed. You can change this by setting RANDOM. */ ++#if !defined (HAVE_RANDOM) + static unsigned long rseed = 1; ++#endif + static int last_random_value; +-static int seeded_subshell = 0; ++static int seeded_subshell = -1; + + /* A linear congruential random number generator based on the example + one in the ANSI C standard. This one isn't very good, but a more +@@ -1155,28 +1160,58 @@ static int seeded_subshell = 0; + static int + brand () + { ++#if defined (HAVE_RANDOM) ++ unsigned int rseed; ++ rseed = random(); ++#else + rseed = rseed * 1103515245 + 12345; ++#endif + return ((unsigned int)((rseed >> 16) & 32767)); /* was % 32768 */ + } + + /* Set the random number generator seed to SEED. */ + static void + sbrand (seed) +- unsigned long seed; ++ unsigned int seed; + { ++#if defined (HAVE_RANDOM) ++ srandom((unsigned int)seed); ++#else + rseed = seed; ++#endif + last_random_value = 0; + } + ++static void ++seed_random () ++{ ++ unsigned int seed; ++#if defined (PATH_RANDOMDEV) ++ int fd; ++ int rv; ++ if ((rv = fd = open (PATH_RANDOMDEV, O_RDONLY)) != -1) { ++ while ((rv = read(fd, &seed, sizeof(seed))) != sizeof(seed) && errno == EINTR); ++ close (fd); ++ } ++ if (rv != sizeof(seed)) { ++#endif ++ struct timeval tv; ++ gettimeofday(&tv, NULL); ++ seed = (unsigned int)tv.tv_sec + (unsigned int)tv.tv_usec + getpid(); ++#if defined (PATH_RANDOMDEV) ++ } ++#endif ++ sbrand (seed); ++} ++ + static SHELL_VAR * + assign_random (self, value, unused) + SHELL_VAR *self; + char *value; + arrayind_t unused; + { +- sbrand (strtoul (value, (char **)NULL, 10)); +- if (subshell_environment) +- seeded_subshell = 1; ++ sbrand ((unsigned int)strtoul (value, (char **)NULL, 10)); ++ seeded_subshell = subshell_level; + return (self); + } + +@@ -1186,10 +1221,10 @@ get_random_number () + int rv; + + /* Reset for command and process substitution. */ +- if (subshell_environment && seeded_subshell == 0) ++ if (seeded_subshell < subshell_level) + { +- sbrand (rseed + getpid() + NOW); +- seeded_subshell = 1; ++ seed_random (); ++ seeded_subshell = subshell_level; + } + + do diff --git a/bash-ulimit-m.patch b/bash-ulimit-m.patch new file mode 100644 index 0000000..39bca85 --- /dev/null +++ b/bash-ulimit-m.patch @@ -0,0 +1,22 @@ +--- bash-3.2/builtins/ulimit.def.ulimit-m 2006-03-23 20:51:51.000000000 +0000 ++++ bash-3.2/builtins/ulimit.def 2007-07-04 16:42:12.000000000 +0100 +@@ -38,7 +38,7 @@ + -f the maximum size of files written by the shell and its children + -i the maximum number of pending signals + -l the maximum size a process may lock into memory +- -m the maximum resident set size ++ -m the maximum resident set size (has no effect on Linux) + -n the maximum number of open file descriptors + -p the pipe buffer size + -q the maximum number of bytes in POSIX message queues +--- bash-3.2/doc/bash.1.ulimit-m 2007-07-04 16:41:59.000000000 +0100 ++++ bash-3.2/doc/bash.1 2007-07-04 16:42:12.000000000 +0100 +@@ -8545,7 +8545,7 @@ + The maximum size that may be locked into memory + .TP + .B \-m +-The maximum resident set size ++The maximum resident set size (has no effect on Linux) + .TP + .B \-n + The maximum number of open file descriptors (most systems do not diff --git a/bash.spec b/bash.spec index 1e882f7..6072a73 100644 --- a/bash.spec +++ b/bash.spec @@ -1,9 +1,9 @@ Version: 3.2 Name: bash Summary: The GNU Bourne Again shell (bash) version %{version} -Release: 9%{?dist} +Release: 19%{?dist} Group: System Environment/Shells -License: GPL +License: GPLv2+ Url: http://www.gnu.org/software/bash Source0: ftp://ftp.gnu.org/gnu/bash/bash-%{version}.tar.gz Source2: ftp://ftp.gnu.org/gnu/bash/bash-doc-%{version}.tar.gz @@ -20,6 +20,22 @@ Patch6: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-006 Patch7: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-007 Patch8: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-008 Patch9: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-009 +Patch10: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-010 +Patch11: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-011 +Patch12: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-012 +Patch13: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-013 +Patch14: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-014 +Patch15: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-015 +Patch16: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-016 +Patch17: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-017 +Patch18: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-018 +Patch19: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-019 +Patch20: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-020 +Patch21: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-021 +Patch22: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-022 +Patch23: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-023 +Patch24: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-024 +Patch25: ftp://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-025 # Other patches Patch100: bash-2.03-paths.patch Patch101: bash-2.02-security.patch @@ -35,6 +51,11 @@ Patch118: bash-tty-tests.patch Patch126: bash-setlocale.patch Patch130: bash-infotags.patch Patch131: bash-cond-rmatch.patch +Patch132: bash-ulimit-m.patch +Patch133: bash-3.2-rng.patch +Patch134: readline-5.2-inv.patch +Patch135: bash-3.2-286861.patch +Patch136: bash-3.2-344411.patch Requires: mktemp Requires(post): ncurses BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -63,6 +84,22 @@ compliance over previous versions. %patch7 -p0 -b .007 %patch8 -p0 -b .008 %patch9 -p0 -b .009 +%patch10 -p0 -b .010 +%patch11 -p0 -b .011 +%patch12 -p0 -b .012 +%patch13 -p0 -b .013 +%patch14 -p0 -b .014 +%patch15 -p0 -b .015 +%patch16 -p0 -b .016 +%patch17 -p0 -b .017 +%patch18 -p0 -b .018 +%patch19 -p0 -b .019 +%patch20 -p0 -b .020 +%patch21 -p0 -b .021 +%patch22 -p0 -b .022 +%patch23 -p0 -b .023 +%patch24 -p0 -b .024 +%patch25 -p0 -b .025 # Other patches %patch100 -p1 -b .paths @@ -79,6 +116,11 @@ compliance over previous versions. %patch126 -p1 -b .setlocale %patch130 -p1 -b .infotags %patch131 -p1 -b .cond-rmatch +%patch132 -p1 -b .ulimit-m +%patch133 -p1 -b .rng.patch +%patch134 -p1 -b .readline-inv +%patch135 -p1 -b .286861 +%patch136 -p1 -b .344411 echo %{version} > _distribution echo %{release} > _patchlevel @@ -182,9 +224,9 @@ if [ ! -f /etc/shells ]; then fi (while read line ; do - if [ $line = /bin/bash ]; then + if [ "$line" = "/bin/bash" ]; then HASBASH=1 - elif [ $line = /bin/sh ]; then + elif [ "$line" = "/bin/sh" ]; then HASSH=1 fi done @@ -209,7 +251,7 @@ fi %doc doc/FAQ doc/INTRO doc/article.ms %doc -P examples/bashdb/ examples/functions/ examples/misc/ %doc -P examples/scripts.noah/ examples/scripts.v2/ examples/scripts/ -%doc -P examples/startup-files/ examples/complete/ examples/loadables/ +%doc -P examples/startup-files/ examples/complete/ %config(noreplace) /etc/skel/.b* /bin/sh /bin/bash @@ -220,6 +262,49 @@ fi %doc doc/*.ps doc/*.0 doc/*.html doc/article.txt %changelog +* Tue Nov 06 2007 Tomas Janousek - 3.2-19 +- fix cursor position when prompt has one invisible character (#358231) +- dropped examples/loadables/ from docs, since it wasn't possible to build them + anyway (#174380) +- fix #286861: Wrong input confuses bash's arithmetic unit permanently +- fix #344411: $RANDOM stays the same when job executed in the background + +* Fri Aug 31 2007 Pete Graner - 3.2-18 +- Added bash32-021 upstream official patch +- Added bash32-025 upstream official patch +- Added bash32-024 upstream official patch +- Added bash32-023 upstream official patch +- Added bash32-022 upstream official patch + +* Wed Aug 29 2007 Pete Graner - 3.2-17 +- Added bash32-018 upstream official patch +- Added bash32-020 upstream official patch +- Added bash32-019 upstream official patch + +* Thu Aug 23 2007 Pete Graner - 3.2-16 +- Rebuild + +* Mon Aug 20 2007 Pete Graner - 3.2-15 +- Update to the Improve bash $RANDOM pseudo RNG (bug #234906) + now works with subshells and make $RANDOM on demand thus reducing the + amount of AVCs thrown. + +* Thu Aug 16 2007 Pete Graner - 3.2-15 +- Changed spec file License to GPLv2+ + +* Wed Aug 15 2007 Pete Graner - 3.2-13 +- Improve bash $RANDOM pseudo RNG (bug #234906) + +* Fri Jul 20 2007 Tim Waugh 3.2-12 +- Quote environment variables in the post scriptlet to prevent upgrade + failures (bug #249005). + +* Thu Jul 5 2007 Tim Waugh 3.2-11 +- Patchlevel 17 (bug #241647). + +* Wed Jul 4 2007 Tim Waugh 3.2-10 +- Clarification in the ulimit man page (bug #220657). + * Mon Feb 12 2007 Tim Waugh 3.2-9 - Rebuild to link with libtinfo instead of libncurses. diff --git a/bash32-010 b/bash32-010 new file mode 100644 index 0000000..88de575 --- /dev/null +++ b/bash32-010 @@ -0,0 +1,207 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 3.2 +Patch-ID: bash32-010 + +Bug-Reported-by: Ryan Waldron +Bug-Reference-ID: <20070119065603.546D011E9C@kansas.erebor.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-01/msg00059.html + +Bug-Description: + +The glibc implementation of regcomp/regexec does not allow backslashes to +escape "ordinary" pattern characters when matching. Bash used backslashes +to quote all characters when the pattern argument to the [[ special +command's =~ operator was quoted. This caused the match to fail on Linux +and other systems using GNU libc. + +Patch: + +*** ../bash-3.2.9/pathexp.h Sat Feb 19 17:23:18 2005 +--- pathexp.h Wed Jan 31 22:53:16 2007 +*************** +*** 1,5 **** + /* pathexp.h -- The shell interface to the globbing library. */ + +! /* Copyright (C) 1987-2005 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. +--- 1,5 ---- + /* pathexp.h -- The shell interface to the globbing library. */ + +! /* Copyright (C) 1987-2007 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. +*************** +*** 33,36 **** +--- 33,37 ---- + #define QGLOB_CVTNULL 0x01 /* convert QUOTED_NULL strings to '\0' */ + #define QGLOB_FILENAME 0x02 /* do correct quoting for matching filenames */ ++ #define QGLOB_REGEXP 0x04 /* quote an ERE for regcomp/regexec */ + + #if defined (EXTENDED_GLOB) +*** ../bash-3.2.9/pathexp.c Mon May 6 13:43:05 2002 +--- pathexp.c Mon Feb 26 16:59:23 2007 +*************** +*** 1,5 **** + /* pathexp.c -- The shell interface to the globbing library. */ + +! /* Copyright (C) 1995-2002 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. +--- 1,5 ---- + /* pathexp.c -- The shell interface to the globbing library. */ + +! /* Copyright (C) 1995-2007 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. +*************** +*** 111,114 **** +--- 111,141 ---- + } + ++ /* Return 1 if C is a character that is `special' in a POSIX ERE and needs to ++ be quoted to match itself. */ ++ static inline int ++ ere_char (c) ++ int c; ++ { ++ switch (c) ++ { ++ case '.': ++ case '[': ++ case '\\': ++ case '(': ++ case ')': ++ case '*': ++ case '+': ++ case '?': ++ case '{': ++ case '|': ++ case '^': ++ case '$': ++ return 1; ++ default: ++ return 0; ++ } ++ return (0); ++ } ++ + /* PATHNAME can contain characters prefixed by CTLESC; this indicates + that the character is to be quoted. We quote it here in the style +*************** +*** 143,146 **** +--- 170,175 ---- + if ((qflags & QGLOB_FILENAME) && pathname[i+1] == '/') + continue; ++ if ((qflags & QGLOB_REGEXP) && ere_char (pathname[i+1]) == 0) ++ continue; + temp[j++] = '\\'; + i++; +*** ../bash-3.2.9/subst.c Tue Nov 7 16:14:41 2006 +--- subst.c Wed Jan 31 23:09:58 2007 +*************** +*** 5,9 **** + beauty, but, hey, you're alright.'' */ + +! /* Copyright (C) 1987-2006 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. +--- 5,9 ---- + beauty, but, hey, you're alright.'' */ + +! /* Copyright (C) 1987-2007 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. +*************** +*** 2647,2655 **** + /* This needs better error handling. */ + /* Expand W for use as an argument to a unary or binary operator in a +! [[...]] expression. If SPECIAL is nonzero, this is the rhs argument + to the != or == operator, and should be treated as a pattern. In +! this case, we quote the string specially for the globbing code. The +! caller is responsible for removing the backslashes if the unquoted +! words is needed later. */ + char * + cond_expand_word (w, special) +--- 2647,2656 ---- + /* This needs better error handling. */ + /* Expand W for use as an argument to a unary or binary operator in a +! [[...]] expression. If SPECIAL is 1, this is the rhs argument + to the != or == operator, and should be treated as a pattern. In +! this case, we quote the string specially for the globbing code. If +! SPECIAL is 2, this is an rhs argument for the =~ operator, and should +! be quoted appropriately for regcomp/regexec. The caller is responsible +! for removing the backslashes if the unquoted word is needed later. */ + char * + cond_expand_word (w, special) +*************** +*** 2659,2662 **** +--- 2660,2664 ---- + char *r, *p; + WORD_LIST *l; ++ int qflags; + + if (w->word == 0 || w->word[0] == '\0') +*************** +*** 2673,2678 **** + else + { + p = string_list (l); +! r = quote_string_for_globbing (p, QGLOB_CVTNULL); + free (p); + } +--- 2675,2683 ---- + else + { ++ qflags = QGLOB_CVTNULL; ++ if (special == 2) ++ qflags |= QGLOB_REGEXP; + p = string_list (l); +! r = quote_string_for_globbing (p, qflags); + free (p); + } +*** ../bash-3.2.9/execute_cmd.c Sat Aug 26 00:23:17 2006 +--- execute_cmd.c Wed Jan 31 23:12:06 2007 +*************** +*** 1,5 **** + /* execute_cmd.c -- Execute a COMMAND structure. */ + +! /* Copyright (C) 1987-2005 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. +--- 1,5 ---- + /* execute_cmd.c -- Execute a COMMAND structure. */ + +! /* Copyright (C) 1987-2007 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. +*************** +*** 2547,2551 **** + if (arg1 == 0) + arg1 = nullstr; +! arg2 = cond_expand_word (cond->right->op, patmatch||rmatch); + if (arg2 == 0) + arg2 = nullstr; +--- 2547,2551 ---- + if (arg1 == 0) + arg1 = nullstr; +! arg2 = cond_expand_word (cond->right->op, rmatch ? 2 : (patmatch ? 1 : 0)); + if (arg2 == 0) + arg2 = nullstr; +*** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 +--- patchlevel.h Mon Oct 16 14:22:54 2006 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 9 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 10 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash32-011 b/bash32-011 new file mode 100644 index 0000000..c021f52 --- /dev/null +++ b/bash32-011 @@ -0,0 +1,138 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 3.2 +Patch-ID: bash32-011 + +Bug-Reported-by: Petr Sumbera +Bug-Reference-ID: <45AF5F4B.1020800@sun.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-01/msg00049.html + +Bug-Description: + +Under certain circumstances (loopback mounts), the bash getcwd does not +return correct results. This patch allows the use of the Solaris libc +getcwd even though it doesn't dynamically allocate memory. + +Run `touch configure' to make sure make doesn't try to run autoconf. +Then run configure with whatever options you like. + +Patch: + +*** ../bash-3.2-patched/configure.in Tue Sep 26 11:05:45 2006 +--- configure.in Wed Jan 31 09:48:00 2007 +*************** +*** 6,10 **** + dnl Process this file with autoconf to produce a configure script. + +! # Copyright (C) 1987-2006 Free Software Foundation, Inc. + + # This program is free software; you can redistribute it and/or modify +--- 6,10 ---- + dnl Process this file with autoconf to produce a configure script. + +! # Copyright (C) 1987-2007 Free Software Foundation, Inc. + + # This program is free software; you can redistribute it and/or modify +*************** +*** 992,996 **** + sco3.2*) LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;; + sunos4*) LOCAL_CFLAGS=-DSunOS4 ;; +! solaris2.5*) LOCAL_CFLAGS=-DSunOS5 ;; + lynxos*) LOCAL_CFLAGS=-DRECYCLES_PIDS ;; + linux*) LOCAL_LDFLAGS=-rdynamic # allow dynamic loading +--- 992,997 ---- + sco3.2*) LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;; + sunos4*) LOCAL_CFLAGS=-DSunOS4 ;; +! solaris2.5*) LOCAL_CFLAGS="-DSunOS5 -DSOLARIS" ;; +! solaris2*) LOCAL_CFLAGS=-DSOLARIS ;; + lynxos*) LOCAL_CFLAGS=-DRECYCLES_PIDS ;; + linux*) LOCAL_LDFLAGS=-rdynamic # allow dynamic loading +*** ../bash-3.2-patched/config-bot.h Tue Sep 12 16:43:04 2006 +--- config-bot.h Tue Mar 6 10:41:31 2007 +*************** +*** 2,6 **** + /* modify settings or make new ones based on what autoconf tells us. */ + +! /* Copyright (C) 1989-2002 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. +--- 2,6 ---- + /* modify settings or make new ones based on what autoconf tells us. */ + +! /* Copyright (C) 1989-2007 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. +*************** +*** 71,77 **** + #endif + +! /* If we have a getcwd(3), but it calls popen(), #undef HAVE_GETCWD so +! the replacement in getcwd.c will be built. */ +! #if defined (HAVE_GETCWD) && defined (GETCWD_BROKEN) + # undef HAVE_GETCWD + #endif +--- 71,79 ---- + #endif + +! /* If we have a getcwd(3), but one that does not dynamically allocate memory, +! #undef HAVE_GETCWD so the replacement in getcwd.c will be built. We do +! not do this on Solaris, because their implementation of loopback mounts +! breaks the traditional file system assumptions that getcwd uses. */ +! #if defined (HAVE_GETCWD) && defined (GETCWD_BROKEN) && !defined (SOLARIS) + # undef HAVE_GETCWD + #endif +*** ../bash-3.2-patched/builtins/common.c Thu Jul 27 09:39:51 2006 +--- builtins/common.c Tue Mar 6 10:43:27 2007 +*************** +*** 1,3 **** +! /* Copyright (C) 1987-2005 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. +--- 1,3 ---- +! /* Copyright (C) 1987-2007 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. +*************** +*** 476,480 **** +--- 476,484 ---- + if (the_current_working_directory == 0) + { ++ #if defined (GETCWD_BROKEN) ++ the_current_working_directory = getcwd (0, PATH_MAX); ++ #else + the_current_working_directory = getcwd (0, 0); ++ #endif + if (the_current_working_directory == 0) + { +*** ../bash-3.2-patched/configure Tue Sep 26 11:06:01 2006 +--- configure Tue Mar 6 10:59:20 2007 +*************** +*** 27317,27321 **** + sco3.2*) LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;; + sunos4*) LOCAL_CFLAGS=-DSunOS4 ;; +! solaris2.5*) LOCAL_CFLAGS=-DSunOS5 ;; + lynxos*) LOCAL_CFLAGS=-DRECYCLES_PIDS ;; + linux*) LOCAL_LDFLAGS=-rdynamic # allow dynamic loading +--- 27317,27322 ---- + sco3.2*) LOCAL_CFLAGS=-DMUST_UNBLOCK_CHLD ;; + sunos4*) LOCAL_CFLAGS=-DSunOS4 ;; +! solaris2.5*) LOCAL_CFLAGS="-DSunOS5 -DSOLARIS" ;; +! solaris2*) LOCAL_CFLAGS=-DSOLARIS ;; + lynxos*) LOCAL_CFLAGS=-DRECYCLES_PIDS ;; + linux*) LOCAL_LDFLAGS=-rdynamic # allow dynamic loading +*** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 +--- patchlevel.h Mon Oct 16 14:22:54 2006 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 10 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 11 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash32-012 b/bash32-012 new file mode 100644 index 0000000..8d669d2 --- /dev/null +++ b/bash32-012 @@ -0,0 +1,96 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 3.2 +Patch-ID: bash32-012 + +Bug-Reported-by: John Wyman +Bug-Reference-ID: <5E7DEFC094C35044B87FAE761D9F0EE20143A3B7@exchange2k.celink.com> +Bug-Reference-URL: + +Bug-Description: + +Some systems (AIX 4.x) don't implement the PRI_xxx macros correctly, +causing syntax errors when attempting to compile bash on those systems. +This patch adds support for the PRI_MACROS_BROKEN define. + +You will need to re-run `configure' after applying the patch. Run +`touch configure' so make doesn't try to run autoconf. + +Patch: + +*** ../bash-3.2.11/config.h.in Tue Sep 12 16:00:54 2006 +--- config.h.in Tue Mar 6 11:17:55 2007 +*************** +*** 1,5 **** + /* config.h -- Configuration file for bash. */ + +! /* Copyright (C) 1987-2006 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. +--- 1,5 ---- + /* config.h -- Configuration file for bash. */ + +! /* Copyright (C) 1987-2007 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. +*************** +*** 414,417 **** +--- 414,419 ---- + #undef HAVE_DECL_STRTOLD + ++ #undef PRI_MACROS_BROKEN ++ + #undef STRTOLD_BROKEN + +*************** +*** 1007,1010 **** +--- 1009,1015 ---- + #undef HAVE_DCGETTEXT + ++ /* Define if you have the `localeconv' function. */ ++ #undef HAVE_LOCALECONV ++ + /* Define if your system has a working `malloc' function. */ + /* #undef HAVE_MALLOC */ +*** ../bash-3.2.11/builtins/printf.def Mon Nov 13 08:58:52 2006 +--- builtins/printf.def Sun Feb 4 13:58:59 2007 +*************** +*** 2,6 **** + It implements the builtin "printf" in Bash. + +! Copyright (C) 1997-2005 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. +--- 2,6 ---- + It implements the builtin "printf" in Bash. + +! Copyright (C) 1997-2007 Free Software Foundation, Inc. + + This file is part of GNU Bash, the Bourne Again SHell. +*************** +*** 71,74 **** +--- 71,78 ---- + #include "common.h" + ++ #if defined (PRI_MACROS_BROKEN) ++ # undef PRIdMAX ++ #endif ++ + #if !defined (PRIdMAX) + # if HAVE_LONG_LONG +*** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 +--- patchlevel.h Mon Oct 16 14:22:54 2006 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 11 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 12 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash32-013 b/bash32-013 new file mode 100644 index 0000000..d47bc1a --- /dev/null +++ b/bash32-013 @@ -0,0 +1,65 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 3.2 +Patch-ID: bash32-013 + +Bug-Reported-by: Magnus Svensson +Bug-Reference-ID: <45BDC44D.80609@mysql.com> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-readline/2007-01/msg00002.html + +Bug-Description: + +Readline neglects to reallocate the array it uses to keep track of wrapped +screen lines when increasing its size. This will eventually result in +segmentation faults when given sufficiently long input. + +Patch: + +*** ../bash-3.2-patched/lib/readline/display.c Thu Sep 14 14:20:12 2006 +--- lib/readline/display.c Fri Feb 2 20:23:17 2007 +*************** +*** 561,574 **** +--- 561,586 ---- + wrap_offset = prompt_invis_chars_first_line = 0; + } + ++ #if defined (HANDLE_MULTIBYTE) + #define CHECK_INV_LBREAKS() \ + do { \ + if (newlines >= (inv_lbsize - 2)) \ + { \ + inv_lbsize *= 2; \ + inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ ++ _rl_wrapped_line = (int *)xrealloc (_rl_wrapped_line, inv_lbsize * sizeof (int)); \ + } \ + } while (0) ++ #else ++ #define CHECK_INV_LBREAKS() \ ++ do { \ ++ if (newlines >= (inv_lbsize - 2)) \ ++ { \ ++ inv_lbsize *= 2; \ ++ inv_lbreaks = (int *)xrealloc (inv_lbreaks, inv_lbsize * sizeof (int)); \ ++ } \ ++ } while (0) ++ #endif /* HANDLE_MULTIBYTE */ + + #if defined (HANDLE_MULTIBYTE) + #define CHECK_LPOS() \ + +*** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 +--- patchlevel.h Mon Oct 16 14:22:54 2006 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 12 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 13 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash32-014 b/bash32-014 new file mode 100644 index 0000000..b706505 --- /dev/null +++ b/bash32-014 @@ -0,0 +1,307 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 3.2 +Patch-ID: bash32-014 + +Bug-Reported-by: Brett Stahlman +Bug-Reference-ID: <000701c72d29$a227e0e0$5ec7cf47@computerroom> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2006-12/msg00065.html + +Bug-Description: + +Bash mishandles word splitting under certain circumstances when IFS is +null (IFS=). Constructs affected include ${param/pat/sub} and others +when expanding arrays (array[@]). + +Patch: + +*** ../bash-3.2-patched/array.c Wed Jun 1 16:39:22 2005 +--- array.c Mon Jan 15 22:58:00 2007 +*************** +*** 121,125 **** + } + +- #ifdef INCLUDE_UNUSED + /* + * Make and return a new array composed of the elements in array A from +--- 121,124 ---- +*************** +*** 142,146 **** + n = array_create_element (element_index(p), element_value(p)); + ADD_BEFORE(a->head, n); +! mi = element_index(ae); + } + a->num_elements = i; +--- 141,145 ---- + n = array_create_element (element_index(p), element_value(p)); + ADD_BEFORE(a->head, n); +! mi = element_index(n); + } + a->num_elements = i; +*************** +*** 148,152 **** + return a; + } +- #endif + + /* +--- 147,150 ---- +*************** +*** 301,304 **** +--- 299,319 ---- + } + ++ ARRAY * ++ array_quote_escapes(array) ++ ARRAY *array; ++ { ++ ARRAY_ELEMENT *a; ++ char *t; ++ ++ if (array == 0 || array_head(array) == 0 || array_empty(array)) ++ return (ARRAY *)NULL; ++ for (a = element_forw(array->head); a != array->head; a = element_forw(a)) { ++ t = quote_escapes (a->value); ++ FREE(a->value); ++ a->value = t; ++ } ++ return array; ++ } ++ + /* + * Return a string whose elements are the members of array A beginning at +*************** +*** 312,318 **** + int starsub, quoted; + { + ARRAY_ELEMENT *h, *p; + arrayind_t i; +! char *ifs, sep[2]; + + p = a ? array_head (a) : 0; +--- 327,334 ---- + int starsub, quoted; + { ++ ARRAY *a2; + ARRAY_ELEMENT *h, *p; + arrayind_t i; +! char *ifs, sep[2], *t; + + p = a ? array_head (a) : 0; +*************** +*** 337,340 **** +--- 353,363 ---- + ; + ++ a2 = array_slice(a, h, p); ++ ++ if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) ++ array_quote(a2); ++ else ++ array_quote_escapes(a2); ++ + if (starsub && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) { + ifs = getifs(); +*************** +*** 344,348 **** + sep[1] = '\0'; + +! return (array_to_string_internal (h, p, sep, quoted)); + } + +--- 367,374 ---- + sep[1] = '\0'; + +! t = array_to_string (a2, sep, 0); +! array_dispose(a2); +! +! return t; + } + +*************** +*** 368,372 **** + + if (mflags & MATCH_QUOTED) +! array_quote (a2); + if (mflags & MATCH_STARSUB) { + ifs = getifs(); +--- 394,400 ---- + + if (mflags & MATCH_QUOTED) +! array_quote(a2); +! else +! array_quote_escapes(a2); + if (mflags & MATCH_STARSUB) { + ifs = getifs(); +*** ../bash-3.2-patched/array.h Sun Jun 1 15:50:30 2003 +--- array.h Mon Jan 15 22:35:35 2007 +*************** +*** 56,59 **** +--- 56,60 ---- + extern int array_shift_element __P((ARRAY *, char *)); + extern ARRAY *array_quote __P((ARRAY *)); ++ extern ARRAY *array_quote_escapes __P((ARRAY *)); + + extern char *array_subrange __P((ARRAY *, arrayind_t, arrayind_t, int, int)); +*** ../bash-3.2-patched/subst.c Fri Mar 2 16:20:50 2007 +--- subst.c Tue Mar 6 11:40:55 2007 +*************** +*** 1888,1892 **** +--- 1889,1899 ---- + #endif + ++ /* XXX -- why call quote_list if ifs == 0? we can get away without doing ++ it now that quote_escapes quotes spaces */ ++ #if 0 + tlist = ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || (ifs && *ifs == 0)) ++ #else ++ tlist = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ++ #endif + ? quote_list (list) + : list_quote_escapes (list); +*************** +*** 2922,2926 **** + /* Quote escape characters in string s, but no other characters. This is + used to protect CTLESC and CTLNUL in variable values from the rest of +! the word expansion process after the variable is expanded. */ + char * + quote_escapes (string) +--- 2935,2944 ---- + /* Quote escape characters in string s, but no other characters. This is + used to protect CTLESC and CTLNUL in variable values from the rest of +! the word expansion process after the variable is expanded. If IFS is +! null, we quote spaces as well, just in case we split on spaces later +! (in the case of unquoted $@, we will eventually attempt to split the +! entire word on spaces). Corresponding code exists in dequote_escapes. +! Even if we don't end up splitting on spaces, quoting spaces is not a +! problem. */ + char * + quote_escapes (string) +*************** +*** 2930,2933 **** +--- 2948,2952 ---- + size_t slen; + char *result, *send; ++ int quote_spaces; + DECLARE_MBSTATE; + +*************** +*** 2935,2938 **** +--- 2954,2958 ---- + send = string + slen; + ++ quote_spaces = (ifs_value && *ifs_value == 0); + t = result = (char *)xmalloc ((slen * 2) + 1); + s = string; +*************** +*** 2940,2944 **** + while (*s) + { +! if (*s == CTLESC || *s == CTLNUL) + *t++ = CTLESC; + COPY_CHAR_P (t, s, send); +--- 2960,2964 ---- + while (*s) + { +! if (*s == CTLESC || *s == CTLNUL || (quote_spaces && *s == ' ')) + *t++ = CTLESC; + COPY_CHAR_P (t, s, send); +*************** +*** 2982,2985 **** +--- 3002,3006 ---- + size_t slen; + char *result, *send; ++ int quote_spaces; + DECLARE_MBSTATE; + +*************** +*** 2996,3002 **** + return (strcpy (result, s)); + + while (*s) + { +! if (*s == CTLESC && (s[1] == CTLESC || s[1] == CTLNUL)) + { + s++; +--- 3017,3024 ---- + return (strcpy (result, s)); + ++ quote_spaces = (ifs_value && *ifs_value == 0); + while (*s) + { +! if (*s == CTLESC && (s[1] == CTLESC || s[1] == CTLNUL || (quote_spaces && s[1] == ' '))) + { + s++; +*************** +*** 4462,4466 **** + RESIZE_MALLOCED_BUFFER (istring, istring_index, 2, istring_size, DEFAULT_ARRAY_SIZE); + +! if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || c == CTLESC || c == CTLNUL) + istring[istring_index++] = CTLESC; + +--- 4498,4510 ---- + RESIZE_MALLOCED_BUFFER (istring, istring_index, 2, istring_size, DEFAULT_ARRAY_SIZE); + +! /* This is essentially quote_string inline */ +! if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) /* || c == CTLESC || c == CTLNUL */) +! istring[istring_index++] = CTLESC; +! /* Escape CTLESC and CTLNUL in the output to protect those characters +! from the rest of the word expansions (word splitting and globbing.) +! This is essentially quote_escapes inline. */ +! else if (c == CTLESC) +! istring[istring_index++] = CTLESC; +! else if (c == CTLNUL || (c == ' ' && (ifs_value && *ifs_value == 0))) + istring[istring_index++] = CTLESC; + +*************** +*** 5552,5555 **** +--- 5610,5616 ---- + rely on array_subrange to understand how to deal with them). */ + tt = array_subrange (array_cell (v), e1, e2, starsub, quoted); ++ #if 0 ++ /* array_subrange now calls array_quote_escapes as appropriate, so the ++ caller no longer needs to. */ + if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) == 0) + { +*************** +*** 5558,5561 **** +--- 5619,5623 ---- + } + else ++ #endif + temp = tt; + break; +*************** +*** 5808,5811 **** +--- 5870,5876 ---- + case VT_ARRAYVAR: + temp = array_patsub (array_cell (v), p, rep, mflags); ++ #if 0 ++ /* Don't need to do this anymore; array_patsub calls array_quote_escapes ++ as appropriate before adding the space separators. */ + if (temp && (mflags & MATCH_QUOTED) == 0) + { +*************** +*** 5814,5817 **** +--- 5879,5883 ---- + temp = tt; + } ++ #endif + break; + #endif +*** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 +--- patchlevel.h Mon Oct 16 14:22:54 2006 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 13 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 14 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash32-015 b/bash32-015 new file mode 100644 index 0000000..d887f6e --- /dev/null +++ b/bash32-015 @@ -0,0 +1,95 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 3.2 +Patch-ID: bash32-015 + +Bug-Reported-by: +Bug-Reference-ID: +Bug-Reference-URL: + +Bug-Description: + +Under certain circumstances, when using FIFOs for process substitution, +bash fails to unlink the FIFOs. This leaves open file descriptors that +can cause the shell to hang and litters the file system. + +Patch: + +*** ../bash-3.2-patched/execute_cmd.c Fri Mar 2 16:20:50 2007 +--- execute_cmd.c Wed Jan 31 23:12:06 2007 +*************** +*** 3051,3054 **** +--- 3051,3059 ---- + command_line = savestring (the_printed_command_except_trap); + ++ #if defined (PROCESS_SUBSTITUTION) ++ if ((subshell_environment & SUBSHELL_COMSUB) && (simple_command->flags & CMD_NO_FORK) && fifos_pending() > 0) ++ simple_command->flags &= ~CMD_NO_FORK; ++ #endif ++ + execute_disk_command (words, simple_command->redirects, command_line, + pipe_in, pipe_out, async, fds_to_close, +*** ../bash-3.2-patched/subst.c Fri Mar 2 16:20:50 2007 +--- subst.c Tue Mar 6 11:40:55 2007 +*************** +*** 4129,4132 **** +--- 4151,4160 ---- + } + ++ int ++ fifos_pending () ++ { ++ return nfifo; ++ } ++ + static char * + make_named_pipe () +*************** +*** 4178,4181 **** +--- 4206,4215 ---- + } + ++ int ++ fifos_pending () ++ { ++ return 0; /* used for cleanup; not needed with /dev/fd */ ++ } ++ + void + unlink_fifo_list () +*************** +*** 4671,4674 **** +--- 4719,4725 ---- + last_command_exit_value = rc; + rc = run_exit_trap (); ++ #if defined (PROCESS_SUBSTITUTION) ++ unlink_fifo_list (); ++ #endif + exit (rc); + } +*** ../bash-3.2-patched/subst.h Tue Sep 19 08:34:41 2006 +--- subst.h Wed Jan 10 09:46:47 2007 +*************** +*** 223,226 **** +--- 223,227 ---- + extern char *pat_subst __P((char *, char *, char *, int)); + ++ extern int fifos_pending __P((void)); + extern void unlink_fifo_list __P((void)); + +*** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 +--- patchlevel.h Mon Oct 16 14:22:54 2006 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 14 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 15 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash32-016 b/bash32-016 new file mode 100644 index 0000000..a0f065a --- /dev/null +++ b/bash32-016 @@ -0,0 +1,52 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 3.2 +Patch-ID: bash32-016 + +Bug-Reported-by: Peter Volkov +Bug-Reference-ID: <1171795523.8021.18.camel@localhost> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-02/msg00054.html + +Bug-Description: + +When moving the cursor, bash sometimes misplaces the cursor when the prompt +contains two or more multibyte characters. The particular circumstance that +uncovered the problem was having the (multibyte) current directory name in +the prompt string. + +Patch: + +*** ../bash-3.2/lib/readline/display.c Fri Jan 19 13:34:50 2007 +--- lib/readline/display.c Sat Mar 10 17:25:44 2007 +*************** +*** 1745,1749 **** + { + dpos = _rl_col_width (data, 0, new); +! if (dpos > prompt_last_invisible) /* XXX - don't use woff here */ + { + dpos -= woff; +--- 1745,1752 ---- + { + dpos = _rl_col_width (data, 0, new); +! /* Use NEW when comparing against the last invisible character in the +! prompt string, since they're both buffer indices and DPOS is a +! desired display position. */ +! if (new > prompt_last_invisible) /* XXX - don't use woff here */ + { + dpos -= woff; +*** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 +--- patchlevel.h Mon Oct 16 14:22:54 2006 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 15 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 16 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash32-017 b/bash32-017 new file mode 100644 index 0000000..99e5e70 --- /dev/null +++ b/bash32-017 @@ -0,0 +1,85 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 3.2 +Patch-ID: bash32-017 + +Bug-Reported-by: Peter Volkov +Bug-Reference-ID: <1173636022.7039.36.camel@localhost> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-03/msg00039.html + +Bug-Description: + +When restoring the original prompt after finishing an incremental search, +bash sometimes places the cursor incorrectly if the primary prompt contains +invisible characters. + +Patch: + +*** ../bash-3.2.16/lib/readline/display.c Fri Apr 20 13:30:16 2007 +--- lib/readline/display.c Fri Apr 20 15:17:01 2007 +*************** +*** 1599,1604 **** + if (temp > 0) + { + _rl_output_some_chars (nfd, temp); +! _rl_last_c_pos += _rl_col_width (nfd, 0, temp);; + } + } +--- 1599,1618 ---- + if (temp > 0) + { ++ /* If nfd begins at the prompt, or before the invisible ++ characters in the prompt, we need to adjust _rl_last_c_pos ++ in a multibyte locale to account for the wrap offset and ++ set cpos_adjusted accordingly. */ + _rl_output_some_chars (nfd, temp); +! if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) +! { +! _rl_last_c_pos += _rl_col_width (nfd, 0, temp); +! if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible)) +! { +! _rl_last_c_pos -= wrap_offset; +! cpos_adjusted = 1; +! } +! } +! else +! _rl_last_c_pos += temp; + } + } +*************** +*** 1608,1613 **** +--- 1622,1639 ---- + if (temp > 0) + { ++ /* If nfd begins at the prompt, or before the invisible ++ characters in the prompt, we need to adjust _rl_last_c_pos ++ in a multibyte locale to account for the wrap offset and ++ set cpos_adjusted accordingly. */ + _rl_output_some_chars (nfd, temp); + _rl_last_c_pos += col_temp; /* XXX */ ++ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) ++ { ++ if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible)) ++ { ++ _rl_last_c_pos -= wrap_offset; ++ cpos_adjusted = 1; ++ } ++ } + } + lendiff = (oe - old) - (ne - new); +*** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 +--- patchlevel.h Mon Oct 16 14:22:54 2006 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 16 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 17 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash32-018 b/bash32-018 new file mode 100644 index 0000000..d729aaf --- /dev/null +++ b/bash32-018 @@ -0,0 +1,98 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 3.2 +Patch-ID: bash32-018 + +Bug-Reported-by: osicka@post.cz +Bug-Reference-ID: <228.177-19682-1132061412-1179356692@post.cz> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-05/msg00061.html + +Bug-Description: + +In certain cases, bash can lose the saved status of a background job, though +it should still be reported by `wait'. Bash can also loop infinitely after +creating and waiting for 4096 jobs. + +Patch: + +*** ../bash-20070510/jobs.c Thu Mar 8 16:05:50 2007 +--- jobs.c Fri May 18 11:40:14 2007 +*************** +*** 784,792 **** + { + old = js.j_firstj++; + while (js.j_firstj != old) + { + if (js.j_firstj >= js.j_jobslots) + js.j_firstj = 0; +! if (jobs[js.j_firstj]) + break; + js.j_firstj++; +--- 784,794 ---- + { + old = js.j_firstj++; ++ if (old >= js.j_jobslots) ++ old = js.j_jobslots - 1; + while (js.j_firstj != old) + { + if (js.j_firstj >= js.j_jobslots) + js.j_firstj = 0; +! if (jobs[js.j_firstj] || js.j_firstj == old) /* needed if old == 0 */ + break; + js.j_firstj++; +*************** +*** 798,806 **** + { + old = js.j_lastj--; + while (js.j_lastj != old) + { + if (js.j_lastj < 0) + js.j_lastj = js.j_jobslots - 1; +! if (jobs[js.j_lastj]) + break; + js.j_lastj--; +--- 800,810 ---- + { + old = js.j_lastj--; ++ if (old < 0) ++ old = 0; + while (js.j_lastj != old) + { + if (js.j_lastj < 0) + js.j_lastj = js.j_jobslots - 1; +! if (jobs[js.j_lastj] || js.j_lastj == old) /* needed if old == js.j_jobslots */ + break; + js.j_lastj--; +*************** +*** 964,968 **** + realloc_jobs_list (); + +! return (js.j_lastj); + } + +--- 975,983 ---- + realloc_jobs_list (); + +! #ifdef DEBUG +! itrace("compact_jobs_list: returning %d", (js.j_lastj || jobs[js.j_lastj]) ? js.j_lastj + 1 : 0); +! #endif +! +! return ((js.j_lastj || jobs[js.j_lastj]) ? js.j_lastj + 1 : 0); + } + +*** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 +--- patchlevel.h Mon Oct 16 14:22:54 2006 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 17 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 18 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash32-019 b/bash32-019 new file mode 100644 index 0000000..647bd1f --- /dev/null +++ b/bash32-019 @@ -0,0 +1,343 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 3.2 +Patch-ID: bash32-019 + +Bug-Reported-by: Thomas Loeber +Bug-Reference-ID: <200703082223.08919.ifp@loeber1.de> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-03/msg00036.html + +Bug-Description: + +When rl_read_key returns -1, indicating that bash's controlling terminal +has been invalidated for some reason (e.g., receiving a SIGHUP), the error +status was not reported correctly to the caller. This could cause input +loops. + +Patch: + +*** ../bash-3.2-patched/lib/readline/complete.c Fri Jul 28 11:35:49 2006 +--- lib/readline/complete.c Tue Mar 13 08:50:16 2007 +*************** +*** 429,433 **** + if (c == 'n' || c == 'N' || c == RUBOUT) + return (0); +! if (c == ABORT_CHAR) + _rl_abort_internal (); + if (for_pager && (c == NEWLINE || c == RETURN)) +--- 440,444 ---- + if (c == 'n' || c == 'N' || c == RUBOUT) + return (0); +! if (c == ABORT_CHAR || c < 0) + _rl_abort_internal (); + if (for_pager && (c == NEWLINE || c == RETURN)) +*** ../bash-3.2-patched/lib/readline/input.c Wed Aug 16 15:15:16 2006 +--- lib/readline/input.c Wed May 2 16:07:59 2007 +*************** +*** 514,518 **** + int size; + { +! int mb_len = 0; + size_t mbchar_bytes_length; + wchar_t wc; +--- 522,526 ---- + int size; + { +! int mb_len, c; + size_t mbchar_bytes_length; + wchar_t wc; +*************** +*** 521,531 **** + memset(&ps, 0, sizeof (mbstate_t)); + memset(&ps_back, 0, sizeof (mbstate_t)); +! + while (mb_len < size) + { + RL_SETSTATE(RL_STATE_MOREINPUT); +! mbchar[mb_len++] = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + + mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps); + if (mbchar_bytes_length == (size_t)(-1)) +--- 529,545 ---- + memset(&ps, 0, sizeof (mbstate_t)); + memset(&ps_back, 0, sizeof (mbstate_t)); +! +! mb_len = 0; + while (mb_len < size) + { + RL_SETSTATE(RL_STATE_MOREINPUT); +! c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + ++ if (c < 0) ++ break; ++ ++ mbchar[mb_len++] = c; ++ + mbchar_bytes_length = mbrtowc (&wc, mbchar, mb_len, &ps); + if (mbchar_bytes_length == (size_t)(-1)) +*************** +*** 565,569 **** + c = first; + memset (mb, 0, mlen); +! for (i = 0; i < mlen; i++) + { + mb[i] = (char)c; +--- 579,583 ---- + c = first; + memset (mb, 0, mlen); +! for (i = 0; c >= 0 && i < mlen; i++) + { + mb[i] = (char)c; +*** ../bash-3.2-patched/lib/readline/isearch.c Mon Dec 26 17:18:53 2005 +--- lib/readline/isearch.c Fri Mar 9 14:30:59 2007 +*************** +*** 328,333 **** + + f = (rl_command_func_t *)NULL; +! +! /* Translate the keys we do something with to opcodes. */ + if (c >= 0 && _rl_keymap[c].type == ISFUNC) + { +--- 328,340 ---- + + f = (rl_command_func_t *)NULL; +! +! if (c < 0) +! { +! cxt->sflags |= SF_FAILED; +! cxt->history_pos = cxt->last_found_line; +! return -1; +! } +! +! /* Translate the keys we do something with to opcodes. */ + if (c >= 0 && _rl_keymap[c].type == ISFUNC) + { +*** ../bash-3.2-patched/lib/readline/misc.c Mon Dec 26 17:20:46 2005 +--- lib/readline/misc.c Fri Mar 9 14:44:11 2007 +*************** +*** 147,150 **** +--- 147,152 ---- + rl_clear_message (); + RL_UNSETSTATE(RL_STATE_NUMERICARG); ++ if (key < 0) ++ return -1; + return (_rl_dispatch (key, _rl_keymap)); + } +*** ../bash-3.2-patched/lib/readline/readline.c Wed Aug 16 15:00:36 2006 +--- lib/readline/readline.c Fri Mar 9 14:47:24 2007 +*************** +*** 646,649 **** +--- 669,677 ---- + { + nkey = _rl_subseq_getchar (cxt->okey); ++ if (nkey < 0) ++ { ++ _rl_abort_internal (); ++ return -1; ++ } + r = _rl_dispatch_subseq (nkey, cxt->dmap, cxt->subseq_arg); + cxt->flags |= KSEQ_DISPATCHED; +*** ../bash-3.2-patched/lib/readline/text.c Fri Jul 28 11:55:27 2006 +--- lib/readline/text.c Sun Mar 25 13:41:38 2007 +*************** +*** 858,861 **** +--- 864,870 ---- + RL_UNSETSTATE(RL_STATE_MOREINPUT); + ++ if (c < 0) ++ return -1; ++ + #if defined (HANDLE_SIGNALS) + if (RL_ISSTATE (RL_STATE_CALLBACK) == 0) +*************** +*** 1521,1524 **** +--- 1530,1536 ---- + mb_len = _rl_read_mbchar (mbchar, MB_LEN_MAX); + ++ if (mb_len <= 0) ++ return -1; ++ + if (count < 0) + return (_rl_char_search_internal (-count, bdir, mbchar, mb_len)); +*************** +*** 1537,1540 **** +--- 1549,1555 ---- + RL_UNSETSTATE(RL_STATE_MOREINPUT); + ++ if (c < 0) ++ return -1; ++ + if (count < 0) + return (_rl_char_search_internal (-count, bdir, c)); +*** ../bash-3.2-patched/lib/readline/vi_mode.c Sat Jul 29 16:42:28 2006 +--- lib/readline/vi_mode.c Fri Mar 9 15:02:11 2007 +*************** +*** 887,890 **** +--- 887,897 ---- + c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); ++ ++ if (c < 0) ++ { ++ *nextkey = 0; ++ return -1; ++ } ++ + *nextkey = c; + +*************** +*** 903,906 **** +--- 910,918 ---- + c = rl_read_key (); /* real command */ + RL_UNSETSTATE(RL_STATE_MOREINPUT); ++ if (c < 0) ++ { ++ *nextkey = 0; ++ return -1; ++ } + *nextkey = c; + } +*************** +*** 1225,1236 **** + _rl_callback_generic_arg *data; + { + #if defined (HANDLE_MULTIBYTE) +! _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX); + #else + RL_SETSTATE(RL_STATE_MOREINPUT); +! _rl_vi_last_search_char = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + #endif + + _rl_callback_func = 0; + _rl_want_redisplay = 1; +--- 1243,1262 ---- + _rl_callback_generic_arg *data; + { ++ int c; + #if defined (HANDLE_MULTIBYTE) +! c = _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX); + #else + RL_SETSTATE(RL_STATE_MOREINPUT); +! c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + #endif + ++ if (c <= 0) ++ return -1; ++ ++ #if !defined (HANDLE_MULTIBYTE) ++ _rl_vi_last_search_char = c; ++ #endif ++ + _rl_callback_func = 0; + _rl_want_redisplay = 1; +*************** +*** 1248,1251 **** +--- 1274,1278 ---- + int count, key; + { ++ int c; + #if defined (HANDLE_MULTIBYTE) + static char *target; +*************** +*** 1294,1302 **** + { + #if defined (HANDLE_MULTIBYTE) +! _rl_vi_last_search_mblen = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX); + #else + RL_SETSTATE(RL_STATE_MOREINPUT); +! _rl_vi_last_search_char = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); + #endif + } +--- 1321,1335 ---- + { + #if defined (HANDLE_MULTIBYTE) +! c = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX); +! if (c <= 0) +! return -1; +! _rl_vi_last_search_mblen = c; + #else + RL_SETSTATE(RL_STATE_MOREINPUT); +! c = rl_read_key (); + RL_UNSETSTATE(RL_STATE_MOREINPUT); ++ if (c < 0) ++ return -1; ++ _rl_vi_last_search_char = c; + #endif + } +*************** +*** 1468,1471 **** +--- 1501,1507 ---- + RL_UNSETSTATE(RL_STATE_MOREINPUT); + ++ if (c < 0) ++ return -1; ++ + #if defined (HANDLE_MULTIBYTE) + if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) +*************** +*** 1486,1489 **** +--- 1522,1528 ---- + _rl_vi_last_replacement = c = _rl_vi_callback_getchar (mb, MB_LEN_MAX); + ++ if (c < 0) ++ return -1; ++ + _rl_callback_func = 0; + _rl_want_redisplay = 1; +*************** +*** 1517,1520 **** +--- 1556,1562 ---- + _rl_vi_last_replacement = c = _rl_vi_callback_getchar (mb, MB_LEN_MAX); + ++ if (c < 0) ++ return -1; ++ + return (_rl_vi_change_char (count, c, mb)); + } +*************** +*** 1651,1655 **** + RL_UNSETSTATE(RL_STATE_MOREINPUT); + +! if (ch < 'a' || ch > 'z') + { + rl_ding (); +--- 1693,1697 ---- + RL_UNSETSTATE(RL_STATE_MOREINPUT); + +! if (ch < 0 || ch < 'a' || ch > 'z') /* make test against 0 explicit */ + { + rl_ding (); +*************** +*** 1703,1707 **** + return 0; + } +! else if (ch < 'a' || ch > 'z') + { + rl_ding (); +--- 1745,1749 ---- + return 0; + } +! else if (ch < 0 || ch < 'a' || ch > 'z') /* make test against 0 explicit */ + { + rl_ding (); +*** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 +--- patchlevel.h Mon Oct 16 14:22:54 2006 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 18 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 19 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash32-020 b/bash32-020 new file mode 100644 index 0000000..8c7e328 --- /dev/null +++ b/bash32-020 @@ -0,0 +1,183 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 3.2 +Patch-ID: bash32-020 + +Bug-Reported-by: Ian A Watson +Bug-Reference-ID: +Bug-Reference-URL: + +Bug-Description: + +In some cases of error processing, a jump back to the top-level processing +loop from a builtin command would leave the shell in an inconsistent state. + +Patch: + +*** ../bash-3.2-patched/sig.c Wed Jan 25 14:57:59 2006 +--- sig.c Sat Mar 10 11:11:30 2007 +*************** +*** 351,354 **** +--- 351,373 ---- + #undef XHANDLER + ++ /* Run some of the cleanups that should be performed when we run ++ jump_to_top_level from a builtin command context. XXX - might want to ++ also call reset_parser here. */ ++ void ++ top_level_cleanup () ++ { ++ /* Clean up string parser environment. */ ++ while (parse_and_execute_level) ++ parse_and_execute_cleanup (); ++ ++ #if defined (PROCESS_SUBSTITUTION) ++ unlink_fifo_list (); ++ #endif /* PROCESS_SUBSTITUTION */ ++ ++ run_unwind_protects (); ++ loop_level = continuing = breaking = 0; ++ return_catch_flag = 0; ++ } ++ + /* What to do when we've been interrupted, and it is safe to handle it. */ + void +*** ../bash-3.2-patched/sig.h Wed Jan 25 14:50:27 2006 +--- sig.h Sat Mar 10 11:14:18 2007 +*************** +*** 122,125 **** +--- 122,126 ---- + extern void initialize_terminating_signals __P((void)); + extern void reset_terminating_signals __P((void)); ++ extern void top_level_cleanup __P((void)); + extern void throw_to_top_level __P((void)); + extern void jump_to_top_level __P((int)) __attribute__((__noreturn__)); +*** ../bash-3.2-patched/builtins/common.c Tue Apr 3 16:47:13 2007 +--- builtins/common.c Mon Apr 30 15:01:33 2007 +*************** +*** 132,135 **** +--- 132,136 ---- + { + builtin_error (_("too many arguments")); ++ top_level_cleanup (); + jump_to_top_level (DISCARD); + } +*************** +*** 396,400 **** + throw_to_top_level (); + else +! jump_to_top_level (DISCARD); + } + no_args (list->next); +--- 410,417 ---- + throw_to_top_level (); + else +! { +! top_level_cleanup (); +! jump_to_top_level (DISCARD); +! } + } + no_args (list->next); +*** ../bash-3.2-patched/subst.c Tue Apr 3 16:47:19 2007 +--- subst.c Tue Jul 17 09:45:11 2007 +*************** +*** 1279,1283 **** + if (no_longjmp_on_fatal_error == 0) + { /* { */ +! report_error ("bad substitution: no closing `%s' in %s", "}", string); + last_command_exit_value = EXECUTION_FAILURE; + exp_jump_to_top_level (DISCARD); +--- 1290,1294 ---- + if (no_longjmp_on_fatal_error == 0) + { /* { */ +! report_error (_("bad substitution: no closing `%s' in %s"), "}", string); + last_command_exit_value = EXECUTION_FAILURE; + exp_jump_to_top_level (DISCARD); +*************** +*** 7662,7665 **** +--- 7706,7711 ---- + expand_no_split_dollar_star = 0; /* XXX */ + expanding_redir = 0; ++ ++ top_level_cleanup (); /* from sig.c */ + + jump_to_top_level (v); +*************** +*** 7880,7884 **** + { + report_error (_("no match: %s"), tlist->word->word); +! jump_to_top_level (DISCARD); + } + else if (allow_null_glob_expansion == 0) +--- 7927,7931 ---- + { + report_error (_("no match: %s"), tlist->word->word); +! exp_jump_to_top_level (DISCARD); + } + else if (allow_null_glob_expansion == 0) +*** ../bash-3.2-patched/arrayfunc.c Thu Jul 27 09:37:59 2006 +--- arrayfunc.c Thu May 31 11:55:46 2007 +*************** +*** 619,622 **** +--- 619,624 ---- + { + last_command_exit_value = EXECUTION_FAILURE; ++ ++ top_level_cleanup (); + jump_to_top_level (DISCARD); + } +*** ../bash-3.2-patched/expr.c Wed Dec 28 17:47:03 2005 +--- expr.c Tue Apr 24 14:17:59 2007 +*************** +*** 930,933 **** +--- 930,934 ---- + { + expr_unwind (); ++ top_level_cleanup (); + jump_to_top_level (DISCARD); + } +*** ../bash-3.2-patched/variables.c Fri Sep 8 13:33:32 2006 +--- variables.c Tue Jul 17 09:54:59 2007 +*************** +*** 1822,1830 **** + lval = evalexp (oval, &expok); /* ksh93 seems to do this */ + if (expok == 0) +! jump_to_top_level (DISCARD); + } + rval = evalexp (value, &expok); + if (expok == 0) +! jump_to_top_level (DISCARD); + if (flags & ASS_APPEND) + rval += lval; +--- 1855,1869 ---- + lval = evalexp (oval, &expok); /* ksh93 seems to do this */ + if (expok == 0) +! { +! top_level_cleanup (); +! jump_to_top_level (DISCARD); +! } + } + rval = evalexp (value, &expok); + if (expok == 0) +! { +! top_level_cleanup (); +! jump_to_top_level (DISCARD); +! } + if (flags & ASS_APPEND) + rval += lval; +*** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 +--- patchlevel.h Mon Oct 16 14:22:54 2006 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 19 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 20 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash32-021 b/bash32-021 new file mode 100644 index 0000000..003489c --- /dev/null +++ b/bash32-021 @@ -0,0 +1,72 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 3.2 +Patch-ID: bash32-021 + +Bug-Reported-by: BAGSHAW Paul RD-TECH-REN +Bug-Reference-ID: <941BA0BF46DB8F4983FF7C8AFE800BC205EA7D4B@ftrdmel3.rd.francetelecom.fr> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-03/msg00065.html + +Bug-Description: + +When the parser read a backslash-escaped character that would be treated +internally as an escape, it would double the number of escape characters. + +Patch: + +*** ../bash-3.2-patched/parse.y Mon Oct 30 17:22:00 2006 +--- parse.y Sat Mar 24 17:13:20 2007 +*************** +*** 3377,3381 **** + { + pass_next_character = 0; +! goto got_character; + } + +--- 3377,3381 ---- + { + pass_next_character = 0; +! goto got_escaped_character; + } + +*************** +*** 3651,3660 **** + got_character: + +- all_digit_token &= DIGIT (character); +- dollar_present |= character == '$'; +- + if (character == CTLESC || character == CTLNUL) + token[token_index++] = CTLESC; + + token[token_index++] = character; + +--- 3651,3662 ---- + got_character: + + if (character == CTLESC || character == CTLNUL) + token[token_index++] = CTLESC; + ++ got_escaped_character: ++ ++ all_digit_token &= DIGIT (character); ++ dollar_present |= character == '$'; ++ + token[token_index++] = character; + +*** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 +--- patchlevel.h Mon Oct 16 14:22:54 2006 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 20 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 21 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash32-022 b/bash32-022 new file mode 100644 index 0000000..d3679e6 --- /dev/null +++ b/bash32-022 @@ -0,0 +1,126 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 3.2 +Patch-ID: bash32-022 + +Bug-Reported-by: Chet Ramey +Bug-Reference-ID: +Bug-Reference-URL: + +Bug-Description: + +POSIX specifies that the `read' builtin invoked from an interative shell +must prompt with $PS2 when a line is continued using a backslash while +reading from a terminal. + +Patch: + +*** ../bash-3.2-patched/builtins/read.def Tue Sep 19 08:45:48 2006 +--- builtins/read.def Thu May 24 16:03:30 2007 +*************** +*** 128,133 **** + { + register char *varname; +! int size, i, nr, pass_next, saw_escape, eof, opt, retval, code; +! int input_is_tty, input_is_pipe, unbuffered_read; + int raw, edit, nchars, silent, have_timeout, fd; + unsigned int tmout; +--- 131,136 ---- + { + register char *varname; +! int size, i, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2; +! int input_is_tty, input_is_pipe, unbuffered_read, skip_ctlesc, skip_ctlnul; + int raw, edit, nchars, silent, have_timeout, fd; + unsigned int tmout; +*************** +*** 135,139 **** + char c; + char *input_string, *orig_input_string, *ifs_chars, *prompt, *arrayname; +! char *e, *t, *t1; + struct stat tsb; + SHELL_VAR *var; +--- 138,142 ---- + char c; + char *input_string, *orig_input_string, *ifs_chars, *prompt, *arrayname; +! char *e, *t, *t1, *ps2; + struct stat tsb; + SHELL_VAR *var; +*************** +*** 149,152 **** +--- 152,156 ---- + USE_VAR(i); + USE_VAR(pass_next); ++ USE_VAR(print_ps2); + USE_VAR(saw_escape); + USE_VAR(input_is_pipe); +*************** +*** 164,167 **** +--- 168,172 ---- + #endif + USE_VAR(list); ++ USE_VAR(ps2); + + i = 0; /* Index into the string that we are reading. */ +*************** +*** 387,391 **** + #endif + +! for (eof = retval = 0;;) + { + #if defined (READLINE) +--- 394,399 ---- + #endif + +! ps2 = 0; +! for (print_ps2 = eof = retval = 0;;) + { + #if defined (READLINE) +*************** +*** 413,416 **** +--- 421,433 ---- + #endif + ++ if (print_ps2) ++ { ++ if (ps2 == 0) ++ ps2 = get_string_value ("PS2"); ++ fprintf (stderr, "%s", ps2 ? ps2 : ""); ++ fflush (stderr); ++ print_ps2 = 0; ++ } ++ + if (unbuffered_read) + retval = zread (fd, &c, 1); +*************** +*** 441,445 **** + pass_next = 0; + if (c == '\n') +! i--; /* back up over the CTLESC */ + else + goto add_char; +--- 458,466 ---- + pass_next = 0; + if (c == '\n') +! { +! i--; /* back up over the CTLESC */ +! if (interactive && input_is_tty && raw == 0) +! print_ps2 = 1; +! } + else + goto add_char; +*** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 +--- patchlevel.h Mon Oct 16 14:22:54 2006 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 21 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 22 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash32-023 b/bash32-023 new file mode 100644 index 0000000..34a6394 --- /dev/null +++ b/bash32-023 @@ -0,0 +1,51 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 3.2 +Patch-ID: bash32-023 + +Bug-Reported-by: Chet Ramey +Bug-Reference-ID: +Bug-Reference-URL: + +Bug-Description: + +When an error occurs during the pattern removal word expansion, the shell +can free unallocated memory or free memory multiple times. + +Patch: + +*** ../bash-3.2-patched/subst.c Tue Apr 3 16:47:19 2007 +--- subst.c Tue Jul 17 09:45:11 2007 +*************** +*** 3975,3979 **** + patstr++; + +! pattern = getpattern (patstr, quoted, 1); + + temp1 = (char *)NULL; /* shut up gcc */ +--- 4008,4016 ---- + patstr++; + +! /* Need to pass getpattern newly-allocated memory in case of expansion -- +! the expansion code will free the passed string on an error. */ +! temp1 = savestring (patstr); +! pattern = getpattern (temp1, quoted, 1); +! free (temp1); + + temp1 = (char *)NULL; /* shut up gcc */ +*** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 +--- patchlevel.h Mon Oct 16 14:22:54 2006 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 22 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 23 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash32-024 b/bash32-024 new file mode 100644 index 0000000..1575f37 --- /dev/null +++ b/bash32-024 @@ -0,0 +1,77 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 3.2 +Patch-ID: bash32-024 + +Bug-Reported-by: Peter Volkov +Bug-Reference-ID: <1178376645.9063.25.camel@localhost> +Bug-Reference-URL: http://bugs.gentoo.org/177095 + +Bug-Description: + +The readline display code miscalculated the screen position when performing +a redisplay in which the new text occupies more screen space that the old, +but takes fewer bytes to do so (e.g., when replacing a shorter string +containing multibyte characters with a longer one containing only ASCII). + +Patch: + +*** ../bash-3.2-patched/lib/readline/display.c Thu Apr 26 11:38:22 2007 +--- lib/readline/display.c Thu Jul 12 23:10:10 2007 +*************** +*** 1519,1527 **** + /* Non-zero if we're increasing the number of lines. */ + int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin; + /* Sometimes it is cheaper to print the characters rather than + use the terminal's capabilities. If we're growing the number + of lines, make sure we actually cause the new line to wrap + around on auto-wrapping terminals. */ +! if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl)) + { + /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and +--- 1568,1596 ---- + /* Non-zero if we're increasing the number of lines. */ + int gl = current_line >= _rl_vis_botlin && inv_botlin > _rl_vis_botlin; ++ /* If col_lendiff is > 0, implying that the new string takes up more ++ screen real estate than the old, but lendiff is < 0, meaning that it ++ takes fewer bytes, we need to just output the characters starting ++ from the first difference. These will overwrite what is on the ++ display, so there's no reason to do a smart update. This can really ++ only happen in a multibyte environment. */ ++ if (lendiff < 0) ++ { ++ _rl_output_some_chars (nfd, temp); ++ _rl_last_c_pos += _rl_col_width (nfd, 0, temp); ++ /* If nfd begins before any invisible characters in the prompt, ++ adjust _rl_last_c_pos to account for wrap_offset and set ++ cpos_adjusted to let the caller know. */ ++ if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible)) ++ { ++ _rl_last_c_pos -= wrap_offset; ++ cpos_adjusted = 1; ++ } ++ return; ++ } + /* Sometimes it is cheaper to print the characters rather than + use the terminal's capabilities. If we're growing the number + of lines, make sure we actually cause the new line to wrap + around on auto-wrapping terminals. */ +! else if (_rl_terminal_can_insert && ((2 * col_temp) >= col_lendiff || _rl_term_IC) && (!_rl_term_autowrap || !gl)) + { + /* If lendiff > prompt_visible_length and _rl_last_c_pos == 0 and +*** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 +--- patchlevel.h Mon Oct 16 14:22:54 2006 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 23 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 24 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash32-025 b/bash32-025 new file mode 100644 index 0000000..4d53d89 --- /dev/null +++ b/bash32-025 @@ -0,0 +1,79 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 3.2 +Patch-ID: bash32-025 + +Bug-Reported-by: Tom Bjorkholm +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-readline/2007-04/msg00004.html + +Bug-Description: + +An off-by-one error in readline's input buffering caused readline to drop +each 511th character of buffered input (e.g., when pasting a large amount +of data into a terminal window). + +Patch: + +*** ../bash-3.2-patched/lib/readline/input.c Wed Aug 16 15:15:16 2006 +--- lib/readline/input.c Tue Jul 17 09:24:21 2007 +*************** +*** 134,139 **** + + *key = ibuffer[pop_index++]; +! + if (pop_index >= ibuffer_len) + pop_index = 0; + +--- 134,142 ---- + + *key = ibuffer[pop_index++]; +! #if 0 + if (pop_index >= ibuffer_len) ++ #else ++ if (pop_index > ibuffer_len) ++ #endif + pop_index = 0; + +*************** +*** 251,255 **** + { + k = (*rl_getc_function) (rl_instream); +! rl_stuff_char (k); + if (k == NEWLINE || k == RETURN) + break; +--- 254,259 ---- + { + k = (*rl_getc_function) (rl_instream); +! if (rl_stuff_char (k) == 0) +! break; /* some problem; no more room */ + if (k == NEWLINE || k == RETURN) + break; +*************** +*** 374,378 **** +--- 378,386 ---- + } + ibuffer[push_index++] = key; ++ #if 0 + if (push_index >= ibuffer_len) ++ #else ++ if (push_index > ibuffer_len) ++ #endif + push_index = 0; + +*** ../bash-3.2/patchlevel.h Thu Apr 13 08:31:04 2006 +--- patchlevel.h Mon Oct 16 14:22:54 2006 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 24 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 25 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/readline-5.2-inv.patch b/readline-5.2-inv.patch new file mode 100644 index 0000000..a98c679 --- /dev/null +++ b/readline-5.2-inv.patch @@ -0,0 +1,15 @@ +fix cursor position when prompt has one invisible character (#358231) + +Written-by: Miroslav Lichvar + +--- bash-3.2/lib/readline/display.c.inv 2007-10-31 17:14:31.000000000 +0100 ++++ bash-3.2/lib/readline/display.c 2007-10-31 17:15:00.000000000 +0100 +@@ -943,7 +943,7 @@ rl_redisplay () + cpos_adjusted == 0 && + _rl_last_c_pos != o_cpos && + _rl_last_c_pos > wrap_offset && +- o_cpos < prompt_last_invisible) ++ o_cpos <= prompt_last_invisible) + _rl_last_c_pos -= wrap_offset; + + /* If this is the line with the prompt, we might need to