Skip to content

Instantly share code, notes, and snippets.

@dnozay
Last active October 13, 2016 21:52
Show Gist options
  • Save dnozay/395dcdef05c6b4b1836a to your computer and use it in GitHub Desktop.
Save dnozay/395dcdef05c6b4b1836a to your computer and use it in GitHub Desktop.
recompile bash on OSX 10.6.
#!/bin/bash
set -o errexit
cd /tmp
mkdir bash-fix
cd bash-fix
curl -O -J https://ftp.gnu.org/gnu/bash/bash-3.2.tar.gz
curl -O -J https://ftp.gnu.org/gnu/readline/readline-6.3.tar.gz
## already included in gist.
# for patchlevel in $(seq -f %03g 1 57); do
# curl -O -J https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-$patchlevel
# done
# for patchlevel in $(seq -f %03g 1 8); do
# curl -O -J https://ftp.gnu.org/gnu/readline/readline-6.3-patches/readline63-$patchlevel
# done
# curl -J -O http://alblue.bandlem.com/import_functions.patch
md5 *patch *tar.gz > md5sums.txt
cat > md5sums.wanted.txt <<EOF
MD5 (bash-3.2.tar.gz) = 00bfa16d58e034e3c2aa27f390390d30
MD5 (bash32-001.patch) = d8e10c754f477e3f3a581af566b89301
MD5 (bash32-002.patch) = d38a5288b2f0ea6c9ac76b66cc74ef7d
MD5 (bash32-003.patch) = 0b90d37911827d8cb95f3b4353cc225e
MD5 (bash32-004.patch) = 8062f3a59631f58d78b180d83759b68a
MD5 (bash32-005.patch) = 585b5943fadf0875ced243b245adde58
MD5 (bash32-006.patch) = 1d5732e01ea938aeed42f3def131fa4d
MD5 (bash32-007.patch) = dcd0cc5d801607827f7c851e72b0eabc
MD5 (bash32-008.patch) = bb3c7dd11198c0ab93d0e960bebf6256
MD5 (bash32-009.patch) = 434a6f29b0ca5f1ab784b2437ae8eaed
MD5 (bash32-010.patch) = 2efff04dd246fcf63bd4b99f77c9a081
MD5 (bash32-011.patch) = 1dd104342f6920dfaf5efb3131e922e0
MD5 (bash32-012.patch) = 4f24b696ab78bdfae4f9cb7eb59b835d
MD5 (bash32-013.patch) = 7c40addbf1187a26ae1c8373ed383442
MD5 (bash32-014.patch) = 28e88c9f8679e99ac590d4a4a8227c56
MD5 (bash32-015.patch) = 7c17d29675bd0d49470f162774385f80
MD5 (bash32-016.patch) = a1edaa98b4449fe2205fa75448b7b105
MD5 (bash32-017.patch) = 889ed119bbf9d363660b9a0127f35efa
MD5 (bash32-018.patch) = a7d3f85fa687d2c1b5a134839f6d395d
MD5 (bash32-019.patch) = f0399da4007e46fc5820ce25d07425b9
MD5 (bash32-020.patch) = b76602281c3104d904fd064510fe0c21
MD5 (bash32-021.patch) = 923374ae4403c92820f711e62e1d01a5
MD5 (bash32-022.patch) = c82d3bd14e373878b2a680dce18d1596
MD5 (bash32-023.patch) = 987c949a77b4b0ffe4a2597141e77635
MD5 (bash32-024.patch) = 5a2b976e761ab83f0fc7daae11451b86
MD5 (bash32-025.patch) = 08668dc2825f65eced9cac6b09ce1b45
MD5 (bash32-026.patch) = f35b2b217f088ff009f956894550d41d
MD5 (bash32-027.patch) = b5ff2b9610c61290f773c4b02cc1a37d
MD5 (bash32-028.patch) = 016f5b56c93404d32aea09385f0fc13e
MD5 (bash32-029.patch) = a81420626d4d88d0dce2ffac0ac56341
MD5 (bash32-030.patch) = 11f91baf970c132949f9072ee93f2ea6
MD5 (bash32-031.patch) = f6bbc1e8ec0246740731c728ef476191
MD5 (bash32-032.patch) = 8180ec936770579bce69f0816c2dd878
MD5 (bash32-033.patch) = 3cec33c3711860c4c6b7614afeec7870
MD5 (bash32-034.patch) = 7bc6c5b5f38b7027152f8db0458a2e14
MD5 (bash32-035.patch) = a2db61fe90e39371d0e6cd2285ec9208
MD5 (bash32-036.patch) = 95c70c7ae9de5bd3659c86284be7fb76
MD5 (bash32-037.patch) = 62b876a3d7cd192cc8db2476fbb6b7b9
MD5 (bash32-038.patch) = aca3afc341bd3e5a0d8a3b4ca40dbb3f
MD5 (bash32-039.patch) = e240c34f979b64bcb83c5f6567110bb1
MD5 (bash32-040.patch) = 06e6df263398807fa032707fb7b77b5f
MD5 (bash32-041.patch) = 373ae081d658dc85bc1058c4759d6669
MD5 (bash32-042.patch) = 9c9ebc6bfc33a0215277ee17a276eb5a
MD5 (bash32-043.patch) = b87fb9ea16a64ca41b6676e9a7eb7a33
MD5 (bash32-044.patch) = 07e0229ce5879bfbd26a8146070fd366
MD5 (bash32-045.patch) = 1ad07965a8a93f3556ee1ab18b97cde2
MD5 (bash32-046.patch) = f7b1e19fcad54c2286bc0ed614aad9bf
MD5 (bash32-047.patch) = 550690766de770116c34dbdf74e59184
MD5 (bash32-048.patch) = 4cc593e7b789b23b37a5397e092d3954
MD5 (bash32-049.patch) = af571a2d164d5abdcae4499e94e8892c
MD5 (bash32-050.patch) = 8443d4385d73ec835abe401d90591377
MD5 (bash32-051.patch) = 15c6653042e9814aa87120098fc7a849
MD5 (bash32-052.patch) = 691023a944bbb9003cc92ad462d91fa1
MD5 (bash32-053.patch) = eb97d1c9230a55283d9dac69d3de2e46
MD5 (bash32-054.patch) = 1107744058c43b247f597584b88ba0a6
MD5 (bash32-055.patch) = 05d201176d3499e2dfa4a73d09d42f05
MD5 (bash32-056.patch) = 222eaa3a2c26f54a15aa5e08817a534a
MD5 (bash32-057.patch) = 47d98e3e042892495c5efe54ec6e5913
MD5 (import_functions.patch) = 3a13e9e7aafff034e9fa13cdeef6ef8c
MD5 (readline-6.3.tar.gz) = 33c8fb279e981274f485fd91da77e94a
MD5 (readline63-001.patch) = 4343f5ea9b0f42447f102fb61576b398
MD5 (readline63-002.patch) = 700295212f7e2978577feaee584afddb
MD5 (readline63-003.patch) = af4963862f5156fbf9111c2c6fa86ed7
MD5 (readline63-004.patch) = 11f9def89803a5052db3ba72394ce14f
MD5 (readline63-005.patch) = 93721c31cd225393f80cb3aadb165544
MD5 (readline63-006.patch) = 71dc6ecce66d1489b96595f55d142a52
MD5 (readline63-007.patch) = 062a08ed60679d3c4878710b3d595b65
MD5 (readline63-008.patch) = ee1c04072154826870848d8b218d7b04
EOF
# check the checksums.
diff md5sums.txt md5sums.wanted.txt
# build readline
tar -xzf readline-6.3.tar.gz
cd readline-6.3
for patchlevel in $(seq -f %03g 1 8); do
patch -p0 < ../readline63-$patchlevel
done
./configure --enable-multibyte
make install DESTDIR=/tmp/bash-fix/readline
cd ..
# build bash & sh
tar -xzf bash-3.2.tar.gz
cd bash-3.2
for patchlevel in $(seq -f %03g 1 57); do
patch -p0 < ../bash32-$patchlevel
done
# this is optional:
# patch -p0 < ../import_functions.patch
./configure --with-installed-readline=/tmp/bash-fix/readline
make CFLAGS="-Wno-implicit-int -Wno-return-type" Program=bash install DESTDIR=/tmp/bash-fix/build
make clean
make CFLAGS="-g -O2 -DSTRICT_POSIX -DDEFAULT_ECHO_TO_XPG -Wno-implicit-int -Wno-return-type" Program=sh install DESTDIR=/tmp/bash-fix/build
# simple sanity test
cd /tmp/bash-fix/build
./usr/local/bin/bash --version # GNU bash, version 3.2.57(1)-release
./usr/local/bin/sh --version # GNU bash, version 3.2.57(1)-release
# now test for the vulnerability
./usr/local/bin/bash
# env x='() { :;}; echo vulnerable' bash -c 'echo hello'
# env X='() { (a)=>\' sh -c "echo date"; cat echo
# env '__BASH_FUNC<ls>()'="() { echo Game Over; }" bash -c ls
# optional:
# env ls="() { echo 'Game over'; }" bash -c ls
# just in case... make a backup
sudo cp /bin/bash /bin/bash.old
sudo cp /bin/sh /bin/sh.old
# update system version
sudo cp ./usr/local/bin/bash /bin
sudo cp ./usr/local/bin/sh /bin
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-001
Bug-Reported-by: Greg Schafer <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2006-10/msg00046.html
Bug-Description:
When using historical ``-style command substitution, bash incorrectly attempts
to interpret shell comments while scanning for the closing backquote.
Patch:
*** ../bash-3.2/parse.y Tue Sep 19 16:37:21 2006
--- parse.y Thu Oct 12 10:30:57 2006
***************
*** 2736,2740 ****
count = 1;
pass_next_character = backq_backslash = was_dollar = in_comment = 0;
! check_comment = (flags & P_COMMAND) && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0;
/* RFLAGS is the set of flags we want to pass to recursive calls. */
--- 2736,2740 ----
count = 1;
pass_next_character = backq_backslash = was_dollar = in_comment = 0;
! check_comment = (flags & P_COMMAND) && qc != '`' && qc != '\'' && qc != '"' && (flags & P_DQUOTE) == 0;
/* RFLAGS is the set of flags we want to pass to recursive calls. */
*** ../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 0
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 1
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-002
Bug-Reported-by: Jim Gifford <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2006-10/msg00082.html
Bug-Description:
An incorrect encoding specification in the Content-Type header causes msgfmt
to fail, which causes `make install' to fail.
Patch:
*** ../bash-3.2/po/ru.po Tue Jan 10 17:51:03 2006
--- po/ru.po Mon Oct 16 15:13:23 2006
***************
*** 13,17 ****
"Language-Team: Russian <[email protected]>\n"
"MIME-Version: 1.0\n"
! "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
--- 13,17 ----
"Language-Team: Russian <[email protected]>\n"
"MIME-Version: 1.0\n"
! "Content-Type: text/plain; charset=KOI8-R\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
*** ../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 1
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 2
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-003
Bug-Reported-by: John Gatewood Ham <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2006-10/msg00045.html
Bug-Description:
When using the conditional command's `=~' operator to match regular
expressions, the parser did not skip over shell metacharacters in the
regular expression, leading to syntax errors.
Patch:
*** ../bash-3.2-patched/parse.y Tue Oct 17 11:45:20 2006
--- parse.y Sat Oct 14 14:56:16 2006
***************
*** 1029,1034 ****
--- 1029,1035 ----
#define PST_CMDTOKEN 0x1000 /* command token OK - unused */
#define PST_COMPASSIGN 0x2000 /* parsing x=(...) compound assignment */
#define PST_ASSIGNOK 0x4000 /* assignment statement ok in this context */
+ #define PST_REGEXP 0x8000 /* parsing an ERE/BRE as a single word */
/* Initial size to allocate for tokens, and the
amount to grow them by. */
***************
*** 2591,2596 ****
--- 2592,2600 ----
return (character);
}
+ if (parser_state & PST_REGEXP)
+ goto tokword;
+
/* Shell meta-characters. */
if MBTEST(shellmeta (character) && ((parser_state & PST_DBLPAREN) == 0))
{
***************
*** 2698,2703 ****
--- 2702,2708 ----
if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND))
return (character);
+ tokword:
/* Okay, if we got this far, we have to read a word. Read one,
and then check it against the known ones. */
result = read_token_word (character);
***************
*** 3202,3209 ****
if (tok == WORD && test_binop (yylval.word->word))
op = yylval.word;
#if defined (COND_REGEXP)
! else if (tok == WORD && STREQ (yylval.word->word,"=~"))
! op = yylval.word;
#endif
else if (tok == '<' || tok == '>')
op = make_word_from_token (tok); /* ( */
--- 3207,3217 ----
if (tok == WORD && test_binop (yylval.word->word))
op = yylval.word;
#if defined (COND_REGEXP)
! else if (tok == WORD && STREQ (yylval.word->word, "=~"))
! {
! op = yylval.word;
! parser_state |= PST_REGEXP;
! }
#endif
else if (tok == '<' || tok == '>')
op = make_word_from_token (tok); /* ( */
***************
*** 3234,3239 ****
--- 3242,3248 ----
/* rhs */
tok = read_token (READ);
+ parser_state &= ~PST_REGEXP;
if (tok == WORD)
{
tright = make_cond_node (COND_TERM, yylval.word, (COND_COM *)NULL, (COND_COM *)NULL);
***************
*** 3419,3427 ****
goto next_character;
}
#ifdef EXTENDED_GLOB
/* Parse a ksh-style extended pattern matching specification. */
! if (extended_glob && PATTERN_CHAR (character))
{
peek_char = shell_getc (1);
if MBTEST(peek_char == '(') /* ) */
--- 3428,3461 ----
goto next_character;
}
+ #ifdef COND_REGEXP
+ /* When parsing a regexp as a single word inside a conditional command,
+ we need to special-case characters special to both the shell and
+ regular expressions. Right now, that is only '(' and '|'. */ /*)*/
+ if MBTEST((parser_state & PST_REGEXP) && (character == '(' || character == '|')) /*)*/
+ {
+ if (character == '|')
+ goto got_character;
+
+ push_delimiter (dstack, character);
+ ttok = parse_matched_pair (cd, '(', ')', &ttoklen, 0);
+ pop_delimiter (dstack);
+ if (ttok == &matched_pair_error)
+ return -1; /* Bail immediately. */
+ RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 2,
+ token_buffer_size, TOKEN_DEFAULT_GROW_SIZE);
+ token[token_index++] = character;
+ strcpy (token + token_index, ttok);
+ token_index += ttoklen;
+ FREE (ttok);
+ dollar_present = all_digit_token = 0;
+ goto next_character;
+ }
+ #endif /* COND_REGEXP */
+
#ifdef EXTENDED_GLOB
/* Parse a ksh-style extended pattern matching specification. */
! if MBTEST(extended_glob && PATTERN_CHAR (character))
{
peek_char = shell_getc (1);
if MBTEST(peek_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 2
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 3
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-004
Bug-Reported-by: Stuart Shelton <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL:
Bug-Description:
A bug in the parameter pattern substitution implementation treated a pattern
whose first character was `/' (after expansion) as specifying global
replacement.
Patch:
*** ../bash-3.2/subst.c Tue Sep 19 08:35:09 2006
--- subst.c Thu Oct 26 09:17:50 2006
***************
*** 5707,5712 ****
--- 5707,5717 ----
vtype &= ~VT_STARSUB;
mflags = 0;
+ if (patsub && *patsub == '/')
+ {
+ mflags |= MATCH_GLOBREP;
+ patsub++;
+ }
/* Malloc this because expand_string_if_necessary or one of the expansion
functions in its call chain may free it on a substitution error. */
***************
*** 5741,5753 ****
}
/* ksh93 doesn't allow the match specifier to be a part of the expanded
! pattern. This is an extension. */
p = pat;
! if (pat && pat[0] == '/')
! {
! mflags |= MATCH_GLOBREP|MATCH_ANY;
! p++;
! }
else if (pat && pat[0] == '#')
{
mflags |= MATCH_BEG;
--- 5746,5757 ----
}
/* ksh93 doesn't allow the match specifier to be a part of the expanded
! pattern. This is an extension. Make sure we don't anchor the pattern
! at the beginning or end of the string if we're doing global replacement,
! though. */
p = pat;
! if (mflags & MATCH_GLOBREP)
! mflags |= MATCH_ANY;
else if (pat && pat[0] == '#')
{
mflags |= MATCH_BEG;
*** ../bash-3.2/tests/new-exp.right Thu Aug 10 12:00:00 2006
--- tests/new-exp.right Sun Oct 29 16:03:36 2006
***************
*** 430,436 ****
Case06---1---A B C::---
Case07---3---A:B:C---
Case08---3---A:B:C---
! ./new-exp.tests: line 506: /${$(($#-1))}: bad substitution
argv[1] = <a>
argv[2] = <b>
argv[3] = <c>
--- 430,436 ----
Case06---1---A B C::---
Case07---3---A:B:C---
Case08---3---A:B:C---
! ./new-exp.tests: line 506: ${$(($#-1))}: bad substitution
argv[1] = <a>
argv[2] = <b>
argv[3] = <c>
*** ../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 3
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 4
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-005
Bug-Reported-by: Stuart Shelton <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2006-10/msg00127.html
Bug-Description:
A missing extern declaration for `asprintf' caused `double' arguments to be
passed as `0', leading to incorrect results. Additionally, a bug in the
replacement asprintf/snprintf function caused an infinite loop when passed
0 arguments to the floating point conversions under some circumstances.
Patch:
*** ../bash-3.2/builtins/printf.def Mon Sep 18 08:48:42 2006
--- builtins/printf.def Tue Oct 31 08:19:44 2006
***************
*** 49,54 ****
--- 49,60 ----
# define INT_MIN (-2147483647-1)
#endif
+ #if defined (PREFER_STDARG)
+ # include <stdarg.h>
+ #else
+ # include <varargs.h>
+ #endif
+
#include <stdio.h>
#include <chartypes.h>
***************
*** 151,156 ****
--- 157,166 ----
#define SKIP1 "#'-+ 0"
#define LENMODS "hjlLtz"
+ #ifndef HAVE_ASPRINTF
+ extern int asprintf __P((char **, const char *, ...)) __attribute__((__format__ (printf, 2, 3)));
+ #endif
+
static void printf_erange __P((char *));
static int printstr __P((char *, char *, int, int, int));
static int tescape __P((char *, char *, int *));
*** ../bash-3.2/lib/sh/snprintf.c Thu Apr 6 09:48:40 2006
--- lib/sh/snprintf.c Sat Oct 28 00:00:13 2006
***************
*** 471,476 ****
--- 476,483 ----
10^x ~= r
* log_10(200) = 2;
* log_10(250) = 2;
+ *
+ * NOTE: do not call this with r == 0 -- an infinite loop results.
*/
static int
log_10(r)
***************
*** 576,583 ****
{
integral_part[0] = '0';
integral_part[1] = '\0';
! fraction_part[0] = '0';
! fraction_part[1] = '\0';
if (fract)
*fract = fraction_part;
return integral_part;
--- 583,593 ----
{
integral_part[0] = '0';
integral_part[1] = '\0';
! /* The fractional part has to take the precision into account */
! for (ch = 0; ch < precision-1; ch++)
! fraction_part[ch] = '0';
! fraction_part[ch] = '0';
! fraction_part[ch+1] = '\0';
if (fract)
*fract = fraction_part;
return integral_part;
***************
*** 805,810 ****
--- 815,821 ----
PUT_CHAR(*tmp, p);
tmp++;
}
+
PAD_LEFT(p);
}
***************
*** 972,982 ****
if ((p->flags & PF_THOUSANDS) && grouping && (t = groupnum (tmp)))
tmp = t;
/* calculate the padding. 1 for the dot */
p->width = p->width -
((d > 0. && p->justify == RIGHT) ? 1:0) -
((p->flags & PF_SPACE) ? 1:0) -
! strlen(tmp) - p->precision - 1;
PAD_RIGHT(p);
PUT_PLUS(d, p, 0.);
PUT_SPACE(d, p, 0.);
--- 983,1003 ----
if ((p->flags & PF_THOUSANDS) && grouping && (t = groupnum (tmp)))
tmp = t;
+ if ((*p->pf == 'g' || *p->pf == 'G') && (p->flags & PF_ALTFORM) == 0)
+ {
+ /* smash the trailing zeros unless altform */
+ for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] == '0'; i--)
+ tmp2[i] = '\0';
+ if (tmp2[0] == '\0')
+ p->precision = 0;
+ }
+
/* calculate the padding. 1 for the dot */
p->width = p->width -
((d > 0. && p->justify == RIGHT) ? 1:0) -
((p->flags & PF_SPACE) ? 1:0) -
! strlen(tmp) - p->precision -
! ((p->precision != 0 || (p->flags & PF_ALTFORM)) ? 1 : 0); /* radix char */
PAD_RIGHT(p);
PUT_PLUS(d, p, 0.);
PUT_SPACE(d, p, 0.);
***************
*** 991,1001 ****
if (p->precision != 0 || (p->flags & PF_ALTFORM))
PUT_CHAR(decpoint, p); /* put the '.' */
- if ((*p->pf == 'g' || *p->pf == 'G') && (p->flags & PF_ALTFORM) == 0)
- /* smash the trailing zeros unless altform */
- for (i = strlen(tmp2) - 1; i >= 0 && tmp2[i] == '0'; i--)
- tmp2[i] = '\0';
-
for (; *tmp2; tmp2++)
PUT_CHAR(*tmp2, p); /* the fraction */
--- 1012,1017 ----
***************
*** 1011,1024 ****
char *tmp, *tmp2;
int j, i;
! if (chkinfnan(p, d, 1) || chkinfnan(p, d, 2))
return; /* already printed nan or inf */
GETLOCALEDATA(decpoint, thoussep, grouping);
DEF_PREC(p);
! j = log_10(d);
! d = d / pow_10(j); /* get the Mantissa */
! d = ROUND(d, p);
tmp = dtoa(d, p->precision, &tmp2);
/* 1 for unit, 1 for the '.', 1 for 'e|E',
--- 1027,1045 ----
char *tmp, *tmp2;
int j, i;
! if (d != 0 && (chkinfnan(p, d, 1) || chkinfnan(p, d, 2)))
return; /* already printed nan or inf */
GETLOCALEDATA(decpoint, thoussep, grouping);
DEF_PREC(p);
! if (d == 0.)
! j = 0;
! else
! {
! j = log_10(d);
! d = d / pow_10(j); /* get the Mantissa */
! d = ROUND(d, p);
! }
tmp = dtoa(d, p->precision, &tmp2);
/* 1 for unit, 1 for the '.', 1 for 'e|E',
***************
*** 1076,1081 ****
--- 1097,1103 ----
PUT_CHAR(*tmp, p);
tmp++;
}
+
PAD_LEFT(p);
}
#endif
***************
*** 1358,1364 ****
STAR_ARGS(data);
DEF_PREC(data);
d = GETDOUBLE(data);
! i = log_10(d);
/*
* for '%g|%G' ANSI: use f if exponent
* is in the range or [-4,p] exclusively
--- 1380,1386 ----
STAR_ARGS(data);
DEF_PREC(data);
d = GETDOUBLE(data);
! i = (d != 0.) ? log_10(d) : -1;
/*
* for '%g|%G' ANSI: use f if exponent
* is in the range or [-4,p] exclusively
*** ../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 4
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 5
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-006
Bug-Reported-by: [email protected]
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00017.html
http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00016.html
Bug-Description:
In some cases, code that is intended to be used in the presence of multibyte
characters is called when no such characters are present, leading to incorrect
display position calculations and incorrect redisplay.
Patch:
*** ../bash-3.2-patched/lib/readline/display.c Thu Sep 14 14:20:12 2006
--- lib/readline/display.c Mon Nov 13 17:55:57 2006
***************
*** 2381,2384 ****
--- 2409,2414 ----
if (end <= start)
return 0;
+ if (MB_CUR_MAX == 1 || rl_byte_oriented)
+ return (end - start);
memset (&ps, 0, sizeof (mbstate_t));
*** ../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 5
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 6
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-007
Bug-Reported-by: [email protected]
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00039.html
Bug-Description:
When removing the current or previous job from the jobs list, bash incorrectly
resets the current job under some circumstances.
Patch:
*** ../bash-3.2-patched/jobs.c Sat Jul 29 16:40:48 2006
--- jobs.c Fri Nov 24 14:50:01 2006
***************
*** 985,990 ****
if (temp == 0)
return;
- if (job_index == js.j_current || job_index == js.j_previous)
- reset_current ();
if ((dflags & DEL_NOBGPID) == 0)
--- 985,988 ----
***************
*** 1029,1032 ****
--- 1027,1033 ----
else if (jobs[js.j_firstj] == 0 || jobs[js.j_lastj] == 0)
reset_job_indices ();
+
+ if (job_index == js.j_current || job_index == js.j_previous)
+ reset_current ();
}
*** ../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 6
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 7
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-008
Bug-Reported-by: Linda Walsh <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2006-11/msg00040.html
Bug-Description:
When checking pathnames from the command hash table (e.g., when the `checkhash'
shell option is enabled), a bug causes bash to delete and re-lookup each
command.
Patch:
*** ../bash-3.2-patched/findcmd.c Wed Aug 17 16:49:54 2005
--- findcmd.c Fri Nov 24 10:48:37 2006
***************
*** 309,313 ****
{
st = file_status (hashed_file);
! if ((st ^ (FS_EXISTS | FS_EXECABLE)) != 0)
{
phash_remove (pathname);
--- 309,313 ----
{
st = file_status (hashed_file);
! if ((st & (FS_EXISTS|FS_EXECABLE)) != (FS_EXISTS|FS_EXECABLE))
{
phash_remove (pathname);
*** ../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 7
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 8
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-009
Bug-Reported-by: [email protected]
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2006-12/msg00000.html
Bug-Description:
When using its built-in replacement for snprintf/asprintf, bash does not
treat the %x, %X, and %o format specifiers as unsigned numbers.
Patch:
*** ../bash-3.2-patched/lib/sh/snprintf.c Mon Nov 13 08:58:52 2006
--- lib/sh/snprintf.c Wed Dec 6 11:15:04 2006
***************
*** 669,673 ****
sd = d; /* signed for ' ' padding in base 10 */
! flags = (*p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0;
if (*p->pf == 'X')
flags |= FL_HEXUPPER;
--- 674,679 ----
sd = d; /* signed for ' ' padding in base 10 */
! flags = 0;
! flags = (*p->pf == 'x' || *p->pf == 'X' || *p->pf == 'o' || *p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0;
if (*p->pf == 'X')
flags |= FL_HEXUPPER;
***************
*** 739,743 ****
sd = d; /* signed for ' ' padding in base 10 */
! flags = (*p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0;
if (*p->pf == 'X')
flags |= FL_HEXUPPER;
--- 745,749 ----
sd = d; /* signed for ' ' padding in base 10 */
! flags = (*p->pf == 'x' || *p->pf == 'X' || *p->pf == 'o' || *p->pf == 'u' || *p->pf == 'U') ? FL_UNSIGNED : 0;
if (*p->pf == 'X')
flags |= FL_HEXUPPER;
*** ../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 8
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 9
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-010
Bug-Reported-by: Ryan Waldron <[email protected]>
Bug-Reference-ID: <[email protected]>
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_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-011
Bug-Reported-by: Petr Sumbera <[email protected]>
Bug-Reference-ID: <[email protected]>
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_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-012
Bug-Reported-by: John Wyman <[email protected]>
Bug-Reference-ID: <[email protected]>
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_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-013
Bug-Reported-by: Magnus Svensson <[email protected]>
Bug-Reference-ID: <[email protected]>
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_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-014
Bug-Reported-by: Brett Stahlman <[email protected]>
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_ */
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_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-016
Bug-Reported-by: Peter Volkov <[email protected]>
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_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-017
Bug-Reported-by: Peter Volkov <[email protected]>
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_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-018
Bug-Reported-by: [email protected]
Bug-Reference-ID: <[email protected]>
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_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-019
Bug-Reported-by: Thomas Loeber <[email protected]>
Bug-Reference-ID: <[email protected]>
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_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-020
Bug-Reported-by: Ian A Watson <[email protected]>
Bug-Reference-ID: <OFEC551808.69D02C7F-ON8525729A.0045708D-8525729A.0046150B@EliLilly.lilly.com>
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_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-021
Bug-Reported-by: BAGSHAW Paul RD-TECH-REN <[email protected]>
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_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-022
Bug-Reported-by: Chet Ramey <[email protected]>
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_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-023
Bug-Reported-by: Chet Ramey <[email protected]>
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_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-024
Bug-Reported-by: Peter Volkov <[email protected]>
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_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-025
Bug-Reported-by: Tom Bjorkholm <[email protected]>
Bug-Reference-ID: <AEA1A32F001C6B4F98614B5B80D7647D01C075E9@esealmw115.eemea.ericsson.se>
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_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-026
Bug-Reported-by: Chet Ramey <[email protected]>
Bug-Reference-ID:
Bug-Reference-URL:
Bug-Description:
This keeps the Apple linker from attempting to link bash against Apple's
readline library "replacement" rather than the one shipped with bash. It
extends the configure workaround to Mac OS X Leopard (10.5).
As a side effect, the patch updates the copyright date displayed in the
version string.
You must re-run configure after applying the patch, and before rebuilding
bash.
Patch:
*** ../bash-3.2-patched/configure.in 2007-03-06 11:07:38.000000000 -0500
--- configure.in 2007-11-23 15:37:41.000000000 -0500
***************
*** 519,523 ****
# dynamic version
case "${host_os}" in
! darwin8*) READLINE_LIB='${READLINE_LIBRARY}' ;;
*) READLINE_LIB=-lreadline ;;
esac
--- 519,523 ----
# dynamic version
case "${host_os}" in
! darwin[[89]]*) READLINE_LIB='${READLINE_LIBRARY}' ;;
*) READLINE_LIB=-lreadline ;;
esac
*** ../bash-3.2-patched/configure 2007-03-24 14:51:22.000000000 -0400
--- configure 2007-11-23 15:46:15.000000000 -0500
***************
*** 4872,4876 ****
# dynamic version
case "${host_os}" in
! darwin8*) READLINE_LIB='${READLINE_LIBRARY}' ;;
*) READLINE_LIB=-lreadline ;;
esac
--- 4872,4876 ----
# dynamic version
case "${host_os}" in
! darwin[89]*) READLINE_LIB='${READLINE_LIBRARY}' ;;
*) READLINE_LIB=-lreadline ;;
esac
*** ../bash-3.2-patched/version.c 2005-05-16 11:58:34.000000000 -0400
--- version.c 2007-11-23 16:03:40.000000000 -0500
***************
*** 80,83 ****
printf ("GNU bash, version %s (%s)\n", shell_version_string (), MACHTYPE);
if (extended)
! printf (_("Copyright (C) 2005 Free Software Foundation, Inc.\n"));
}
--- 80,83 ----
printf ("GNU bash, version %s (%s)\n", shell_version_string (), MACHTYPE);
if (extended)
! printf (_("Copyright (C) 2007 Free Software Foundation, Inc.\n"));
}
*** ../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 25
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 26
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-027
Bug-Reported-by: dAniel hAhler <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: https://bugs.launchpad.net/ubuntu/+source/bash/+bug/119938
Bug-Description:
When updating the display after displaying, for instance, a list of possible
completions, readline will place the cursor at the wrong position if the
prompt contains invisible characters and a newline.
Patch:
*** ../bash-3.2.25/lib/readline/display.c Mon Aug 6 14:26:29 2007
--- lib/readline/display.c Wed Oct 10 22:43:58 2007
***************
*** 1049,1053 ****
else
tx = nleft;
! if (_rl_last_c_pos > tx)
{
_rl_backspace (_rl_last_c_pos - tx); /* XXX */
--- 1049,1053 ----
else
tx = nleft;
! if (tx >= 0 && _rl_last_c_pos > tx)
{
_rl_backspace (_rl_last_c_pos - tx); /* XXX */
***************
*** 1205,1209 ****
{
register char *ofd, *ols, *oe, *nfd, *nls, *ne;
! int temp, lendiff, wsatend, od, nd;
int current_invis_chars;
int col_lendiff, col_temp;
--- 1205,1209 ----
{
register char *ofd, *ols, *oe, *nfd, *nls, *ne;
! int temp, lendiff, wsatend, od, nd, o_cpos;
int current_invis_chars;
int col_lendiff, col_temp;
***************
*** 1466,1469 ****
--- 1466,1471 ----
}
+ o_cpos = _rl_last_c_pos;
+
/* When this function returns, _rl_last_c_pos is correct, and an absolute
cursor postion in multibyte mode, but a buffer index when not in a
***************
*** 1475,1479 ****
invisible characters in the prompt string. Let's see if setting this when
we make sure we're at the end of the drawn prompt string works. */
! if (current_line == 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0 && _rl_last_c_pos == prompt_physical_chars)
cpos_adjusted = 1;
#endif
--- 1477,1483 ----
invisible characters in the prompt string. Let's see if setting this when
we make sure we're at the end of the drawn prompt string works. */
! if (current_line == 0 && MB_CUR_MAX > 1 && rl_byte_oriented == 0 &&
! (_rl_last_c_pos > 0 || o_cpos > 0) &&
! _rl_last_c_pos == prompt_physical_chars)
cpos_adjusted = 1;
#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 26
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 27
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-028
Bug-Reported-by: dAniel hAhler <[email protected]>
Bug-Reference-ID:
Bug-Reference-URL:
Bug-Description:
Under some circumstances, readline will incorrectly display a prompt string
containing invisible characters after the final newline.
Patch:
*** ../bash-3.2-patched/lib/readline/display.c 2007-08-25 13:47:08.000000000 -0400
--- lib/readline/display.c 2007-11-10 17:51:29.000000000 -0500
***************
*** 392,396 ****
local_prompt = expand_prompt (p, &prompt_visible_length,
&prompt_last_invisible,
! (int *)NULL,
&prompt_physical_chars);
c = *t; *t = '\0';
--- 420,424 ----
local_prompt = expand_prompt (p, &prompt_visible_length,
&prompt_last_invisible,
! &prompt_invis_chars_first_line,
&prompt_physical_chars);
c = *t; *t = '\0';
***************
*** 399,403 ****
local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length,
(int *)NULL,
! &prompt_invis_chars_first_line,
(int *)NULL);
*t = c;
--- 427,431 ----
local_prompt_prefix = expand_prompt (prompt, &prompt_prefix_length,
(int *)NULL,
! (int *)NULL,
(int *)NULL);
*t = c;
*** ../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 27
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 28
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-029
Bug-Reported-by: Tomas Janousek <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: https://bugzilla.redhat.com/show_bug.cgi?id=286861
Bug-Description:
When the bash arithmetic expression evaluator has temporarily turned off
evalation, such as when parsing a pre- or post-decrement or -increment
operator, and an error occurs, evaluation is not re-enabled.
Patch:
*** ../bash-3.2-patched/expr.c 2007-08-25 13:47:05.000000000 -0400
--- expr.c 2007-10-18 08:08:44.000000000 -0400
***************
*** 287,290 ****
--- 287,292 ----
}
free (expr_stack[expr_depth]); /* free the allocated EXPR_CONTEXT */
+
+ noeval = 0; /* XXX */
}
***************
*** 320,323 ****
--- 322,326 ----
val = 0;
+ noeval = 0;
FASTCOPY (evalbuf, oevalbuf, sizeof (evalbuf));
*** ../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 28
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 29
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-030
Bug-Reported-by: Paul Eggert <[email protected]> Andreas Schwab <[email protected]>
Bug-Reference-ID: <[email protected]> <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-11/msg00023.html http://lists.gnu.org/archive/html/bug-bash/2007-11/msg00022.htmlhttp://lists.gnu.org/archive/html/bug-bash/2007-11/msg00022.html
Bug-Description:
If redirections attached to a compound command fail, bash does not set the
command's exit status correctly. This only happens when the command is the
first in a sequential list.
Patch:
*** ../bash-3.2-patched/execute_cmd.c 2007-03-24 14:51:05.000000000 -0400
--- execute_cmd.c 2007-11-05 22:31:14.000000000 -0500
***************
*** 615,619 ****
redirection_undo_list = (REDIRECT *)NULL;
dispose_exec_redirects ();
! return (EXECUTION_FAILURE);
}
--- 620,624 ----
redirection_undo_list = (REDIRECT *)NULL;
dispose_exec_redirects ();
! return (last_command_exit_value = EXECUTION_FAILURE);
}
*** ../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 29
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 30
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-031
Bug-Reported-by: Miroslav Lichvar <[email protected]>
Bug-Reference-ID: Fri, 02 Nov 2007 14:07:45 +0100
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-readline/2007-11/msg00000.html
Bug-Description:
In certain cases when outputting characters at the end of the line,
e.g., when displaying the prompt string, readline positions the cursor
incorrectly if the prompt string contains invisible characters and the
text being drawn begins before the last invisible character in the line.
Patch:
*** ../bash-3.2-patched/lib/readline/display.c 2007-08-25 13:47:08.000000000 -0400
--- lib/readline/display.c 2007-11-10 17:51:29.000000000 -0500
***************
*** 1566,1574 ****
else
{
- /* We have horizontal scrolling and we are not inserting at
- the end. We have invisible characters in this line. This
- is a dumb update. */
_rl_output_some_chars (nfd, temp);
_rl_last_c_pos += col_temp;
return;
}
--- 1619,1632 ----
else
{
_rl_output_some_chars (nfd, temp);
_rl_last_c_pos += col_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;
}
*** ../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 30
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 31
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-032
Bug-Reported-by: Uwe Doering <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-09/msg00102.html
Bug-Description:
There is an off-by-one error in the code that buffers characters received
very quickly in succession, causing characters to be dropped.
Patch:
*** ../bash-3.2-patched/lib/readline/input.c 2007-08-25 13:47:10.000000000 -0400
--- lib/readline/input.c 2007-10-12 22:55:25.000000000 -0400
***************
*** 155,159 ****
pop_index--;
if (pop_index < 0)
! pop_index = ibuffer_len - 1;
ibuffer[pop_index] = key;
return (1);
--- 155,159 ----
pop_index--;
if (pop_index < 0)
! pop_index = ibuffer_len;
ibuffer[pop_index] = key;
return (1);
*** ../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 31
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 32
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-033
Bug-Reported-by: Christophe Martin <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-05/msg00104.html
Bug-Description:
References made within a function to an uninitialized local array variable
using the [*] subscript in a double-quoted string can result in spurious
ASCII 127 characters in the expanded value.
Patch:
*** ../bash-3.2-patched/arrayfunc.c 2007-08-25 13:47:05.000000000 -0400
--- arrayfunc.c 2007-05-31 11:55:46.000000000 -0400
***************
*** 723,727 ****
{
if (rtype)
! *rtype = 1;
if (allow_all == 0)
{
--- 723,727 ----
{
if (rtype)
! *rtype = (t[0] == '*') ? 1 : 2;
if (allow_all == 0)
{
*** ../bash-3.2-patched/subst.c 2007-08-25 13:47:08.000000000 -0400
--- subst.c 2007-11-14 15:43:00.000000000 -0500
***************
*** 4908,4915 ****
intmax_t arg_index;
SHELL_VAR *var;
! int atype;
ret = 0;
temp = 0;
/* Handle multiple digit arguments, as in ${11}. */
--- 4973,4981 ----
intmax_t arg_index;
SHELL_VAR *var;
! int atype, rflags;
ret = 0;
temp = 0;
+ rflags = 0;
/* Handle multiple digit arguments, as in ${11}. */
***************
*** 4944,4947 ****
--- 5010,5015 ----
? quote_string (temp)
: quote_escapes (temp);
+ else if (atype == 1 && temp && QUOTED_NULL (temp) && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)))
+ rflags |= W_HASQUOTEDNULL;
}
#endif
***************
*** 4971,4974 ****
--- 5039,5043 ----
ret = alloc_word_desc ();
ret->word = temp;
+ ret->flags |= rflags;
}
return ret;
*** ../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 32
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 33
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-034
Bug-Reported-by: Ian Campbell <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-10/msg00060.html
Bug-Description:
The bash getcwd replacement will write past the end of allocated memory
when it allocates the buffer itself if it uses the buffer size passed as
an argument, and that size is less than the length of the pathname.
Patch:
*** ../bash-3.2-patched/lib/sh/getcwd.c 2004-07-21 17:15:19.000000000 -0400
--- lib/sh/getcwd.c 2007-12-31 19:26:36.000000000 -0500
***************
*** 252,268 ****
{
size_t len = pathbuf + pathsize - pathp;
if (buf == NULL)
{
! if (len < (size_t) size)
! len = size;
! buf = (char *) malloc (len);
if (buf == NULL)
goto lose2;
}
! else if ((size_t) size < len)
! {
! errno = ERANGE;
! goto lose2;
! }
(void) memcpy((PTR_T) buf, (PTR_T) pathp, len);
}
--- 287,305 ----
{
size_t len = pathbuf + pathsize - pathp;
+ if (buf == NULL && size <= 0)
+ size = len;
+
+ if ((size_t) size < len)
+ {
+ errno = ERANGE;
+ goto lose2;
+ }
if (buf == NULL)
{
! buf = (char *) malloc (size);
if (buf == NULL)
goto lose2;
}
!
(void) memcpy((PTR_T) buf, (PTR_T) pathp, len);
}
*** ../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 33
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 34
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-035
Bug-Reported-by: Ingo Molnar <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2007-12/msg00014.html
Bug-Description:
Bash incorrectly puts the second and subsequent children spawned by a
shell forked to run a command substitution in the wrong process group.
Patch:
*** ../bash-3.2-patched/subst.c 2007-12-13 22:31:21.000000000 -0500
--- subst.c 2008-01-17 22:48:15.000000000 -0500
***************
*** 4621,4627 ****
#if defined (JOB_CONTROL)
set_sigchld_handler ();
stop_making_children ();
! pipeline_pgrp = old_pipeline_pgrp;
#else
stop_making_children ();
--- 4721,4728 ----
#if defined (JOB_CONTROL)
set_sigchld_handler ();
stop_making_children ();
! if (pid != 0)
! pipeline_pgrp = old_pipeline_pgrp;
#else
stop_making_children ();
*** ../bash-3.2-patched/jobs.c 2007-08-25 13:46:59.000000000 -0400
--- jobs.c 2007-12-08 16:47:43.000000000 -0500
***************
*** 251,254 ****
--- 251,255 ----
static int set_job_status_and_cleanup __P((int));
+ static WAIT job_signal_status __P((int));
static WAIT raw_job_exit_status __P((int));
***************
*** 2220,2223 ****
--- 2238,2261 ----
}
+ static WAIT
+ job_signal_status (job)
+ int job;
+ {
+ register PROCESS *p;
+ WAIT s;
+
+ p = jobs[job]->pipe;
+ do
+ {
+ s = p->status;
+ if (WIFSIGNALED(s) || WIFSTOPPED(s))
+ break;
+ p = p->next;
+ }
+ while (p != jobs[job]->pipe);
+
+ return s;
+ }
+
/* Return the exit status of the last process in the pipeline for job JOB.
This is the exit status of the entire job. */
***************
*** 2302,2310 ****
received, only if one of the jobs run is killed via SIGINT. If
job control is not set, the job will be run in the same pgrp as
! the shell, and the shell will see any signals the job gets. */
/* This is possibly a race condition -- should it go in stop_pipeline? */
wait_sigint_received = 0;
! if (job_control == 0)
{
old_sigint_handler = set_signal_handler (SIGINT, wait_sigint_handler);
--- 2343,2354 ----
received, only if one of the jobs run is killed via SIGINT. If
job control is not set, the job will be run in the same pgrp as
! the shell, and the shell will see any signals the job gets. In
! fact, we want this set every time the waiting shell and the waited-
! for process are in the same process group, including command
! substitution. */
/* This is possibly a race condition -- should it go in stop_pipeline? */
wait_sigint_received = 0;
! if (job_control == 0 || (subshell_environment&SUBSHELL_COMSUB))
{
old_sigint_handler = set_signal_handler (SIGINT, wait_sigint_handler);
***************
*** 2452,2464 ****
the last process in the pipeline. If no process exits due to a
signal, S is left as the status of the last job in the pipeline. */
! p = jobs[job]->pipe;
! do
! {
! s = p->status;
! if (WIFSIGNALED(s) || WIFSTOPPED(s))
! break;
! p = p->next;
! }
! while (p != jobs[job]->pipe);
if (WIFSIGNALED (s) || WIFSTOPPED (s))
--- 2496,2500 ----
the last process in the pipeline. If no process exits due to a
signal, S is left as the status of the last job in the pipeline. */
! s = job_signal_status (job);
if (WIFSIGNALED (s) || WIFSTOPPED (s))
***************
*** 2494,2497 ****
--- 2530,2551 ----
}
}
+ else if ((subshell_environment & SUBSHELL_COMSUB) && wait_sigint_received)
+ {
+ /* If waiting for a job in a subshell started to do command
+ substitution, simulate getting and being killed by the SIGINT to
+ pass the status back to our parent. */
+ s = job_signal_status (job);
+
+ if (WIFSIGNALED (s) && WTERMSIG (s) == SIGINT && signal_is_trapped (SIGINT) == 0)
+ {
+ UNBLOCK_CHILD (oset);
+ restore_sigint_handler ();
+ old_sigint_handler = set_signal_handler (SIGINT, SIG_DFL);
+ if (old_sigint_handler == SIG_IGN)
+ restore_sigint_handler ();
+ else
+ kill (getpid (), SIGINT);
+ }
+ }
/* Moved here from set_job_status_and_cleanup, which is in the SIGCHLD
*** ../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 34
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 35
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-036
Bug-Reported-by: Len Lattanzi <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL:
Bug-Description:
When initializing a subshell, bash did not reset a sentinel keeping track
of the number of command substitutions, leading to an infinite loop if
an error was encountered in the subshell.
Patch:
*** ../bash-3.2-patched/execute_cmd.c 2007-12-13 22:31:14.000000000 -0500
--- execute_cmd.c 2007-12-20 08:52:34.000000000 -0500
***************
*** 3881,3884 ****
--- 3916,3921 ----
clear_unwind_protect_list (0);
+ /* XXX -- are there other things we should be resetting here? */
+ parse_and_execute_level = 0; /* nothing left to restore it */
/* We're no longer inside a shell function. */
*** ../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 35
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 36
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-037
Bug-Reported-by: jared r r spiegel <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2008-01/msg00049.html
Bug-Description:
Bash inappropriately evaluates command substitutions while expanding
directory names as part of command substitution.
Patch:
*** ../bash-3.2-patched/subst.c 2007-12-13 22:31:21.000000000 -0500
--- subst.c 2008-01-17 22:48:15.000000000 -0500
***************
*** 2815,2821 ****
to jump_to_top_level here so we don't endlessly loop. */
WORD_LIST *
! expand_prompt_string (string, quoted)
char *string;
int quoted;
{
WORD_LIST *value;
--- 2895,2902 ----
to jump_to_top_level here so we don't endlessly loop. */
WORD_LIST *
! expand_prompt_string (string, quoted, wflags)
char *string;
int quoted;
+ int wflags;
{
WORD_LIST *value;
***************
*** 2825,2829 ****
return ((WORD_LIST *)NULL);
! td.flags = 0;
td.word = savestring (string);
--- 2906,2910 ----
return ((WORD_LIST *)NULL);
! td.flags = wflags;
td.word = savestring (string);
*** ../bash-3.2-patched/subst.h 2007-03-24 14:51:05.000000000 -0400
--- subst.h 2008-01-17 22:46:08.000000000 -0500
***************
*** 136,140 ****
/* Expand a prompt string. */
! extern WORD_LIST *expand_prompt_string __P((char *, int));
/* Expand STRING just as if you were expanding a word. This also returns
--- 137,141 ----
/* Expand a prompt string. */
! extern WORD_LIST *expand_prompt_string __P((char *, int, int));
/* Expand STRING just as if you were expanding a word. This also returns
*** ../bash-3.2-patched/parse.y 2007-08-25 13:47:06.000000000 -0400
--- parse.y 2008-01-17 22:46:30.000000000 -0500
***************
*** 4367,4371 ****
{
last_exit_value = last_command_exit_value;
! list = expand_prompt_string (result, Q_DOUBLE_QUOTES);
free (result);
result = string_list (list);
--- 4367,4371 ----
{
last_exit_value = last_command_exit_value;
! list = expand_prompt_string (result, Q_DOUBLE_QUOTES, 0);
free (result);
result = string_list (list);
*** ../bash-3.2-patched/bashline.c 2006-07-29 16:39:30.000000000 -0400
--- bashline.c 2008-02-17 12:53:42.000000000 -0500
***************
*** 2358,2362 ****
{
new_dirname = savestring (local_dirname);
! wl = expand_prompt_string (new_dirname, 0); /* does the right thing */
if (wl)
{
--- 2376,2380 ----
{
new_dirname = savestring (local_dirname);
! wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB); /* does the right thing */
if (wl)
{
*** ../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 36
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 37
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-038
Bug-Reported-by: Wojciech Puchar <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2008-03/msg00029.html
Bug-Description:
When reading input lines into a single variable using the `read' builtin,
bash did not free the memory it read after assigining it to the named
variable, causing a memory leak noticable when reading large amounts of
data.
Patch:
*** ../bash-3.2-patched/builtins/read.def 2007-08-25 13:47:07.000000000 -0400
--- builtins/read.def 2008-03-07 12:55:47.000000000 -0500
***************
*** 135,139 ****
char c;
char *input_string, *orig_input_string, *ifs_chars, *prompt, *arrayname;
! char *e, *t, *t1, *ps2;
struct stat tsb;
SHELL_VAR *var;
--- 152,156 ----
char c;
char *input_string, *orig_input_string, *ifs_chars, *prompt, *arrayname;
! char *e, *t, *t1, *ps2, *tofree;
struct stat tsb;
SHELL_VAR *var;
***************
*** 675,678 ****
--- 728,732 ----
/* Check whether or not the number of fields is exactly the same as the
number of variables. */
+ tofree = NULL;
if (*input_string)
{
***************
*** 680,684 ****
t = get_word_from_string (&input_string, ifs_chars, &e);
if (*input_string == 0)
! input_string = t;
else
input_string = strip_trailing_ifs_whitespace (t1, ifs_chars, saw_escape);
--- 734,738 ----
t = get_word_from_string (&input_string, ifs_chars, &e);
if (*input_string == 0)
! tofree = input_string = t;
else
input_string = strip_trailing_ifs_whitespace (t1, ifs_chars, saw_escape);
***************
*** 695,698 ****
--- 749,754 ----
var = bind_read_variable (list->word->word, input_string);
stupidly_hack_special_variables (list->word->word);
+ FREE (tofree);
+
if (var)
VUNSETATTR (var, att_invisible);
*** ../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 37
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 38
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-039
Bug-Reported-by: [email protected]
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL:
Bug-Description:
Bash-3.2 changed the behavior of the [[ command's `=~' operator when the
right-hand side was quoted: it matched the quoted portions as strings.
This patch introduces a new shell option: compat31. When enabled, it
restores the bash-3.1 behavior with respect to evaluating quoted arguments
to the =~ operator.
Patch:
*** ../bash-3.2-patched/execute_cmd.c 2007-12-14 21:12:39.000000000 -0500
--- execute_cmd.c 2008-02-22 21:20:40.000000000 -0500
***************
*** 2547,2551 ****
if (arg1 == 0)
arg1 = nullstr;
! arg2 = cond_expand_word (cond->right->op, rmatch ? 2 : (patmatch ? 1 : 0));
if (arg2 == 0)
arg2 = nullstr;
--- 2552,2557 ----
if (arg1 == 0)
arg1 = nullstr;
! arg2 = cond_expand_word (cond->right->op,
! (rmatch && shell_compatibility_level > 31) ? 2 : (patmatch ? 1 : 0));
if (arg2 == 0)
arg2 = nullstr;
*** ../bash-3.2-patched/shell.h 2003-06-01 15:04:36.000000000 -0400
--- shell.h 2008-02-22 21:16:48.000000000 -0500
***************
*** 90,93 ****
--- 90,94 ----
extern int interactive, interactive_shell;
extern int startup_state;
+ extern int shell_compatibility_level;
/* Structure to pass around that holds a bitmap of file descriptors
*** ../bash-3.2-patched/version.c 2007-12-14 21:12:29.000000000 -0500
--- version.c 2008-04-10 08:22:22.000000000 -0400
***************
*** 44,47 ****
--- 44,50 ----
const char *sccs_version = SCCSVERSION;
+ /* If == 31, shell compatible with bash-3.1, == 32 with bash-3.2, and so on */
+ int shell_compatibility_level = 32;
+
/* Functions for getting, setting, and displaying the shell version. */
*** ../bash-3.2-patched/builtins/shopt.def 2005-02-19 17:25:03.000000000 -0500
--- builtins/shopt.def 2008-04-10 08:13:32.000000000 -0400
***************
*** 102,105 ****
--- 102,107 ----
static int set_shellopts_after_change __P((int));
+ static int set_compatibility_level __P((int));
+
#if defined (RESTRICTED_SHELL)
static int set_restricted_shell __P((int));
***************
*** 107,110 ****
--- 109,113 ----
static int shopt_login_shell;
+ static int shopt_compat31;
typedef int shopt_set_func_t __P((int));
***************
*** 122,125 ****
--- 125,129 ----
{ "cmdhist", &command_oriented_history, (shopt_set_func_t *)NULL },
#endif
+ { "compat31", &shopt_compat31, set_compatibility_level },
{ "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL },
{ "execfail", &no_exit_on_failed_exec, (shopt_set_func_t *)NULL },
***************
*** 460,463 ****
--- 464,479 ----
}
+ static int
+ set_compatibility_level (mode)
+ int mode;
+ {
+ /* Need to change logic here as we add more compatibility levels */
+ if (shopt_compat31)
+ shell_compatibility_level = 31;
+ else
+ shell_compatibility_level = 32;
+ return 0;
+ }
+
#if defined (RESTRICTED_SHELL)
/* Don't allow the value of restricted_shell to be modified. */
*** ../bash-3.2-patched/doc/bash.1 2006-09-28 10:26:05.000000000 -0400
--- doc/bash.1 2008-04-25 12:32:49.000000000 -0400
***************
*** 7978,7981 ****
--- 8200,8209 ----
easy re-editing of multi-line commands.
.TP 8
+ .B compat31
+ If set,
+ .B bash
+ changes its behavior to that of version 3.1 with respect to quoted
+ arguments to the conditional command's =~ operator.
+ .TP 8
.B dotglob
If set,
*** ../bash-20080214/doc/bashref.texi 2008-02-08 21:28:35.000000000 -0500
--- doc/bashref.texi 2008-02-22 21:44:51.000000000 -0500
***************
*** 4053,4056 ****
--- 4061,4069 ----
easy re-editing of multi-line commands.
+ @item compat31
+ If set, Bash
+ changes its behavior to that of version 3.1 with respect to quoted
+ arguments to the conditional command's =~ operator.
+
@item dotglob
If set, Bash includes filenames beginning with a `.' in
*** ../bash-3.2-patched/tests/shopt.right 2005-02-19 17:46:09.000000000 -0500
--- tests/shopt.right 2008-04-28 09:13:07.000000000 -0400
***************
*** 7,10 ****
--- 7,11 ----
shopt -u checkwinsize
shopt -s cmdhist
+ shopt -u compat31
shopt -u dotglob
shopt -u execfail
***************
*** 54,57 ****
--- 55,59 ----
shopt -u checkhash
shopt -u checkwinsize
+ shopt -u compat31
shopt -u dotglob
shopt -u execfail
***************
*** 78,81 ****
--- 80,84 ----
checkhash off
checkwinsize off
+ compat31 off
dotglob off
execfail off
*** ../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 38
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 39
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-040
Bug-Reported-by: John McCabe-Dansted
Bug-Reference-ID:
Bug-Reference-URL: https://bugs.launchpad.net/ubuntu/+source/bash/+bug/202885
Bug-Description:
When using the `set' builtin to list all shell variables, the shell uses
the wrong variable when computing the length of a variable's value.
Patch:
*** ../bash-3.2-patched/array.c 2007-03-24 14:51:03.000000000 -0400
--- array.c 2008-08-17 13:07:04.000000000 -0400
***************
*** 684,688 ****
valstr = element_value (ae) ? sh_double_quote (element_value(ae))
: (char *)NULL;
! elen = STRLEN (indstr) + 8 + STRLEN (valstr);
RESIZE_MALLOCED_BUFFER (result, rlen, (elen + 1), rsize, rsize);
--- 809,813 ----
valstr = element_value (ae) ? sh_double_quote (element_value(ae))
: (char *)NULL;
! elen = STRLEN (is) + 8 + STRLEN (valstr);
RESIZE_MALLOCED_BUFFER (result, rlen, (elen + 1), rsize, rsize);
*** ../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 39
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 40
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-041
Bug-Reported-by: Dan Jacobson <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2008-02/msg00049.html
Bug-Description:
Bash saved and restored the value of `set -o history' while sourcing files,
preventing users from turning off history with `set +o history' in .bashrc.
Patch:
*** ../bash-3.2-patched/bashhist.c 2005-12-26 13:31:16.000000000 -0500
--- bashhist.c 2008-08-17 13:07:40.000000000 -0400
***************
*** 81,84 ****
--- 81,85 ----
becomes zero when we read lines from a file, for example. */
int remember_on_history = 1;
+ int enable_history_list = 1; /* value for `set -o history' */
/* The number of lines that Bash has added to this history session. The
***************
*** 235,239 ****
history_expansion_inhibited = 1;
#endif
! remember_on_history = interact != 0;
history_inhibit_expansion_function = bash_history_inhibit_expansion;
}
--- 236,240 ----
history_expansion_inhibited = 1;
#endif
! remember_on_history = enable_history_list = interact != 0;
history_inhibit_expansion_function = bash_history_inhibit_expansion;
}
*** ../bash-3.2-patched/builtins/set.def 2006-07-27 09:41:43.000000000 -0400
--- builtins/set.def 2008-08-14 16:33:41.000000000 -0400
***************
*** 190,194 ****
#endif /* BANG_HISTORY */
#if defined (HISTORY)
! { "history", '\0', &remember_on_history, bash_set_history, (setopt_get_func_t *)NULL },
#endif
{ "ignoreeof", '\0', &ignoreeof, set_ignoreeof, (setopt_get_func_t *)NULL },
--- 198,202 ----
#endif /* BANG_HISTORY */
#if defined (HISTORY)
! { "history", '\0', &enable_history_list, bash_set_history, (setopt_get_func_t *)NULL },
#endif
{ "ignoreeof", '\0', &ignoreeof, set_ignoreeof, (setopt_get_func_t *)NULL },
***************
*** 382,385 ****
--- 390,394 ----
if (on_or_off == FLAG_ON)
{
+ enable_history_list = 1;
bash_history_enable ();
if (history_lines_this_session == 0)
***************
*** 387,392 ****
}
else
! bash_history_disable ();
! return (1 - remember_on_history);
}
#endif
--- 396,404 ----
}
else
! {
! enable_history_list = 0;
! bash_history_disable ();
! }
! return (1 - enable_history_list);
}
#endif
***************
*** 566,570 ****
{
#if defined (HISTORY)
! remember_on_history = 1;
#endif
ignoreeof = 0;
--- 578,582 ----
{
#if defined (HISTORY)
! remember_on_history = enable_history_list = 1;
#endif
ignoreeof = 0;
*** ../bash-3.2-patched/builtins/evalstring.c 2006-07-28 15:12:16.000000000 -0400
--- builtins/evalstring.c 2008-11-10 21:17:16.000000000 -0500
***************
*** 68,71 ****
--- 68,79 ----
static int cat_file __P((REDIRECT *));
+ #if defined (HISTORY)
+ static void
+ set_history_remembering ()
+ {
+ remember_on_history = enable_history_list;
+ }
+ #endif
+
/* How to force parse_and_execute () to clean up after itself. */
void
***************
*** 116,120 ****
#if defined (HISTORY)
! unwind_protect_int (remember_on_history); /* can be used in scripts */
# if defined (BANG_HISTORY)
if (interactive_shell)
--- 124,131 ----
#if defined (HISTORY)
! if (parse_and_execute_level == 0)
! add_unwind_protect (set_history_remembering, (char *)NULL);
! else
! unwind_protect_int (remember_on_history); /* can be used in scripts */
# if defined (BANG_HISTORY)
if (interactive_shell)
*** ../bash-3.2-patched/bashhist.h 2005-07-01 15:44:41.000000000 -0400
--- bashhist.h 2008-08-17 12:51:07.000000000 -0400
***************
*** 32,35 ****
--- 32,38 ----
extern int remember_on_history;
+ extern int enable_history_list; /* value for `set -o history' */
+ extern int literal_history; /* controlled by `shopt lithist' */
+ extern int force_append_history;
extern int history_lines_this_session;
extern int history_lines_in_file;
*** ../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 40
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 41
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-042
Bug-Reported-by: Archimerged Ark Submedes <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2008-04/msg00041.html
Bug-Description:
An operator precedence error prevented the bash arithmetic evaluator from
parsing conditional commands correctly.
Patch:
*** ../bash-3.2-patched/expr.c 2007-12-13 22:30:43.000000000 -0500
--- expr.c 2008-08-17 13:09:59.000000000 -0400
***************
*** 521,525 ****
noeval++;
}
! val2 = explor ();
if (set_noeval)
noeval--;
--- 521,526 ----
noeval++;
}
!
! val2 = expcond ();
if (set_noeval)
noeval--;
*** ../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 41
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 42
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-043
Bug-Reported-by: Morita Sho <[email protected]>
Bug-Reference-ID:
Bug-Reference-URL: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=478096
Bug-Description:
Side effects caused by setting function-local versions of variables bash
handles specially persisted after the function returned.
Patch:
*** ../bash-3.2-patched/variables.c 2007-08-25 13:47:05.000000000 -0400
--- variables.c 2008-11-09 17:47:31.000000000 -0500
***************
*** 3459,3465 ****
var->attributes &= ~(att_tempvar|att_propagate);
else
! shell_variables->flags |= VC_HASTMPVAR;
v->attributes |= var->attributes;
}
dispose_variable (var);
--- 3771,3779 ----
var->attributes &= ~(att_tempvar|att_propagate);
else
! shell_variables->flags |= VC_HASTMPVAR;
v->attributes |= var->attributes;
}
+ else
+ stupidly_hack_special_variables (var->name); /* XXX */
dispose_variable (var);
***************
*** 3548,3551 ****
--- 3862,3867 ----
v->attributes |= var->attributes;
}
+ else
+ stupidly_hack_special_variables (var->name); /* XXX */
dispose_variable (var);
*** ../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 42
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 43
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-044
Bug-Reported-by: slinkp <[email protected]>
Bug-Reference-ID: <da52a26a-9f38-4861-a918-14d3482b539d@c65g2000hsa.googlegroups.com>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2008-05/msg00085.html
Bug-Description:
The presence of invisible characters in a prompt longer than the screenwidth
with invisible characters on the first and last prompt lines caused readline
to place the cursor in the wrong physical location.
Patch:
*** ../bash-3.2-patched/lib/readline/display.c 2007-12-14 21:12:40.000000000 -0500
--- lib/readline/display.c 2008-10-23 09:39:46.000000000 -0400
***************
*** 911,914 ****
--- 944,951 ----
OFFSET (which has already been calculated above). */
+ #define INVIS_FIRST() (prompt_physical_chars > _rl_screenwidth ? prompt_invis_chars_first_line : wrap_offset)
+ #define WRAP_OFFSET(line, offset) ((line == 0) \
+ ? (offset ? INVIS_FIRST() : 0) \
+ : ((line == prompt_last_screen_line) ? wrap_offset-prompt_invis_chars_first_line : 0))
#define W_OFFSET(line, offset) ((line) == 0 ? offset : 0)
#define VIS_LLEN(l) ((l) > _rl_vis_botlin ? 0 : (vis_lbreaks[l+1] - vis_lbreaks[l]))
***************
*** 945,949 ****
_rl_last_c_pos > wrap_offset &&
o_cpos < prompt_last_invisible)
! _rl_last_c_pos -= wrap_offset;
/* If this is the line with the prompt, we might need to
--- 982,992 ----
_rl_last_c_pos > wrap_offset &&
o_cpos < prompt_last_invisible)
! _rl_last_c_pos -= prompt_invis_chars_first_line; /* XXX - was wrap_offset */
! else if (linenum == prompt_last_screen_line && prompt_physical_chars > _rl_screenwidth &&
! (MB_CUR_MAX > 1 && rl_byte_oriented == 0) &&
! cpos_adjusted == 0 &&
! _rl_last_c_pos != o_cpos &&
! _rl_last_c_pos > (prompt_last_invisible - _rl_screenwidth - prompt_invis_chars_first_line))
! _rl_last_c_pos -= (wrap_offset-prompt_invis_chars_first_line);
/* If this is the line with the prompt, we might need to
***************
*** 1205,1209 ****
{
register char *ofd, *ols, *oe, *nfd, *nls, *ne;
! int temp, lendiff, wsatend, od, nd, o_cpos;
int current_invis_chars;
int col_lendiff, col_temp;
--- 1264,1268 ----
{
register char *ofd, *ols, *oe, *nfd, *nls, *ne;
! int temp, lendiff, wsatend, od, nd, twidth, o_cpos;
int current_invis_chars;
int col_lendiff, col_temp;
***************
*** 1221,1225 ****
temp = _rl_last_c_pos;
else
! temp = _rl_last_c_pos - W_OFFSET(_rl_last_v_pos, visible_wrap_offset);
if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode
&& _rl_last_v_pos == current_line - 1)
--- 1280,1284 ----
temp = _rl_last_c_pos;
else
! temp = _rl_last_c_pos - WRAP_OFFSET (_rl_last_v_pos, visible_wrap_offset);
if (temp == _rl_screenwidth && _rl_term_autowrap && !_rl_horizontal_scroll_mode
&& _rl_last_v_pos == current_line - 1)
***************
*** 1587,1599 ****
{
_rl_output_some_chars (nfd + lendiff, temp - lendiff);
- #if 1
/* XXX -- this bears closer inspection. Fixes a redisplay bug
reported against bash-3.0-alpha by Andreas Schwab involving
multibyte characters and prompt strings with invisible
characters, but was previously disabled. */
! _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-col_lendiff);
! #else
! _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-lendiff);
! #endif
}
}
--- 1648,1660 ----
{
_rl_output_some_chars (nfd + lendiff, temp - lendiff);
/* XXX -- this bears closer inspection. Fixes a redisplay bug
reported against bash-3.0-alpha by Andreas Schwab involving
multibyte characters and prompt strings with invisible
characters, but was previously disabled. */
! if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
! twidth = _rl_col_width (nfd+lendiff, 0, temp-col_lendiff);
! else
! twidth = temp - lendiff;
! _rl_last_c_pos += twidth;
}
}
***************
*** 1789,1793 ****
int cpos, dpos; /* current and desired cursor positions */
! woff = W_OFFSET (_rl_last_v_pos, wrap_offset);
cpos = _rl_last_c_pos;
#if defined (HANDLE_MULTIBYTE)
--- 1850,1854 ----
int cpos, dpos; /* current and desired cursor positions */
! woff = WRAP_OFFSET (_rl_last_v_pos, wrap_offset);
cpos = _rl_last_c_pos;
#if defined (HANDLE_MULTIBYTE)
***************
*** 1803,1807 ****
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;
--- 1864,1872 ----
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 */
! (prompt_physical_chars > _rl_screenwidth &&
! _rl_last_v_pos == prompt_last_screen_line &&
! wrap_offset != woff &&
! new > (prompt_last_invisible-_rl_screenwidth-wrap_offset)))
{
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 43
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 44
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-045
Bug-Reported-by: Roman Rakus <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2008-06/msg00098.html
Bug-Description:
When short-circuiting execution due to the `break' or `continue' builtins,
bash did not preserve the value of $?.
Patch:
*** ../bash-3.2-patched/execute_cmd.c 2008-04-28 22:00:24.000000000 -0400
--- execute_cmd.c 2008-10-18 14:35:03.000000000 -0400
***************
*** 502,507 ****
--- 514,526 ----
volatile int save_line_number;
+ #if 0
if (command == 0 || breaking || continuing || read_but_dont_execute)
return (EXECUTION_SUCCESS);
+ #else
+ if (breaking || continuing)
+ return (last_command_exit_value);
+ if (command == 0 || read_but_dont_execute)
+ return (EXECUTION_SUCCESS);
+ #endif
QUIT;
*** ../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 44
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 45
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-046
Bug-Reported-by: Wang Xin <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2008-07/msg00014.html
Bug-Description:
Bash did not compute the length of multibyte characters correctly when
performing array element length references (e.g., ${#var[subscript]}).
Patch:
*** /usr/src/local/bash/bash-3.2-patched/subst.c 2008-04-28 22:00:20.000000000 -0400
--- subst.c 2008-11-10 22:02:38.000000000 -0500
***************
*** 4813,4817 ****
t = (ind == 0) ? value_cell (var) : (char *)NULL;
! len = STRLEN (t);
return (len);
}
--- 4813,4817 ----
t = (ind == 0) ? value_cell (var) : (char *)NULL;
! len = MB_STRLEN (t);
return (len);
}
*** ../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 45
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 46
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-047
Bug-Reported-by: Roman Rakus <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2008-08/msg00026.html
Bug-Description:
When using the `.' (source) builtin, under certain circumstances bash was
too careful in discarding state to preserve internal consistency. One
effect was that assignments to readonly variables would cause entire scripts
to be aborted instead of execution of the offending command. This behavior
was introduced by bash-3.2 patch 20.
Patch:
*** /usr/src/local/chet/src/bash/bash-3.2-patched/subst.c 2008-04-29 21:24:55.000000000 -0400
--- subst.c 2008-11-13 17:44:25.000000000 -0500
***************
*** 138,142 ****
extern int last_command_exit_value, last_command_exit_signal;
extern int subshell_environment;
! extern int subshell_level;
extern int eof_encountered;
extern int return_catch_flag, return_catch_value;
--- 138,142 ----
extern int last_command_exit_value, last_command_exit_signal;
extern int subshell_environment;
! extern int subshell_level, parse_and_execute_level;
extern int eof_encountered;
extern int return_catch_flag, return_catch_value;
***************
*** 7673,7677 ****
expanding_redir = 0;
! top_level_cleanup (); /* from sig.c */
jump_to_top_level (v);
--- 7673,7679 ----
expanding_redir = 0;
! if (parse_and_execute_level == 0)
! top_level_cleanup (); /* from sig.c */
!
jump_to_top_level (v);
*** ../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 46
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 47
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-048
Bug-Reported-by: Steffen Kiess <[email protected]>
Bug-Reference-ID: <1223929957.5383.6.camel@fips>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2008-10/msg00047.html
Bug-Description:
When invoked as `bash -c', bash did not execute an EXIT trap when the last
command in the executed list was a command run from the file system.
Patch:
*** /Users/chet/src/bash/bash-3.2-patched/builtins/evalstring.c 2006-07-28 15:12:16.000000000 -0400
--- builtins/evalstring.c 2008-11-13 18:38:45.000000000 -0500
***************
*** 249,252 ****
--- 249,253 ----
* we're not running a trap AND
* we have parsed the full command (string == '\0') AND
+ * we're not going to run the exit trap AND
* we have a simple command without redirections AND
* the command is not being timed AND
***************
*** 259,263 ****
*bash_input.location.string == '\0' &&
command->type == cm_simple &&
! !command->redirects && !command->value.Simple->redirects &&
((command->flags & CMD_TIME_PIPELINE) == 0) &&
((command->flags & CMD_INVERT_RETURN) == 0))
--- 260,265 ----
*bash_input.location.string == '\0' &&
command->type == cm_simple &&
! signal_is_trapped (EXIT_TRAP) == 0 &&
! command->redirects == 0 && command->value.Simple->redirects == 0 &&
((command->flags & CMD_TIME_PIPELINE) == 0) &&
((command->flags & CMD_INVERT_RETURN) == 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 47
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 48
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-049
Bug-Reported-by: Len Lattanzi <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL:
Bug-Description:
On systems where mbrtowc() returns -2 when passed a length argument with
value 0, when using a multibyte locale, Readline's emacs-mode forward-char
at the end of a line will leave the point beyond the end of the line.
Patch:
*** ../bash-3.2-patched/lib/readline/mbutil.c 2009-05-29 23:09:26.000000000 -0400
--- lib/readline/mbutil.c 2009-05-29 23:10:12.000000000 -0400
***************
*** 78,82 ****
int seed, count, find_non_zero;
{
! size_t tmp;
mbstate_t ps;
int point;
--- 78,82 ----
int seed, count, find_non_zero;
{
! size_t tmp, len;
mbstate_t ps;
int point;
***************
*** 99,103 ****
while (count > 0)
{
! tmp = mbrtowc (&wc, string+point, strlen(string + point), &ps);
if (MB_INVALIDCH ((size_t)tmp))
{
--- 99,106 ----
while (count > 0)
{
! len = strlen (string + point);
! if (len == 0)
! break;
! tmp = mbrtowc (&wc, string+point, len, &ps);
if (MB_INVALIDCH ((size_t)tmp))
{
*** ../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 48
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 49
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-050
Bug-Reported-by: Jan Hnatek <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2009-06/msg00084.html
Bug-Description:
On systems where mbrtowc() returns -2 when passed a length argument with
value 0, when using a multibyte locale, Readline's emacs-mode forward-char
at the end of a line will leave the point beyond the end of the line.
Patch:
*** ../bash-3.2-patched/lib/readline/mbutil.c 2009-06-16 11:26:50.000000000 -0400
--- lib/readline/mbutil.c 2009-01-04 14:32:33.000000000 -0500
***************
*** 132,141 ****
{
tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
! while (tmp > 0 && wcwidth (wc) == 0)
{
point += tmp;
tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
- if (MB_NULLWCH (tmp) || MB_INVALIDCH (tmp))
- break;
}
}
--- 130,137 ----
{
tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
! while (MB_NULLWCH (tmp) == 0 && MB_INVALIDCH (tmp) == 0 && wcwidth (wc) == 0)
{
point += tmp;
tmp = mbrtowc (&wc, string + point, strlen (string + point), &ps);
}
}
*** ../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 49
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 50
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-051
Bug-Reported-by: [email protected]
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2010-02/msg00132.html
Bug-Description:
When the `read' builtin times out after the timeout specified with -t is
exceeded, it does not reset the flags that tell signal handlers to process
signals immediately instead of deferring their handling. This can result
in unsafe functions being called from signal handlers, which can cause bash
to hang or dump core.
Patch:
*** ../bash-3.2-patched/builtins/read.def 2008-04-29 21:25:00.000000000 -0400
--- builtins/read.def 2010-03-17 09:50:51.000000000 -0400
***************
*** 327,330 ****
--- 327,332 ----
if (code)
{
+ interrupt_immediately--;
+ terminate_immediately = 0;
run_unwind_frame ("read_builtin");
return (EXECUTION_FAILURE);
*** ../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 50
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 51
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-052
Bug-Reported-by: Stephane Chazelas <[email protected]>
Bug-Reference-ID:
Bug-Reference-URL:
Bug-Description:
Under certain circumstances, bash will execute user code while processing the
environment for exported function definitions.
Patch (apply with `patch -p0'):
*** ../bash-3.2.51/builtins/common.h 2006-03-06 09:38:44.000000000 -0500
--- builtins/common.h 2014-09-16 19:08:02.000000000 -0400
***************
*** 34,37 ****
--- 34,39 ----
/* Flags for describe_command, shared between type.def and command.def */
+ #define SEVAL_FUNCDEF 0x080 /* only allow function definitions */
+ #define SEVAL_ONECMD 0x100 /* only allow a single command */
#define CDESC_ALL 0x001 /* type -a */
#define CDESC_SHORTDESC 0x002 /* command -V */
*** ../bash-3.2.51/builtins/evalstring.c 2008-11-15 17:47:04.000000000 -0500
--- builtins/evalstring.c 2014-09-16 19:08:02.000000000 -0400
***************
*** 235,238 ****
--- 235,246 ----
struct fd_bitmap *bitmap;
+ if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def)
+ {
+ internal_warning ("%s: ignoring function definition attempt", from_file);
+ should_jump_to_top_level = 0;
+ last_result = last_command_exit_value = EX_BADUSAGE;
+ break;
+ }
+
bitmap = new_fd_bitmap (FD_BITMAP_SIZE);
begin_unwind_frame ("pe_dispose");
***************
*** 292,295 ****
--- 300,306 ----
dispose_fd_bitmap (bitmap);
discard_unwind_frame ("pe_dispose");
+
+ if (flags & SEVAL_ONECMD)
+ break;
}
}
*** ../bash-3.2.51/variables.c 2008-11-15 17:15:06.000000000 -0500
--- variables.c 2014-09-16 19:10:39.000000000 -0400
***************
*** 319,328 ****
strcpy (temp_string + char_index + 1, string);
! parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST);
!
! /* Ancient backwards compatibility. Old versions of bash exported
! functions like name()=() {...} */
! if (name[char_index - 1] == ')' && name[char_index - 2] == '(')
! name[char_index - 2] = '\0';
if (temp_var = find_function (name))
--- 319,326 ----
strcpy (temp_string + char_index + 1, string);
! /* Don't import function names that are invalid identifiers from the
! environment. */
! if (legal_identifier (name))
! parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD);
if (temp_var = find_function (name))
***************
*** 333,340 ****
else
report_error (_("error importing function definition for `%s'"), name);
-
- /* ( */
- if (name[char_index - 1] == ')' && name[char_index - 2] == '\0')
- name[char_index - 2] = '('; /* ) */
}
#if defined (ARRAY_VARS)
--- 331,334 ----
*** ../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 51
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 52
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-053
Bug-Reported-by: Tavis Ormandy <[email protected]>
Bug-Reference-ID:
Bug-Reference-URL: http://twitter.com/taviso/statuses/514887394294652929
Bug-Description:
Under certain circumstances, bash can incorrectly save a lookahead character and
return it on a subsequent call, even when reading a new line.
Patch:
*** ../bash-3.2.52/parse.y 2008-04-29 21:24:55.000000000 -0400
--- parse.y 2014-09-25 16:18:41.000000000 -0400
***************
*** 2504,2507 ****
--- 2504,2509 ----
word_desc_to_read = (WORD_DESC *)NULL;
+ eol_ungetc_lookahead = 0;
+
last_read_token = '\n';
token_to_read = '\n';
*** ../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 52
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 53
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-054
Bug-Reported-by: Florian Weimer <[email protected]>
Bug-Reference-ID:
Bug-Reference-URL:
Bug-Description:
This patch changes the encoding bash uses for exported functions to avoid
clashes with shell variables and to avoid depending only on an environment
variable's contents to determine whether or not to interpret it as a shell
function.
Patch:
*** ../bash-3.2.53/variables.c 2014-09-16 19:10:39.000000000 -0400
--- variables.c 2014-09-27 21:02:08.000000000 -0400
***************
*** 75,78 ****
--- 75,83 ----
#define ifsname(s) ((s)[0] == 'I' && (s)[1] == 'F' && (s)[2] == 'S' && (s)[3] == '\0')
+ #define BASHFUNC_PREFIX "BASH_FUNC_"
+ #define BASHFUNC_PREFLEN 10 /* == strlen(BASHFUNC_PREFIX */
+ #define BASHFUNC_SUFFIX "%%"
+ #define BASHFUNC_SUFFLEN 2 /* == strlen(BASHFUNC_SUFFIX) */
+
extern char **environ;
***************
*** 242,246 ****
static void dispose_temporary_env __P((sh_free_func_t *));
! static inline char *mk_env_string __P((const char *, const char *));
static char **make_env_array_from_var_list __P((SHELL_VAR **));
static char **make_var_export_array __P((VAR_CONTEXT *));
--- 247,251 ----
static void dispose_temporary_env __P((sh_free_func_t *));
! static inline char *mk_env_string __P((const char *, const char *, int));
static char **make_env_array_from_var_list __P((SHELL_VAR **));
static char **make_var_export_array __P((VAR_CONTEXT *));
***************
*** 310,328 ****
/* If exported function, define it now. Don't import functions from
the environment in privileged mode. */
! if (privmode == 0 && read_but_dont_execute == 0 && STREQN ("() {", string, 4))
{
string_length = strlen (string);
! temp_string = (char *)xmalloc (3 + string_length + char_index);
! strcpy (temp_string, name);
! temp_string[char_index] = ' ';
! strcpy (temp_string + char_index + 1, string);
/* Don't import function names that are invalid identifiers from the
environment. */
! if (legal_identifier (name))
! parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD);
! if (temp_var = find_function (name))
{
VSETATTR (temp_var, (att_exported|att_imported));
--- 315,344 ----
/* If exported function, define it now. Don't import functions from
the environment in privileged mode. */
! if (privmode == 0 && read_but_dont_execute == 0 &&
! STREQN (BASHFUNC_PREFIX, name, BASHFUNC_PREFLEN) &&
! STREQ (BASHFUNC_SUFFIX, name + char_index - BASHFUNC_SUFFLEN) &&
! STREQN ("() {", string, 4))
{
+ size_t namelen;
+ char *tname; /* desired imported function name */
+
+ namelen = char_index - BASHFUNC_PREFLEN - BASHFUNC_SUFFLEN;
+
+ tname = name + BASHFUNC_PREFLEN; /* start of func name */
+ tname[namelen] = '\0'; /* now tname == func name */
+
string_length = strlen (string);
! temp_string = (char *)xmalloc (namelen + string_length + 2);
! memcpy (temp_string, tname, namelen);
! temp_string[namelen] = ' ';
! memcpy (temp_string + namelen + 1, string, string_length + 1);
/* Don't import function names that are invalid identifiers from the
environment. */
! if (absolute_program (tname) == 0 && (posixly_correct == 0 || legal_identifier (tname)))
! parse_and_execute (temp_string, tname, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD);
! if (temp_var = find_function (tname))
{
VSETATTR (temp_var, (att_exported|att_imported));
***************
*** 330,334 ****
}
else
! report_error (_("error importing function definition for `%s'"), name);
}
#if defined (ARRAY_VARS)
--- 346,353 ----
}
else
! report_error (_("error importing function definition for `%s'"), tname);
!
! /* Restore original suffix */
! tname[namelen] = BASHFUNC_SUFFIX[0];
}
#if defined (ARRAY_VARS)
***************
*** 2208,2212 ****
INVALIDATE_EXPORTSTR (var);
! var->exportstr = mk_env_string (name, value);
array_needs_making = 1;
--- 2227,2231 ----
INVALIDATE_EXPORTSTR (var);
! var->exportstr = mk_env_string (name, value, 0);
array_needs_making = 1;
***************
*** 2999,3017 ****
static inline char *
! mk_env_string (name, value)
const char *name, *value;
{
! int name_len, value_len;
! char *p;
name_len = strlen (name);
value_len = STRLEN (value);
! p = (char *)xmalloc (2 + name_len + value_len);
! strcpy (p, name);
! p[name_len] = '=';
if (value && *value)
! strcpy (p + name_len + 1, value);
else
! p[name_len + 1] = '\0';
return (p);
}
--- 3018,3057 ----
static inline char *
! mk_env_string (name, value, isfunc)
const char *name, *value;
+ int isfunc;
{
! size_t name_len, value_len;
! char *p, *q;
name_len = strlen (name);
value_len = STRLEN (value);
!
! /* If we are exporting a shell function, construct the encoded function
! name. */
! if (isfunc && value)
! {
! p = (char *)xmalloc (BASHFUNC_PREFLEN + name_len + BASHFUNC_SUFFLEN + value_len + 2);
! q = p;
! memcpy (q, BASHFUNC_PREFIX, BASHFUNC_PREFLEN);
! q += BASHFUNC_PREFLEN;
! memcpy (q, name, name_len);
! q += name_len;
! memcpy (q, BASHFUNC_SUFFIX, BASHFUNC_SUFFLEN);
! q += BASHFUNC_SUFFLEN;
! }
! else
! {
! p = (char *)xmalloc (2 + name_len + value_len);
! memcpy (p, name, name_len);
! q = p + name_len;
! }
!
! q[0] = '=';
if (value && *value)
! memcpy (q + 1, value, value_len + 1);
else
! q[1] = '\0';
!
return (p);
}
***************
*** 3088,3092 ****
using the cached exportstr... */
list[list_index] = USE_EXPORTSTR ? savestring (value)
! : mk_env_string (var->name, value);
if (USE_EXPORTSTR == 0)
--- 3128,3132 ----
using the cached exportstr... */
list[list_index] = USE_EXPORTSTR ? savestring (value)
! : mk_env_string (var->name, value, function_p (var));
if (USE_EXPORTSTR == 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 53
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 54
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-055
Bug-Reported-by: Florian Weimer <[email protected]>
Bug-Reference-ID:
Bug-Reference-URL:
Bug-Description:
There are two local buffer overflows in parse.y that can cause the shell
to dump core when given many here-documents attached to a single command
or many nested loops.
Patch:
*** ../bash-3.2.54/parse.y 2014-09-27 12:17:16.000000000 -0400
--- parse.y 2014-09-30 19:43:22.000000000 -0400
***************
*** 166,169 ****
--- 166,172 ----
static int reserved_word_acceptable __P((int));
static int yylex __P((void));
+
+ static void push_heredoc __P((REDIRECT *));
+ static char *mk_alexpansion __P((char *));
static int alias_expand_token __P((char *));
static int time_command_acceptable __P((void));
***************
*** 254,258 ****
/* Variables to manage the task of reading here documents, because we need to
defer the reading until after a complete command has been collected. */
! static REDIRECT *redir_stack[10];
int need_here_doc;
--- 257,263 ----
/* Variables to manage the task of reading here documents, because we need to
defer the reading until after a complete command has been collected. */
! #define HEREDOC_MAX 16
!
! static REDIRECT *redir_stack[HEREDOC_MAX];
int need_here_doc;
***************
*** 280,284 ****
index is decremented after a case, select, or for command is parsed. */
#define MAX_CASE_NEST 128
! static int word_lineno[MAX_CASE_NEST];
static int word_top = -1;
--- 285,289 ----
index is decremented after a case, select, or for command is parsed. */
#define MAX_CASE_NEST 128
! static int word_lineno[MAX_CASE_NEST+1];
static int word_top = -1;
***************
*** 425,429 ****
redir.filename = $2;
$$ = make_redirection (0, r_reading_until, redir);
! redir_stack[need_here_doc++] = $$;
}
| NUMBER LESS_LESS WORD
--- 430,434 ----
redir.filename = $2;
$$ = make_redirection (0, r_reading_until, redir);
! push_heredoc ($$);
}
| NUMBER LESS_LESS WORD
***************
*** 431,435 ****
redir.filename = $3;
$$ = make_redirection ($1, r_reading_until, redir);
! redir_stack[need_here_doc++] = $$;
}
| LESS_LESS_LESS WORD
--- 436,440 ----
redir.filename = $3;
$$ = make_redirection ($1, r_reading_until, redir);
! push_heredoc ($$);
}
| LESS_LESS_LESS WORD
***************
*** 488,492 ****
$$ = make_redirection
(0, r_deblank_reading_until, redir);
! redir_stack[need_here_doc++] = $$;
}
| NUMBER LESS_LESS_MINUS WORD
--- 493,497 ----
$$ = make_redirection
(0, r_deblank_reading_until, redir);
! push_heredoc ($$);
}
| NUMBER LESS_LESS_MINUS WORD
***************
*** 495,499 ****
$$ = make_redirection
($1, r_deblank_reading_until, redir);
! redir_stack[need_here_doc++] = $$;
}
| GREATER_AND '-'
--- 500,504 ----
$$ = make_redirection
($1, r_deblank_reading_until, redir);
! push_heredoc ($$);
}
| GREATER_AND '-'
***************
*** 2214,2217 ****
--- 2219,2237 ----
static int esacs_needed_count;
+ static void
+ push_heredoc (r)
+ REDIRECT *r;
+ {
+ if (need_here_doc >= HEREDOC_MAX)
+ {
+ last_command_exit_value = EX_BADUSAGE;
+ need_here_doc = 0;
+ report_syntax_error (_("maximum here-document count exceeded"));
+ reset_parser ();
+ exit_shell (last_command_exit_value);
+ }
+ redir_stack[need_here_doc++] = r;
+ }
+
void
gather_here_documents ()
*** ../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 54
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 55
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-056
Bug-Reported-by: Michal Zalewski <[email protected]>
Bug-Reference-ID:
Bug-Reference-URL:
Bug-Description:
When bash is parsing a function definition that contains a here-document
delimited by end-of-file (or end-of-string), it leaves the closing delimiter
uninitialized. This can result in an invalid memory access when the parsed
function is later copied.
Patch:
*** ../bash-3.2.55/make_cmd.c 2006-09-12 09:21:22.000000000 -0400
--- make_cmd.c 2014-10-02 11:41:40.000000000 -0400
***************
*** 677,680 ****
--- 677,681 ----
temp->redirector = source;
temp->redirectee = dest_and_filename;
+ temp->here_doc_eof = 0;
temp->instruction = instruction;
temp->flags = 0;
*** ../bash-3.2.55/copy_cmd.c 2003-10-07 11:43:44.000000000 -0400
--- copy_cmd.c 2014-10-02 11:41:40.000000000 -0400
***************
*** 117,121 ****
case r_reading_until:
case r_deblank_reading_until:
! new_redirect->here_doc_eof = savestring (redirect->here_doc_eof);
/*FALLTHROUGH*/
case r_reading_string:
--- 117,121 ----
case r_reading_until:
case r_deblank_reading_until:
! new_redirect->here_doc_eof = redirect->here_doc_eof ? savestring (redirect->here_doc_eof) : 0;
/*FALLTHROUGH*/
case r_reading_string:
*** ../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 55
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 56
#endif /* _PATCHLEVEL_H_ */
BASH PATCH REPORT
=================
Bash-Release: 3.2
Patch-ID: bash32-057
Bug-Reported-by: Michal Zalewski <[email protected]>
Bug-Reference-ID:
Bug-Reference-URL:
Bug-Description:
A combination of nested command substitutions and function importing from
the environment can cause bash to execute code appearing in the environment
variable value following the function definition.
Patch:
*** ../bash-3.2.56/builtins/evalstring.c 2014-09-16 19:08:02.000000000 -0400
--- builtins/evalstring.c 2014-10-04 15:58:35.000000000 -0400
***************
*** 44,47 ****
--- 44,48 ----
#include "../redir.h"
#include "../trap.h"
+ #include "../bashintl.h"
#if defined (HISTORY)
***************
*** 235,244 ****
struct fd_bitmap *bitmap;
! if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def)
{
! internal_warning ("%s: ignoring function definition attempt", from_file);
! should_jump_to_top_level = 0;
! last_result = last_command_exit_value = EX_BADUSAGE;
! break;
}
--- 236,258 ----
struct fd_bitmap *bitmap;
! if (flags & SEVAL_FUNCDEF)
{
! char *x;
!
! /* If the command parses to something other than a straight
! function definition, or if we have not consumed the entire
! string, or if the parser has transformed the function
! name (as parsing will if it begins or ends with shell
! whitespace, for example), reject the attempt */
! if (command->type != cm_function_def ||
! ((x = parser_remaining_input ()) && *x) ||
! (STREQ (from_file, command->value.Function_def->name->word) == 0))
! {
! internal_warning (_("%s: ignoring function definition attempt"), from_file);
! should_jump_to_top_level = 0;
! last_result = last_command_exit_value = EX_BADUSAGE;
! reset_parser ();
! break;
! }
}
***************
*** 302,306 ****
if (flags & SEVAL_ONECMD)
! break;
}
}
--- 316,323 ----
if (flags & SEVAL_ONECMD)
! {
! reset_parser ();
! break;
! }
}
}
*** ../bash-3.2.56/parse.y 2014-09-30 19:43:22.000000000 -0400
--- parse.y 2014-10-04 15:58:35.000000000 -0400
***************
*** 2125,2128 ****
--- 2125,2138 ----
}
+ char *
+ parser_remaining_input ()
+ {
+ if (shell_input_line == 0)
+ return 0;
+ if (shell_input_line_index < 0 || shell_input_line_index >= shell_input_line_len)
+ return '\0'; /* XXX */
+ return (shell_input_line + shell_input_line_index);
+ }
+
#ifdef INCLUDE_UNUSED
/* Back the input pointer up by one, effectively `ungetting' a character. */
*** ../bash-3.2.56/shell.h 2008-04-28 22:00:24.000000000 -0400
--- shell.h 2014-10-04 15:58:35.000000000 -0400
***************
*** 161,164 ****
--- 161,166 ----
/* Let's try declaring these here. */
+ extern char *parser_remaining_input __P((void));
+
extern sh_parser_state_t *save_parser_state __P((sh_parser_state_t *));
extern void restore_parser_state __P((sh_parser_state_t *));
*** ../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 56
#endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
looks for to find the patch level (for the sccs version string). */
! #define PATCHLEVEL 57
#endif /* _PATCHLEVEL_H_ */
Disable function importing from the environment by default. This can be
enabled by using --import-functions or enabling the IMPORTFUNCTIONS option.
This removes the risk of further parser bugs leading to code execution, as
well as the risk to setuid scripts and poorly written applications that
do not cleanse their environment [1][2].
Also note that there is an unofficial 4.3.26 floating around that has not yet
been officially released. r369261 covers the change in 4.3.26.
See also:
http://seclists.org/oss-sec/2014/q3/747 [1]
http://seclists.org/oss-sec/2014/q3/746 [2]
http://seclists.org/oss-sec/2014/q3/755 [3]
https://svnweb.freebsd.org/ports/head/shells/bash/files/extrapatch-import-functions?view=markup&pathrev=369341
Obtained from: NetBSD (based on) [3]
PR: 193932
Reviewed by: Eric Vangyzen
With hat: portmgr
Based on christos@NetBSD's patch
Reworked for bash 3.2 for OSX by @alblue
--- shell.c.orig 2009-06-12 00:29:43.000000000 +0100
+++ shell.c 2014-09-27 10:48:03.000000000 +0100
@@ -211,6 +211,7 @@
#else
int posixly_correct = 0; /* Non-zero means posix.2 superset. */
#endif
+int import_functions = 0; /* Import functions from environment */
/* Some long-winded argument names. These are obviously new. */
@@ -231,6 +232,7 @@
{ "help", Int, &want_initial_help, (char **)0x0 },
{ "init-file", Charp, (int *)0x0, &bashrc_file },
{ "login", Int, &make_login_shell, (char **)0x0 },
+ { "import-functions", Int, &import_functions, (char **)0x0 },
{ "noediting", Int, &no_line_editing, (char **)0x0 },
{ "noprofile", Int, &no_profile, (char **)0x0 },
{ "norc", Int, &no_rc, (char **)0x0 },
--- variables.c.orig 2014-09-27 10:46:39.000000000 +0100
+++ variables.c 2014-09-27 10:49:36.000000000 +0100
@@ -92,6 +92,7 @@
extern char *this_command_name;
extern char *command_execution_string;
extern time_t shell_start_time;
+extern int import_functions;
#if defined (READLINE)
extern int no_line_editing;
@@ -309,7 +310,7 @@
/* If exported function, define it now. Don't import functions from
the environment in privileged mode. */
- if (privmode == 0 && read_but_dont_execute == 0 && STREQN ("() {", string, 4))
+ if (import_functions && privmode == 0 && read_but_dont_execute == 0 && STREQN ("() {", string, 4))
{
string_length = strlen (string);
temp_string = (char *)xmalloc (3 + string_length + char_index);
READLINE PATCH REPORT
=====================
Readline-Release: 6.3
Patch-ID: readline63-001
Bug-Reported-by: Daan van Rossum <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL:
Bug-Description:
The `.' command in vi mode cannot undo multi-key commands beginning with
`c', `d', and `y' (command plus motion specifier).
Patch (apply with `patch -p0'):
*** ../readline-6.3/readline.c 2013-10-28 14:58:06.000000000 -0400
--- readline.c 2014-03-07 15:20:33.000000000 -0500
***************
*** 965,969 ****
if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
key != ANYOTHERKEY &&
! rl_key_sequence_length == 1 && /* XXX */
_rl_vi_textmod_command (key))
_rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
--- 965,969 ----
if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
key != ANYOTHERKEY &&
! _rl_dispatching_keymap == vi_movement_keymap &&
_rl_vi_textmod_command (key))
_rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
*** ../readline-6.3/patchlevel 2013-11-15 08:11:11.000000000 -0500
--- patchlevel 2014-03-21 08:28:40.000000000 -0400
***************
*** 1,3 ****
# Do not edit -- exists only for use by patch
! 5
--- 1,3 ----
# Do not edit -- exists only for use by patch
! 1
READLINE PATCH REPORT
=====================
Readline-Release: 6.3
Patch-ID: readline63-002
Bug-Reported-by: Anatol Pomozov <[email protected]>
Bug-Reference-ID: <CAOMFOmXy3mT2So5GQ5F-smCVArQuAeBwZ2QKzgCtMeXJoDeYOQ@mail.gmail.com>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-readline/2014-03/msg00010.html
Bug-Description:
When in callback mode, some readline commands can cause readline to seg
fault by passing invalid contexts to callback functions.
Patch (apply with `patch -p0'):
*** ../readline-6.3/readline.c 2013-10-28 14:58:06.000000000 -0400
--- readline.c 2014-03-10 14:15:02.000000000 -0400
***************
*** 745,749 ****
RL_CHECK_SIGNALS ();
! if (r == 0) /* success! */
{
_rl_keyseq_chain_dispose ();
--- 745,750 ----
RL_CHECK_SIGNALS ();
! /* We only treat values < 0 specially to simulate recursion. */
! if (r >= 0 || (r == -1 && (cxt->flags & KSEQ_SUBSEQ) == 0)) /* success! or failure! */
{
_rl_keyseq_chain_dispose ();
*** ../readline-6.3/patchlevel 2013-11-15 08:11:11.000000000 -0500
--- patchlevel 2014-03-21 08:28:40.000000000 -0400
***************
*** 1,3 ****
# Do not edit -- exists only for use by patch
! 1
--- 1,3 ----
# Do not edit -- exists only for use by patch
! 2
READLINE PATCH REPORT
=====================
Readline-Release: 6.3
Patch-ID: readline63-003
Bug-Reported-by:
Bug-Reference-ID:
Bug-Reference-URL:
Bug-Description:
There are debugging functions in the readline release that are theoretically
exploitable as security problems. They are not public functions, but have
global linkage.
Patch (apply with `patch -p0'):
*** ../readline-6.3/util.c 2013-09-02 13:36:12.000000000 -0400
--- util.c 2014-03-20 10:25:53.000000000 -0400
***************
*** 477,480 ****
--- 479,483 ----
}
+ #if defined (DEBUG)
#if defined (USE_VARARGS)
static FILE *_rl_tracefp;
***************
*** 539,542 ****
--- 542,546 ----
}
#endif
+ #endif /* DEBUG */
*** ../readline-6.3/patchlevel 2013-11-15 08:11:11.000000000 -0500
--- patchlevel 2014-03-21 08:28:40.000000000 -0400
***************
*** 1,3 ****
# Do not edit -- exists only for use by patch
! 2
--- 1,3 ----
# Do not edit -- exists only for use by patch
! 3
READLINE PATCH REPORT
=====================
Readline-Release: 6.3
Patch-ID: readline63-004
Bug-Reported-by: Egmont Koblinger <[email protected]>
Bug-Reference-ID: <CAGWcZk+bU5Jo1M+tutGvL-250UBE9DXjpeJVofYJSFcqFEVfMg@mail.gmail.com>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00153.html
Bug-Description:
The signal handling changes to bash and readline (to avoid running any code
in a signal handler context) cause the cursor to be placed on the wrong
line of a multi-line command after a ^C interrupts editing.
Patch (apply with `patch -p0'):
*** ../readline-6.3-patched/display.c 2013-12-27 13:10:56.000000000 -0500
--- display.c 2014-03-27 11:52:45.000000000 -0400
***************
*** 2678,2682 ****
if (_rl_echoing_p)
{
! _rl_move_vert (_rl_vis_botlin);
_rl_vis_botlin = 0;
fflush (rl_outstream);
--- 2678,2683 ----
if (_rl_echoing_p)
{
! if (_rl_vis_botlin > 0) /* minor optimization plus bug fix */
! _rl_move_vert (_rl_vis_botlin);
_rl_vis_botlin = 0;
fflush (rl_outstream);
*** ../readline-6.3/patchlevel 2013-11-15 08:11:11.000000000 -0500
--- patchlevel 2014-03-21 08:28:40.000000000 -0400
***************
*** 1,3 ****
# Do not edit -- exists only for use by patch
! 3
--- 1,3 ----
# Do not edit -- exists only for use by patch
! 4
READLINE PATCH REPORT
=====================
Readline-Release: 6.3
Patch-ID: readline63-005
Bug-Reported-by: Juergen Daubert <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-readline/2014-03/msg00002.html
Bug-Description:
There are still applications using the deprecated Function/VFunction/etc.
typedefs in rltypedefs.h. This patch restores the typedefs, but attempts
to mark them as deprecated using gcc/clang attributes. Thanks to Max Horn
for the suggestion.
Patch (apply with `patch -p0'):
*** ../readline-6.3-patched/rltypedefs.h 2011-03-26 14:53:31.000000000 -0400
--- rltypedefs.h 2014-04-10 11:30:45.000000000 -0400
***************
*** 27,30 ****
--- 27,49 ----
#endif
+ /* Old-style, attempt to mark as deprecated in some way people will notice. */
+
+ #if !defined (_FUNCTION_DEF)
+ # define _FUNCTION_DEF
+
+ #if defined(__GNUC__) || defined(__clang__)
+ typedef int Function () __attribute__ ((deprecated));
+ typedef void VFunction () __attribute__ ((deprecated));
+ typedef char *CPFunction () __attribute__ ((deprecated));
+ typedef char **CPPFunction () __attribute__ ((deprecated));
+ #else
+ typedef int Function ();
+ typedef void VFunction ();
+ typedef char *CPFunction ();
+ typedef char **CPPFunction ();
+ #endif
+
+ #endif /* _FUNCTION_DEF */
+
/* New style. */
*** ../readline-6.3/patchlevel 2013-11-15 08:11:11.000000000 -0500
--- patchlevel 2014-03-21 08:28:40.000000000 -0400
***************
*** 1,3 ****
# Do not edit -- exists only for use by patch
! 4
--- 1,3 ----
# Do not edit -- exists only for use by patch
! 5
READLINE PATCH REPORT
=====================
Readline-Release: 6.3
Patch-ID: readline63-006
Bug-Reported-by: <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00069.html
Bug-Description:
Using reverse-i-search when horizontal scrolling is enabled does not redisplay
the entire line containing the successful search results.
Patch (apply with `patch -p0'):
*** ../readline-6.3-patched/display.c 2014-04-08 18:19:36.000000000 -0400
--- display.c 2014-04-20 18:32:52.000000000 -0400
***************
*** 1638,1642 ****
the spot of first difference is before the end of the invisible chars,
lendiff needs to be adjusted. */
! if (current_line == 0 && !_rl_horizontal_scroll_mode &&
current_invis_chars != visible_wrap_offset)
{
--- 1638,1642 ----
the spot of first difference is before the end of the invisible chars,
lendiff needs to be adjusted. */
! if (current_line == 0 && /* !_rl_horizontal_scroll_mode && */
current_invis_chars != visible_wrap_offset)
{
***************
*** 1826,1831 ****
_rl_last_c_pos += bytes_to_insert;
if (_rl_horizontal_scroll_mode && ((oe-old) > (ne-new)))
! goto clear_rest_of_line;
}
}
--- 1826,1836 ----
_rl_last_c_pos += bytes_to_insert;
+ /* XXX - we only want to do this if we are at the end of the line
+ so we move there with _rl_move_cursor_relative */
if (_rl_horizontal_scroll_mode && ((oe-old) > (ne-new)))
! {
! _rl_move_cursor_relative (ne-new, new);
! goto clear_rest_of_line;
! }
}
}
*** ../readline-6.3/patchlevel 2013-11-15 08:11:11.000000000 -0500
--- patchlevel 2014-03-21 08:28:40.000000000 -0400
***************
*** 1,3 ****
# Do not edit -- exists only for use by patch
! 5
--- 1,3 ----
# Do not edit -- exists only for use by patch
! 6
READLINE PATCH REPORT
=====================
Readline-Release: 6.3
Patch-ID: readline63-007
Bug-Reported-by: John Lenton
Bug-Reference-ID:
Bug-Reference-URL: https://bugs.launchpad.net/ubuntu/+source/bash/+bug/1317476
Bug-Description:
Readline should allow SIGALRM and SIGVTALRM (if available) to `interrupt'
rl_getc and cause the handler to run when not in a signal handling context.
Patch (apply with `patch -p0'):
*** ../readline-6.3-patched/input.c 2014-01-10 15:07:08.000000000 -0500
--- input.c 2014-05-30 16:20:56.000000000 -0400
***************
*** 535,540 ****
--- 538,551 ----
else if (_rl_caught_signal == SIGHUP || _rl_caught_signal == SIGTERM)
return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF);
+ /* keyboard-generated signals of interest */
else if (_rl_caught_signal == SIGINT || _rl_caught_signal == SIGQUIT)
RL_CHECK_SIGNALS ();
+ /* non-keyboard-generated signals of interest */
+ else if (_rl_caught_signal == SIGALRM
+ #if defined (SIGVTALRM)
+ || _rl_caught_signal == SIGVTALRM
+ #endif
+ )
+ RL_CHECK_SIGNALS ();
if (rl_signal_event_hook)
*** ../readline-6.3/patchlevel 2013-11-15 08:11:11.000000000 -0500
--- patchlevel 2014-03-21 08:28:40.000000000 -0400
***************
*** 1,3 ****
# Do not edit -- exists only for use by patch
! 6
--- 1,3 ----
# Do not edit -- exists only for use by patch
! 7
READLINE PATCH REPORT
=====================
Readline-Release: 6.3
Patch-ID: readline63-008
Bug-Reported-by: Jared Yanovich <[email protected]>
Bug-Reference-ID: <[email protected]>
Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-06/msg00070.html
Bug-Description:
When the readline `revert-all-at-newline' option is set, pressing newline
when the current line is one retrieved from history results in a double free
and a segmentation fault.
Patch (apply with `patch -p0'):
*** ../readline-6.3-patched/misc.c 2012-09-01 18:03:11.000000000 -0400
--- misc.c 2014-06-30 13:41:19.000000000 -0400
***************
*** 462,465 ****
--- 462,466 ----
/* Set up rl_line_buffer and other variables from history entry */
rl_replace_from_history (entry, 0); /* entry->line is now current */
+ entry->data = 0; /* entry->data is now current undo list */
/* Undo all changes to this history entry */
while (rl_undo_list)
***************
*** 469,473 ****
FREE (entry->line);
entry->line = savestring (rl_line_buffer);
- entry->data = 0;
}
entry = previous_history ();
--- 470,473 ----
*** ../readline-6.3/patchlevel 2013-11-15 08:11:11.000000000 -0500
--- patchlevel 2014-03-21 08:28:40.000000000 -0400
***************
*** 1,3 ****
# Do not edit -- exists only for use by patch
! 7
--- 1,3 ----
# Do not edit -- exists only for use by patch
! 8
@Nuru
Copy link

Nuru commented Oct 5, 2014

Generally awesome, thank you!

https://gist.github.com/dnozay/395dcdef05c6b4b1836a#file-_build-sh-L107 is wrong, stops at 54, should be 56.

I see you have all the MD5s but I don't see where you check them.

@dnozay
Copy link
Author

dnozay commented Oct 25, 2014

fixed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment