From 1680d49ad0b275b427a7297e1f785f6a5d177113 Mon Sep 17 00:00:00 2001 From: Roman Rakus Date: Tue, 1 Mar 2011 14:08:25 +0100 Subject: [PATCH] Patchlevel 5, some fixes in old patches, some cleanup Signed-off-by: Roman Rakus --- bash-4.2-coverity.patch | 99 +++++++++++++ bash.spec | 69 +++++---- bash42-001 | 78 ++++++++++ bash42-002 | 60 ++++++++ bash42-003 | 318 ++++++++++++++++++++++++++++++++++++++++ bash42-004 | 53 +++++++ bash42-005 | 131 +++++++++++++++++ 7 files changed, 779 insertions(+), 29 deletions(-) create mode 100644 bash-4.2-coverity.patch create mode 100644 bash42-001 create mode 100644 bash42-002 create mode 100644 bash42-003 create mode 100644 bash42-004 create mode 100644 bash42-005 diff --git a/bash-4.2-coverity.patch b/bash-4.2-coverity.patch new file mode 100644 index 0000000..5fc8456 --- /dev/null +++ b/bash-4.2-coverity.patch @@ -0,0 +1,99 @@ +diff -up bash-4.2/execute_cmd.c.coverity bash-4.2/execute_cmd.c +--- bash-4.2/execute_cmd.c.coverity 2011-02-24 13:04:35.000000000 +0100 ++++ bash-4.2/execute_cmd.c 2011-02-24 13:49:13.000000000 +0100 +@@ -5036,7 +5036,7 @@ shell_execve (command, args, env) + Elf32_Ehdr ehdr; + Elf32_Phdr *phdr; + Elf32_Shdr *shdr; +- int nphdr, nshdr; ++ Elf32_Half nphdr, nshdr; + + /* We have to copy the data since the sample buffer + might not be aligned correctly to be accessed as +@@ -5044,12 +5044,12 @@ shell_execve (command, args, env) + memcpy (&ehdr, sample, sizeof (Elf32_Ehdr)); + + nshdr = ehdr.e_shnum; +- shdr = (Elf32_Shdr *) malloc (nshdr * ehdr.e_shentsize); ++ shdr = (Elf32_Shdr *) malloc ((size_t)nshdr * (size_t)ehdr.e_shentsize); + + if (shdr != NULL) + { + #ifdef HAVE_PREAD +- sample_len = pread (fd, shdr, nshdr * ehdr.e_shentsize, ++ sample_len = pread (fd, shdr, (size_t)nshdr * (size_t)ehdr.e_shentsize, + ehdr.e_shoff); + #else + if (lseek (fd, ehdr.e_shoff, SEEK_SET) != -1) +@@ -5091,11 +5091,11 @@ shell_execve (command, args, env) + } + + nphdr = ehdr.e_phnum; +- phdr = (Elf32_Phdr *) malloc (nphdr * ehdr.e_phentsize); ++ phdr = (Elf32_Phdr *) malloc ((size_t)nphdr * (size_t)ehdr.e_phentsize); + if (phdr != NULL) + { + #ifdef HAVE_PREAD +- sample_len = pread (fd, phdr, nphdr * ehdr.e_phentsize, ++ sample_len = pread (fd, phdr, (size_t)nphdr * (size_t)ehdr.e_phentsize, + ehdr.e_phoff); + #else + if (lseek (fd, ehdr.e_phoff, SEEK_SET) != -1) +@@ -5120,7 +5120,7 @@ shell_execve (command, args, env) + Elf64_Ehdr ehdr; + Elf64_Phdr *phdr; + Elf64_Shdr *shdr; +- int nphdr, nshdr; ++ Elf32_Half nphdr, nshdr; + + /* We have to copy the data since the sample buffer + might not be aligned correctly to be accessed as +@@ -5128,11 +5128,11 @@ shell_execve (command, args, env) + memcpy (&ehdr, sample, sizeof (Elf64_Ehdr)); + + nshdr = ehdr.e_shnum; +- shdr = (Elf64_Shdr *) malloc (nshdr * ehdr.e_shentsize); ++ shdr = (Elf64_Shdr *) malloc ((size_t)nshdr * (size_t)ehdr.e_shentsize); + if (shdr != NULL) + { + #ifdef HAVE_PREAD +- sample_len = pread (fd, shdr, nshdr * ehdr.e_shentsize, ++ sample_len = pread (fd, shdr, (size_t)nshdr * (size_t)ehdr.e_shentsize, + ehdr.e_shoff); + #else + if (lseek (fd, ehdr.e_shoff, SEEK_SET) != -1) +@@ -5174,11 +5174,11 @@ shell_execve (command, args, env) + } + + nphdr = ehdr.e_phnum; +- phdr = (Elf64_Phdr *) malloc (nphdr * ehdr.e_phentsize); ++ phdr = (Elf64_Phdr *) malloc ((size_t)nphdr * (size_t)ehdr.e_phentsize); + if (phdr != NULL) + { + #ifdef HAVE_PREAD +- sample_len = pread (fd, phdr, nphdr * ehdr.e_phentsize, ++ sample_len = pread (fd, phdr, (size_t)nphdr * (size_t)ehdr.e_phentsize, + ehdr.e_phoff); + #else + if (lseek (fd, ehdr.e_phoff, SEEK_SET) != -1) +@@ -5200,8 +5200,8 @@ shell_execve (command, args, env) + + if (offset != -1) + { +- size_t maxlen = 0; +- size_t actlen = 0; ++ ssize_t maxlen = 0; ++ ssize_t actlen = 0; + char *interp = NULL; + + do +@@ -5250,7 +5250,8 @@ shell_execve (command, args, env) + } + #endif + #if defined (HAVE_HASH_BANG_EXEC) || defined (HAVE_ELF_H) +- close (fd); ++ if (fd >= 0) ++ close (fd); + #endif + errno = i; + file_error (command); diff --git a/bash.spec b/bash.spec index b41373d..242eac9 100644 --- a/bash.spec +++ b/bash.spec @@ -1,12 +1,12 @@ #% define beta_tag rc2 -%define patchleveltag .0 +%define patchleveltag .5 %define baseversion 4.2 %bcond_without tests Version: %{baseversion}%{patchleveltag} Name: bash Summary: The GNU Bourne Again shell -Release: 2%{?dist} +Release: 1%{?dist} Group: System Environment/Shells License: GPLv3+ Url: http://www.gnu.org/software/bash @@ -20,7 +20,11 @@ Source2: dot-bash_profile Source3: dot-bash_logout # Official upstream patches -# none yet +Patch001: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.2-patches/bash42-001 +Patch002: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.2-patches/bash42-002 +Patch003: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.2-patches/bash42-003 +Patch004: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.2-patches/bash42-004 +Patch005: ftp://ftp.gnu.org/pub/gnu/bash/bash-4.2-patches/bash42-005 # Other patches Patch101: bash-2.02-security.patch @@ -33,30 +37,28 @@ Patch107: bash-2.05b-pgrp_sync.patch Patch108: bash-2.05b-readline-oom.patch Patch109: bash-2.05b-xcc.patch Patch110: bash-3.2-audit.patch -Patch112: bash-3.2-ssh_source_bash.patch -Patch113: bash-bashbug.patch -Patch115: bash-infotags.patch -Patch116: bash-requires.patch -Patch117: bash-setlocale.patch -Patch118: bash-tty-tests.patch - +Patch111: bash-3.2-ssh_source_bash.patch +Patch112: bash-bashbug.patch +Patch113: bash-infotags.patch +Patch114: bash-requires.patch +Patch115: bash-setlocale.patch +Patch116: bash-tty-tests.patch # 484809, check if interp section is NOBITS -Patch123: bash-4.0-nobits.patch +Patch117: bash-4.0-nobits.patch # Do the same CFLAGS in generated Makefile in examples -Patch124: bash-4.1-examples.patch +Patch118: bash-4.1-examples.patch # Builtins like echo and printf won't report errors # when output does not succeed due to EPIPE -Patch126: bash-4.1-broken_pipe.patch +Patch119: bash-4.1-broken_pipe.patch # Enable system-wide .bash_logout for login shells -Patch127: bash-4.2-rc2-logout.patch +Patch120: bash-4.2-rc2-logout.patch -# Patch from upstream, some pattern matching glitch -# See http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00136.html -Patch128: patmatch.patch +# Static analyzis shows some issues in bash-2.05a-interpreter.patch +Patch121: bash-4.2-coverity.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -85,7 +87,11 @@ This package contains documentation files for %{name}. %setup -q -n %{name}-%{baseversion} # Official upstream patches -# none yet +%patch001 -p0 -b .001 +%patch002 -p0 -b .002 +%patch003 -p0 -b .003 +%patch004 -p0 -b .004 +%patch005 -p0 -b .005 # Other patches %patch101 -p1 -b .security @@ -98,17 +104,17 @@ This package contains documentation files for %{name}. %patch108 -p1 -b .readline_oom %patch109 -p1 -b .xcc %patch110 -p1 -b .audit -%patch112 -p1 -b .ssh_source_bash -%patch113 -p1 -b .bashbug -%patch115 -p1 -b .infotags -%patch116 -p1 -b .requires -%patch117 -p1 -b .setlocale -%patch118 -p1 -b .tty_tests -%patch123 -p1 -b .nobits -%patch124 -p1 -b .examples -%patch126 -p1 -b .broken_pipe -%patch127 -p1 -b .logout -%patch128 -p0 -b .patmatch +%patch111 -p1 -b .ssh_source_bash +%patch112 -p1 -b .bashbug +%patch113 -p1 -b .infotags +%patch114 -p1 -b .requires +%patch115 -p1 -b .setlocale +%patch116 -p1 -b .tty_tests +%patch117 -p1 -b .nobits +%patch118 -p1 -b .examples +%patch119 -p1 -b .broken_pipe +%patch120 -p1 -b .logout +%patch121 -p1 -b .coverity echo %{version} > _distribution echo %{release} > _patchlevel @@ -287,6 +293,11 @@ fi #%doc doc/*.ps doc/*.0 doc/*.html doc/article.txt %changelog +* Tue Mar 01 2011 Roman Rakus - 4.2.5-1 +- Patchlevel 5 +- Static analyzis show some issues in some patches +- Some cleanup + * Wed Feb 16 2011 Roman Rakus - 4.2.0-2 - pattern matching glitch, patch from upstream diff --git a/bash42-001 b/bash42-001 new file mode 100644 index 0000000..547aaa0 --- /dev/null +++ b/bash42-001 @@ -0,0 +1,78 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-001 + +Bug-Reported-by: Juergen Daubert +Bug-Reference-ID: <20110214175132.GA19813@jue.netz> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00125.html + +Bug-Description: + +When running in Posix mode, bash does not correctly expand the right-hand +side of a double-quoted word expansion containing single quotes. + +Patch (apply with `patch -p0'): + +*** ../bash-4.2-patched/subst.c 2011-01-02 16:12:51.000000000 -0500 +--- subst.c 2011-02-19 00:00:00.000000000 -0500 +*************** +*** 1380,1387 **** + + /* The handling of dolbrace_state needs to agree with the code in parse.y: +! parse_matched_pair() */ +! dolbrace_state = 0; +! if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) +! dolbrace_state = (flags & SX_POSIXEXP) ? DOLBRACE_QUOTE : DOLBRACE_PARAM; + + i = *sindex; +--- 1380,1389 ---- + + /* The handling of dolbrace_state needs to agree with the code in parse.y: +! parse_matched_pair(). The different initial value is to handle the +! case where this function is called to parse the word in +! ${param op word} (SX_WORD). */ +! dolbrace_state = (flags & SX_WORD) ? DOLBRACE_WORD : DOLBRACE_PARAM; +! if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && (flags & SX_POSIXEXP)) +! dolbrace_state = DOLBRACE_QUOTE; + + i = *sindex; +*************** +*** 7177,7181 **** + /* Extract the contents of the ${ ... } expansion + according to the Posix.2 rules. */ +! value = extract_dollar_brace_string (string, &sindex, quoted, (c == '%' || c == '#') ? SX_POSIXEXP : 0); + if (string[sindex] == RBRACE) + sindex++; +--- 7181,7185 ---- + /* Extract the contents of the ${ ... } expansion + according to the Posix.2 rules. */ +! value = extract_dollar_brace_string (string, &sindex, quoted, (c == '%' || c == '#' || c =='/' || c == '^' || c == ',' || c ==':') ? SX_POSIXEXP|SX_WORD : SX_WORD); + if (string[sindex] == RBRACE) + sindex++; +*** ../bash-4.2-patched/subst.h 2010-12-02 20:21:29.000000000 -0500 +--- subst.h 2011-02-16 21:12:09.000000000 -0500 +*************** +*** 57,60 **** +--- 57,61 ---- + #define SX_ARITHSUB 0x0080 /* extracting $(( ... )) (currently unused) */ + #define SX_POSIXEXP 0x0100 /* extracting new Posix pattern removal expansions in extract_dollar_brace_string */ ++ #define SX_WORD 0x0200 /* extracting word in ${param op word} */ + + /* Remove backslashes which are quoting backquotes from STRING. Modifies +*** ../bash-4.2-patched/patchlevel.h Sat Jun 12 20:14:48 2010 +--- patchlevel.h Thu Feb 24 21:41:34 2011 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 0 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 1 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash42-002 b/bash42-002 new file mode 100644 index 0000000..077c7e0 --- /dev/null +++ b/bash42-002 @@ -0,0 +1,60 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-002 + +Bug-Reported-by: Clark J. Wang +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00157.html + +Bug-Description: + +The readline vi-mode `cc', `dd', and `yy' commands failed to modify the +entire line. + +Patch (apply with `patch -p0'): + +*** ../bash-4.2-patched/lib/readline/vi_mode.c 2010-11-20 19:51:39.000000000 -0500 +--- lib/readline/vi_mode.c 2011-02-17 20:24:25.000000000 -0500 +*************** +*** 1115,1119 **** + _rl_vi_last_motion = c; + RL_UNSETSTATE (RL_STATE_VIMOTION); +! return (0); + } + #if defined (READLINE_CALLBACKS) +--- 1115,1119 ---- + _rl_vi_last_motion = c; + RL_UNSETSTATE (RL_STATE_VIMOTION); +! return (vidomove_dispatch (m)); + } + #if defined (READLINE_CALLBACKS) +*** ../bash-4.2-patched/lib/readline/callback.c 2010-06-06 12:18:58.000000000 -0400 +--- lib/readline/callback.c 2011-02-17 20:43:28.000000000 -0500 +*************** +*** 149,152 **** +--- 149,155 ---- + /* Should handle everything, including cleanup, numeric arguments, + and turning off RL_STATE_VIMOTION */ ++ if (RL_ISSTATE (RL_STATE_NUMERICARG) == 0) ++ _rl_internal_char_cleanup (); ++ + return; + } +*** ../bash-4.2-patched/patchlevel.h Sat Jun 12 20:14:48 2010 +--- patchlevel.h Thu Feb 24 21:41:34 2011 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 1 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 2 + + #endif /* _PATCHLEVEL_H_ */ + diff --git a/bash42-003 b/bash42-003 new file mode 100644 index 0000000..c488e96 --- /dev/null +++ b/bash42-003 @@ -0,0 +1,318 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-003 + +Bug-Reported-by: Clark J. Wang +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00136.html + +Bug-Description: + +When using the pattern replacement and pattern removal word expansions, bash +miscalculates the possible match length in the presence of an unescaped left +bracket without a closing right bracket, resulting in a failure to match +the pattern. + +Patch (apply with `patch -p0'): + +*** ../bash-4.2-patched/lib/glob/gmisc.c 2011-02-05 16:11:17.000000000 -0500 +--- lib/glob/gmisc.c 2011-02-18 23:53:42.000000000 -0500 +*************** +*** 78,83 **** + size_t wmax; + { +! wchar_t wc, *wbrack; +! int matlen, t, in_cclass, in_collsym, in_equiv; + + if (*wpat == 0) +--- 78,83 ---- + size_t wmax; + { +! wchar_t wc; +! int matlen, bracklen, t, in_cclass, in_collsym, in_equiv; + + if (*wpat == 0) +*************** +*** 119,123 **** + case L'[': + /* scan for ending `]', skipping over embedded [:...:] */ +! wbrack = wpat; + wc = *wpat++; + do +--- 119,123 ---- + case L'[': + /* scan for ending `]', skipping over embedded [:...:] */ +! bracklen = 1; + wc = *wpat++; + do +*************** +*** 125,140 **** + if (wc == 0) + { +! matlen += wpat - wbrack - 1; /* incremented below */ +! break; + } + else if (wc == L'\\') + { +! wc = *wpat++; +! if (*wpat == 0) +! break; + } + else if (wc == L'[' && *wpat == L':') /* character class */ + { + wpat++; + in_cclass = 1; + } +--- 125,148 ---- + if (wc == 0) + { +! wpat--; /* back up to NUL */ +! matlen += bracklen; +! goto bad_bracket; + } + else if (wc == L'\\') + { +! /* *wpat == backslash-escaped character */ +! bracklen++; +! /* If the backslash or backslash-escape ends the string, +! bail. The ++wpat skips over the backslash escape */ +! if (*wpat == 0 || *++wpat == 0) +! { +! matlen += bracklen; +! goto bad_bracket; +! } + } + else if (wc == L'[' && *wpat == L':') /* character class */ + { + wpat++; ++ bracklen++; + in_cclass = 1; + } +*************** +*** 142,145 **** +--- 150,154 ---- + { + wpat++; ++ bracklen++; + in_cclass = 0; + } +*************** +*** 147,152 **** + { + wpat++; + if (*wpat == L']') /* right bracket can appear as collating symbol */ +! wpat++; + in_collsym = 1; + } +--- 156,165 ---- + { + wpat++; ++ bracklen++; + if (*wpat == L']') /* right bracket can appear as collating symbol */ +! { +! wpat++; +! bracklen++; +! } + in_collsym = 1; + } +*************** +*** 154,157 **** +--- 167,171 ---- + { + wpat++; ++ bracklen++; + in_collsym = 0; + } +*************** +*** 159,164 **** + { + wpat++; + if (*wpat == L']') /* right bracket can appear as equivalence class */ +! wpat++; + in_equiv = 1; + } +--- 173,182 ---- + { + wpat++; ++ bracklen++; + if (*wpat == L']') /* right bracket can appear as equivalence class */ +! { +! wpat++; +! bracklen++; +! } + in_equiv = 1; + } +*************** +*** 166,174 **** +--- 184,196 ---- + { + wpat++; ++ bracklen++; + in_equiv = 0; + } ++ else ++ bracklen++; + } + while ((wc = *wpat++) != L']'); + matlen++; /* bracket expression can only match one char */ ++ bad_bracket: + break; + } +*************** +*** 214,219 **** + size_t max; + { +! char c, *brack; +! int matlen, t, in_cclass, in_collsym, in_equiv; + + if (*pat == 0) +--- 236,241 ---- + size_t max; + { +! char c; +! int matlen, bracklen, t, in_cclass, in_collsym, in_equiv; + + if (*pat == 0) +*************** +*** 255,259 **** + case '[': + /* scan for ending `]', skipping over embedded [:...:] */ +! brack = pat; + c = *pat++; + do +--- 277,281 ---- + case '[': + /* scan for ending `]', skipping over embedded [:...:] */ +! bracklen = 1; + c = *pat++; + do +*************** +*** 261,276 **** + if (c == 0) + { +! matlen += pat - brack - 1; /* incremented below */ +! break; + } + else if (c == '\\') + { +! c = *pat++; +! if (*pat == 0) +! break; + } + else if (c == '[' && *pat == ':') /* character class */ + { + pat++; + in_cclass = 1; + } +--- 283,306 ---- + if (c == 0) + { +! pat--; /* back up to NUL */ +! matlen += bracklen; +! goto bad_bracket; + } + else if (c == '\\') + { +! /* *pat == backslash-escaped character */ +! bracklen++; +! /* If the backslash or backslash-escape ends the string, +! bail. The ++pat skips over the backslash escape */ +! if (*pat == 0 || *++pat == 0) +! { +! matlen += bracklen; +! goto bad_bracket; +! } + } + else if (c == '[' && *pat == ':') /* character class */ + { + pat++; ++ bracklen++; + in_cclass = 1; + } +*************** +*** 278,281 **** +--- 308,312 ---- + { + pat++; ++ bracklen++; + in_cclass = 0; + } +*************** +*** 283,288 **** + { + pat++; + if (*pat == ']') /* right bracket can appear as collating symbol */ +! pat++; + in_collsym = 1; + } +--- 314,323 ---- + { + pat++; ++ bracklen++; + if (*pat == ']') /* right bracket can appear as collating symbol */ +! { +! pat++; +! bracklen++; +! } + in_collsym = 1; + } +*************** +*** 290,293 **** +--- 325,329 ---- + { + pat++; ++ bracklen++; + in_collsym = 0; + } +*************** +*** 295,300 **** + { + pat++; + if (*pat == ']') /* right bracket can appear as equivalence class */ +! pat++; + in_equiv = 1; + } +--- 331,340 ---- + { + pat++; ++ bracklen++; + if (*pat == ']') /* right bracket can appear as equivalence class */ +! { +! pat++; +! bracklen++; +! } + in_equiv = 1; + } +*************** +*** 302,310 **** +--- 342,354 ---- + { + pat++; ++ bracklen++; + in_equiv = 0; + } ++ else ++ bracklen++; + } + while ((c = *pat++) != ']'); + matlen++; /* bracket expression can only match one char */ ++ bad_bracket: + break; + } +*** ../bash-4.2-patched/patchlevel.h Sat Jun 12 20:14:48 2010 +--- patchlevel.h Thu Feb 24 21:41:34 2011 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 2 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 3 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash42-004 b/bash42-004 new file mode 100644 index 0000000..fe29f82 --- /dev/null +++ b/bash42-004 @@ -0,0 +1,53 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-004 + +Bug-Reported-by: Mike Frysinger +Bug-Reference-ID: <201102182106.17834.vapier@gentoo.org> +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00222.html + +Bug-Description: + +When used in contexts where word splitting and quote removal were not +performed, such as pattern removal or pattern substitution, empty strings +(either literal or resulting from quoted variables that were unset or +null) were not matched correctly, resulting in failure. + +Patch (apply with `patch -p0'): + +*** ../bash-4.2-patched/subst.c 2011-01-02 16:12:51.000000000 -0500 +--- subst.c 2011-02-18 22:30:13.000000000 -0500 +*************** +*** 3373,3379 **** + if (string == 0 || *string == '\0') + return (WORD_LIST *)NULL; + +! td.flags = 0; + td.word = string; + tresult = call_expand_word_internal (&td, quoted, 1, dollar_at_p, has_dollar_at); + return (tresult); +--- 3373,3379 ---- + if (string == 0 || *string == '\0') + return (WORD_LIST *)NULL; + +! td.flags = W_NOSPLIT2; /* no splitting, remove "" and '' */ + td.word = string; + tresult = call_expand_word_internal (&td, quoted, 1, dollar_at_p, has_dollar_at); + return (tresult); +*** ../bash-4.2-patched/patchlevel.h Sat Jun 12 20:14:48 2010 +--- patchlevel.h Thu Feb 24 21:41:34 2011 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 3 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 4 + + #endif /* _PATCHLEVEL_H_ */ diff --git a/bash42-005 b/bash42-005 new file mode 100644 index 0000000..3ca9fc1 --- /dev/null +++ b/bash42-005 @@ -0,0 +1,131 @@ + BASH PATCH REPORT + ================= + +Bash-Release: 4.2 +Patch-ID: bash42-005 + +Bug-Reported-by: Dennis Williamson +Bug-Reference-ID: +Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00147.html + +Bug-Description: + +Systems that use tzset() to set the local timezone require the TZ variable +to be in the environment. Bash must make sure the environment has been +modified with any updated value for TZ before calling tzset(). This +affects prompt string expansions and the `%T' printf conversion specification +on systems that do not allow bash to supply a replacement for getenv(3). + +Patch (apply with `patch -p0'): + +*** ../bash-4.2-patched/variables.h 2010-12-02 20:22:01.000000000 -0500 +--- variables.h 2011-02-19 19:57:12.000000000 -0500 +*************** +*** 314,317 **** +--- 314,318 ---- + extern void sort_variables __P((SHELL_VAR **)); + ++ extern int chkexport __P((char *)); + extern void maybe_make_export_env __P((void)); + extern void update_export_env_inplace __P((char *, int, char *)); +*** ../bash-4.2-patched/variables.c 2011-01-24 20:07:48.000000000 -0500 +--- variables.c 2011-02-19 20:04:50.000000000 -0500 +*************** +*** 3654,3657 **** +--- 3654,3673 ---- + } + ++ int ++ chkexport (name) ++ char *name; ++ { ++ SHELL_VAR *v; ++ ++ v = find_variable (name); ++ if (exported_p (v)) ++ { ++ array_needs_making = 1; ++ maybe_make_export_env (); ++ return 1; ++ } ++ return 0; ++ } ++ + void + maybe_make_export_env () +*************** +*** 4215,4219 **** + { "TEXTDOMAINDIR", sv_locale }, + +! #if defined (HAVE_TZSET) && defined (PROMPT_STRING_DECODE) + { "TZ", sv_tz }, + #endif +--- 4231,4235 ---- + { "TEXTDOMAINDIR", sv_locale }, + +! #if defined (HAVE_TZSET) + { "TZ", sv_tz }, + #endif +*************** +*** 4559,4568 **** + #endif /* HISTORY */ + +! #if defined (HAVE_TZSET) && defined (PROMPT_STRING_DECODE) + void + sv_tz (name) + char *name; + { +! tzset (); + } + #endif +--- 4575,4585 ---- + #endif /* HISTORY */ + +! #if defined (HAVE_TZSET) + void + sv_tz (name) + char *name; + { +! if (chkexport (name)) +! tzset (); + } + #endif +*** ../bash-4.2-patched/parse.y 2011-01-02 15:48:11.000000000 -0500 +--- parse.y 2011-02-19 20:05:00.000000000 -0500 +*************** +*** 5136,5139 **** +--- 5136,5142 ---- + /* Make the current time/date into a string. */ + (void) time (&the_time); ++ #if defined (HAVE_TZSET) ++ sv_tz ("TZ"); /* XXX -- just make sure */ ++ #endif + tm = localtime (&the_time); + +*** ../bash-4.2-patched/builtins/printf.def 2010-11-23 10:02:55.000000000 -0500 +--- builtins/printf.def 2011-02-19 20:05:04.000000000 -0500 +*************** +*** 466,469 **** +--- 466,472 ---- + else + secs = arg; ++ #if defined (HAVE_TZSET) ++ sv_tz ("TZ"); /* XXX -- just make sure */ ++ #endif + tm = localtime (&secs); + n = strftime (timebuf, sizeof (timebuf), timefmt, tm); +*** ../bash-4.2-patched/patchlevel.h Sat Jun 12 20:14:48 2010 +--- patchlevel.h Thu Feb 24 21:41:34 2011 +*************** +*** 26,30 **** + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 4 + + #endif /* _PATCHLEVEL_H_ */ +--- 26,30 ---- + looks for to find the patch level (for the sccs version string). */ + +! #define PATCHLEVEL 5 + + #endif /* _PATCHLEVEL_H_ */