Compare commits

...

No commits in common. "c10s" and "c8" have entirely different histories.
c10s ... c8

105 changed files with 2328 additions and 10070 deletions

1
.bash.metadata Normal file
View File

@ -0,0 +1 @@
8de012df1e4f3e91f571c3eb8ec45b43d7c747eb SOURCES/bash-4.4.tar.gz

View File

@ -1 +0,0 @@
1

10
.gitignore vendored
View File

@ -1,9 +1 @@
bash-4.1.tar.gz SOURCES/bash-4.4.tar.gz
/bash-4.2-rc2.tar.gz
/bash-4.2.tar.gz
/bash-4.3.tar.gz
/bash-4.4.tar.gz
/bash-5.0.tar.gz
/bash-5.1.tar.gz
/bash-5.2.tar.gz
/bash-5.2.tar.gz.sig

View File

@ -0,0 +1,11 @@
--- bash-2.02-orig/parse.y Wed Mar 25 18:16:23 1998
+++ bash-2.02/parse.y Sun Apr 19 16:46:34 1998
@@ -923,7 +923,7 @@
#if defined (READLINE)
char *current_readline_prompt = (char *)NULL;
-char *current_readline_line = (char *)NULL;
+unsigned char *current_readline_line = (unsigned char *)NULL;
int current_readline_line_index = 0;
static int

View File

@ -0,0 +1,11 @@
--- bash-3.0/config-top.h.paths 2003-08-05 15:36:12.000000000 +0100
+++ bash-3.0/config-top.h 2004-07-28 09:36:27.117205637 +0100
@@ -66,7 +66,7 @@
the Posix.2 confstr () function, or CS_PATH define are not present. */
#ifndef STANDARD_UTILS_PATH
#define STANDARD_UTILS_PATH \
- "/bin:/usr/bin:/sbin:/usr/sbin:/etc:/usr/etc"
+ "/bin:/usr/bin:/usr/sbin:/sbin"
#endif
/* Default primary and secondary prompt strings. */

View File

@ -1,8 +1,8 @@
diff --git a/config.h.in b/config.h.in diff --git a/config.h.in b/config.h.in
index ab316d4..11d1d68 100644 index a5ad9e7..62a6b32 100644
--- a/config.h.in --- a/config.h.in
+++ b/config.h.in +++ b/config.h.in
@@ -775,6 +775,9 @@ @@ -748,6 +748,9 @@
/* Define if you have the pselect function. */ /* Define if you have the pselect function. */
#undef HAVE_PSELECT #undef HAVE_PSELECT
@ -12,7 +12,7 @@ index ab316d4..11d1d68 100644
/* Define if you have the putenv function. */ /* Define if you have the putenv function. */
#undef HAVE_PUTENV #undef HAVE_PUTENV
@@ -981,6 +984,9 @@ @@ -946,6 +949,9 @@
/* Define if you have the <dlfcn.h> header file. */ /* Define if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H #undef HAVE_DLFCN_H
@ -23,20 +23,29 @@ index ab316d4..11d1d68 100644
#undef HAVE_GRP_H #undef HAVE_GRP_H
diff --git a/configure.ac b/configure.ac diff --git a/configure.ac b/configure.ac
index 2fe3e7d..f1b7f1b 100644 index ce4e9b6..eda95d6 100644
--- a/configure.ac --- a/configure.ac
+++ b/configure.ac +++ b/configure.ac
@@ -827,7 +827,7 @@ dnl checks for system calls @@ -700,7 +700,7 @@ BASH_HEADER_INTTYPES
AC_CHECK_FUNCS(dup2 eaccess fcntl getdtablesize getentropy getgroups \ AC_CHECK_HEADERS(unistd.h stdlib.h stdarg.h varargs.h limits.h string.h \
gethostname getpagesize getpeername getrandom getrlimit \ memory.h locale.h termcap.h termio.h termios.h dlfcn.h \
getrusage gettimeofday kill killpg lstat pselect readlink \ stdbool.h stddef.h stdint.h netdb.h pwd.h grp.h strings.h \
- select setdtablesize setitimer tcgetpgrp uname ulimit waitpid) - regex.h syslog.h ulimit.h)
+ select setdtablesize setitimer tcgetpgrp uname ulimit waitpid pread) + regex.h syslog.h ulimit.h elf.h)
AC_CHECK_HEADERS(sys/pte.h sys/stream.h sys/select.h sys/file.h sys/ioctl.h \
sys/param.h sys/socket.h sys/stat.h \
sys/time.h sys/times.h sys/types.h sys/wait.h)
@@ -771,7 +771,7 @@ dnl checks for system calls
AC_CHECK_FUNCS(dup2 eaccess fcntl getdtablesize getgroups gethostname \
getpagesize getpeername getrlimit getrusage gettimeofday \
kill killpg lstat pselect readlink sbrk select setdtablesize \
- setitimer tcgetpgrp uname ulimit waitpid)
+ setitimer tcgetpgrp uname ulimit waitpid pread)
AC_REPLACE_FUNCS(rename) AC_REPLACE_FUNCS(rename)
dnl checks for c library functions dnl checks for c library functions
diff --git a/execute_cmd.c b/execute_cmd.c diff --git a/execute_cmd.c b/execute_cmd.c
index d2a0dd7..d2555ad 100644 index 2a3df6d..b5cd405 100644
--- a/execute_cmd.c --- a/execute_cmd.c
+++ b/execute_cmd.c +++ b/execute_cmd.c
@@ -41,6 +41,10 @@ @@ -41,6 +41,10 @@
@ -50,7 +59,7 @@ index d2a0dd7..d2555ad 100644
#include "posixtime.h" #include "posixtime.h"
#if defined (HAVE_SYS_RESOURCE_H) && !defined (RLIMTYPE) #if defined (HAVE_SYS_RESOURCE_H) && !defined (RLIMTYPE)
@@ -5832,6 +5836,14 @@ shell_execve (command, args, env) @@ -5486,6 +5490,14 @@ shell_execve (command, args, env)
{ {
/* The file has the execute bits set, but the kernel refuses to /* The file has the execute bits set, but the kernel refuses to
run it for some reason. See why. */ run it for some reason. See why. */
@ -65,7 +74,7 @@ index d2a0dd7..d2555ad 100644
#if defined (HAVE_HASH_BANG_EXEC) #if defined (HAVE_HASH_BANG_EXEC)
READ_SAMPLE_BUF (command, sample, sample_len); READ_SAMPLE_BUF (command, sample, sample_len);
if (sample_len > 0) if (sample_len > 0)
@@ -5841,6 +5853,7 @@ shell_execve (command, args, env) @@ -5495,6 +5507,7 @@ shell_execve (command, args, env)
char *interp; char *interp;
int ilen; int ilen;
@ -73,11 +82,10 @@ index d2a0dd7..d2555ad 100644
interp = getinterp (sample, sample_len, (int *)NULL); interp = getinterp (sample, sample_len, (int *)NULL);
ilen = strlen (interp); ilen = strlen (interp);
errno = i; errno = i;
@@ -5856,7 +5869,138 @@ shell_execve (command, args, env) @@ -5510,6 +5523,136 @@ shell_execve (command, args, env)
return (EX_NOEXEC); return (EX_NOEXEC);
} }
#endif #endif
- errno = i;
+#if defined (HAVE_ELF_H) +#if defined (HAVE_ELF_H)
+ if (i == ENOENT + if (i == ENOENT
+ && sample_len > EI_NIDENT + && sample_len > EI_NIDENT
@ -208,8 +216,9 @@ index d2a0dd7..d2555ad 100644
+#if defined (HAVE_HASH_BANG_EXEC) || defined (HAVE_ELF_H) +#if defined (HAVE_HASH_BANG_EXEC) || defined (HAVE_ELF_H)
+ close (fd); + close (fd);
+#endif +#endif
+ errno = i;
+ errno = i;
file_error (command); file_error (command);
} }
return (last_command_exit_value); --
2.9.3

View File

@ -0,0 +1,10 @@
--- bash-2.05b/doc/builtins.1.manso 2003-02-10 18:58:21.000000000 +0000
+++ bash-2.05b/doc/builtins.1 2003-02-10 18:58:28.000000000 +0000
@@ -10,6 +10,6 @@
ulimit, umask, unalias, unset, wait \- bash built-in commands, see \fBbash\fR(1)
.SH BASH BUILTIN COMMANDS
.nr zZ 1
-.so bash.1
+.so man1/bash.1
.SH SEE ALSO
bash(1), sh(1)

View File

@ -0,0 +1,11 @@
--- bash-2.05b/aclocal.m4.pgrp_sync 2002-06-25 14:45:43.000000000 +0100
+++ bash-2.05b/aclocal.m4 2003-01-15 18:17:35.000000000 +0000
@@ -1255,7 +1255,7 @@
wait(&status);
exit(ok ? 0 : 5);
}
-], bash_cv_pgrp_pipe=no,bash_cv_pgrp_pipe=yes,
+], bash_cv_pgrp_pipe=yes,bash_cv_pgrp_pipe=yes,
[AC_MSG_WARN(cannot check pgrp synchronization if cross compiling -- defaulting to no)
bash_cv_pgrp_pipe=no])
])

View File

@ -0,0 +1,19 @@
--- bash-3.1/Makefile.in.xcc 2005-10-25 19:37:52.000000000 +0100
+++ bash-3.1/Makefile.in 2005-12-23 16:11:09.000000000 +0000
@@ -68,6 +68,7 @@
ARFLAGS = @ARFLAGS@
RANLIB = @RANLIB@
SIZE = @SIZE@
+STRIP = strip
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -535,7 +536,7 @@
@chmod a+rx bashbug
strip: $(Program) .made
- strip $(Program)
+ $(STRIP) $(Program)
ls -l $(Program)
-$(SIZE) $(Program)

View File

@ -1,13 +1,12 @@
diff --git a/config-top.h b/config-top.h diff -up bash-4.0/config-top.h.ssh_source_bash bash-4.0/config-top.h
index e5cc147..f5e0a52 100644 --- bash-4.0/config-top.h.ssh_source_bash 2009-01-21 15:20:06.000000000 +0100
--- a/config-top.h +++ bash-4.0/config-top.h 2009-01-21 15:25:46.000000000 +0100
+++ b/config-top.h @@ -90,7 +90,7 @@
@@ -106,7 +106,7 @@
sshd and source the .bashrc if so (like the rshd behavior). This checks sshd and source the .bashrc if so (like the rshd behavior). This checks
for the presence of SSH_CLIENT or SSH2_CLIENT in the initial environment, for the presence of SSH_CLIENT or SSH2_CLIENT in the initial environment,
which can be fooled under certain not-uncommon circumstances. */ which can be fooled under certain not-uncommon circumstances. */
-/* #define SSH_SOURCE_BASHRC */ -/* #define SSH_SOURCE_BASHRC */
+#define SSH_SOURCE_BASHRC +#define SSH_SOURCE_BASHRC
/* Define if you want the case-toggling operators (~[~]) and the /* Define if you want the case-capitalizing operators (~[~]) and the
`capcase' variable attribute (declare -c). */ `capcase' variable attribute (declare -c). */

View File

@ -0,0 +1,11 @@
diff -pruN bash-4.1/jobs.c bash-4.1.patched/jobs.c
--- bash-4.1/jobs.c 2009-11-30 03:42:05.000000000 +0530
+++ bash-4.1.patched/jobs.c 2012-03-06 16:44:15.706595703 +0530
@@ -3037,6 +3037,7 @@ waitchld (wpid, block)
pid_t pid;
int call_set_current, last_stopped_job, job, children_exited, waitpid_flags;
+ int called_from_sighand = sigchld;
static int wcontinued = WCONTINUED; /* run-time fix for glibc problem */
call_set_current = children_exited = 0;

View File

@ -0,0 +1,24 @@
diff -up bash-4.1/examples/loadables/Makefile.in.examples bash-4.1/examples/loadables/Makefile.in
--- bash-4.1/examples/loadables/Makefile.in.examples 2010-06-22 16:20:02.000000000 +0200
+++ bash-4.1/examples/loadables/Makefile.in 2010-06-22 16:20:41.000000000 +0200
@@ -43,7 +43,7 @@ host_os = @host_os@
host_cpu = @host_cpu@
host_vendor = @host_vendor@
-CFLAGS = @CFLAGS@
+CFLAGS = -O2 -g
LOCAL_CFLAGS = @LOCAL_CFLAGS@
DEFS = @DEFS@
LOCAL_DEFS = @LOCAL_DEFS@
diff -up bash-4.1/examples/loadables/perl/Makefile.in.examples bash-4.1/examples/loadables/perl/Makefile.in
--- bash-4.1/examples/loadables/perl/Makefile.in.examples 2010-06-22 16:20:46.000000000 +0200
+++ bash-4.1/examples/loadables/perl/Makefile.in 2010-06-22 16:21:04.000000000 +0200
@@ -42,7 +42,7 @@ SHELL = @MAKE_SHELL@
PERL5 = perl5
-CFLAGS = @CFLAGS@
+CFLAGS = -O2 -g
#
# These values are generated for configure by ${topdir}/support/shobj-conf.

View File

@ -1,8 +1,7 @@
diff --git a/execute_cmd.c b/execute_cmd.c diff -up bash-4.2/execute_cmd.c.coverity bash-4.2/execute_cmd.c
index a988400..412128c 100644 --- bash-4.2/execute_cmd.c.coverity 2011-02-24 13:04:35.000000000 +0100
--- a/execute_cmd.c +++ bash-4.2/execute_cmd.c 2011-02-24 13:49:13.000000000 +0100
+++ b/execute_cmd.c @@ -5036,7 +5036,7 @@ shell_execve (command, args, env)
@@ -5760,7 +5760,7 @@ shell_execve (command, args, env)
Elf32_Ehdr ehdr; Elf32_Ehdr ehdr;
Elf32_Phdr *phdr; Elf32_Phdr *phdr;
Elf32_Shdr *shdr; Elf32_Shdr *shdr;
@ -11,7 +10,7 @@ index a988400..412128c 100644
/* We have to copy the data since the sample buffer /* We have to copy the data since the sample buffer
might not be aligned correctly to be accessed as might not be aligned correctly to be accessed as
@@ -5768,12 +5768,12 @@ shell_execve (command, args, env) @@ -5044,12 +5044,12 @@ shell_execve (command, args, env)
memcpy (&ehdr, sample, sizeof (Elf32_Ehdr)); memcpy (&ehdr, sample, sizeof (Elf32_Ehdr));
nshdr = ehdr.e_shnum; nshdr = ehdr.e_shnum;
@ -26,7 +25,7 @@ index a988400..412128c 100644
ehdr.e_shoff); ehdr.e_shoff);
#else #else
if (lseek (fd, ehdr.e_shoff, SEEK_SET) != -1) if (lseek (fd, ehdr.e_shoff, SEEK_SET) != -1)
@@ -5815,11 +5815,11 @@ shell_execve (command, args, env) @@ -5091,11 +5091,11 @@ shell_execve (command, args, env)
} }
nphdr = ehdr.e_phnum; nphdr = ehdr.e_phnum;
@ -40,7 +39,7 @@ index a988400..412128c 100644
ehdr.e_phoff); ehdr.e_phoff);
#else #else
if (lseek (fd, ehdr.e_phoff, SEEK_SET) != -1) if (lseek (fd, ehdr.e_phoff, SEEK_SET) != -1)
@@ -5844,7 +5844,7 @@ shell_execve (command, args, env) @@ -5120,7 +5120,7 @@ shell_execve (command, args, env)
Elf64_Ehdr ehdr; Elf64_Ehdr ehdr;
Elf64_Phdr *phdr; Elf64_Phdr *phdr;
Elf64_Shdr *shdr; Elf64_Shdr *shdr;
@ -49,7 +48,7 @@ index a988400..412128c 100644
/* We have to copy the data since the sample buffer /* We have to copy the data since the sample buffer
might not be aligned correctly to be accessed as might not be aligned correctly to be accessed as
@@ -5852,11 +5852,11 @@ shell_execve (command, args, env) @@ -5128,11 +5128,11 @@ shell_execve (command, args, env)
memcpy (&ehdr, sample, sizeof (Elf64_Ehdr)); memcpy (&ehdr, sample, sizeof (Elf64_Ehdr));
nshdr = ehdr.e_shnum; nshdr = ehdr.e_shnum;
@ -63,7 +62,7 @@ index a988400..412128c 100644
ehdr.e_shoff); ehdr.e_shoff);
#else #else
if (lseek (fd, ehdr.e_shoff, SEEK_SET) != -1) if (lseek (fd, ehdr.e_shoff, SEEK_SET) != -1)
@@ -5898,11 +5898,11 @@ shell_execve (command, args, env) @@ -5174,11 +5174,11 @@ shell_execve (command, args, env)
} }
nphdr = ehdr.e_phnum; nphdr = ehdr.e_phnum;
@ -77,7 +76,7 @@ index a988400..412128c 100644
ehdr.e_phoff); ehdr.e_phoff);
#else #else
if (lseek (fd, ehdr.e_phoff, SEEK_SET) != -1) if (lseek (fd, ehdr.e_phoff, SEEK_SET) != -1)
@@ -5924,8 +5924,8 @@ shell_execve (command, args, env) @@ -5200,8 +5200,8 @@ shell_execve (command, args, env)
if (offset != -1) if (offset != -1)
{ {
@ -88,7 +87,7 @@ index a988400..412128c 100644
char *interp = NULL; char *interp = NULL;
do do
@@ -5974,7 +5974,8 @@ shell_execve (command, args, env) @@ -5250,7 +5250,8 @@ shell_execve (command, args, env)
} }
#endif #endif
#if defined (HAVE_HASH_BANG_EXEC) || defined (HAVE_ELF_H) #if defined (HAVE_HASH_BANG_EXEC) || defined (HAVE_ELF_H)
@ -96,8 +95,5 @@ index a988400..412128c 100644
+ if (fd >= 0) + if (fd >= 0)
+ close (fd); + close (fd);
#endif #endif
errno = i; errno = i;
-- file_error (command);
2.17.2

View File

@ -0,0 +1,12 @@
diff -up bash-4.3/locale.c.old bash-4.3/locale.c
--- bash-4.3/locale.c.old 2015-07-15 11:55:00.002857301 +0200
+++ bash-4.3/locale.c 2015-07-15 11:48:36.698086257 +0200
@@ -77,8 +77,6 @@ set_default_locale ()
{
#if defined (HAVE_SETLOCALE)
default_locale = setlocale (LC_ALL, "");
- if (default_locale)
- default_locale = savestring (default_locale);
#endif /* HAVE_SETLOCALE */
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);

View File

@ -1,28 +1,29 @@
diff --git a/parse.y b/parse.y diff --git a/parse.y b/parse.y
index 30425a5..85f1c4f 100644
--- a/parse.y --- a/parse.y
+++ b/parse.y +++ b/parse.y
@@ -4255,7 +4255,8 @@ xparse_dolparen (base, string, indp, flags) @@ -4228,6 +4228,8 @@ xparse_dolparen (base, string, indp, flags)
save_parser_state (&ps); save_parser_state (&ps);
save_input_line_state (&ls); save_input_line_state (&ls);
- orig_eof_token = shell_eof_token;
+ /* avoid echoing every substitution again */ + /* avoid echoing every substitution again */
+ echo_input_at_read = 0; + echo_input_at_read = 0;
#if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
pushed_string_list = (STRING_SAVER *)NULL; /*(*/
#endif parser_state |= PST_CMDSUBST|PST_EOFTOKEN; /* allow instant ')' */ /*(*/
diff --git a/subst.c b/subst.c diff --git a/subst.c b/subst.c
index f1a4df1..a93a4ce 100644
--- a/subst.c --- a/subst.c
+++ b/subst.c +++ b/subst.c
@@ -10222,6 +10222,7 @@ param_expand (string, sindex, quoted, expanded_something, @@ -8513,6 +8513,7 @@ param_expand (string, sindex, quoted, expanded_something,
WORD_LIST *list, *l; WORD_LIST *list;
WORD_DESC *tdesc, *ret; WORD_DESC *tdesc, *ret;
int tflag, nullarg; int tflag;
+ int old_echo_input; + int old_echo_input;
/*itrace("param_expand: `%s' pflags = %d", string+*sindex, pflags);*/ /*itrace("param_expand: `%s' pflags = %d", string+*sindex, pflags);*/
zindex = *sindex; zindex = *sindex;
@@ -10614,6 +10615,9 @@ arithsub: @@ -8831,6 +8832,9 @@ arithsub:
} }
comsub: comsub:
@ -32,7 +33,7 @@ diff --git a/subst.c b/subst.c
if (pflags & PF_NOCOMSUB) if (pflags & PF_NOCOMSUB)
/* we need zindex+1 because string[zindex] == RPAREN */ /* we need zindex+1 because string[zindex] == RPAREN */
temp1 = substring (string, *sindex, zindex+1); temp1 = substring (string, *sindex, zindex+1);
@@ -10626,6 +10630,7 @@ comsub: @@ -8843,6 +8847,7 @@ comsub:
} }
FREE (temp); FREE (temp);
temp = temp1; temp = temp1;
@ -40,3 +41,6 @@ diff --git a/subst.c b/subst.c
break; break;
/* Do POSIX.2d9-style arithmetic substitution. This will probably go /* Do POSIX.2d9-style arithmetic substitution. This will probably go
--
2.9.3

View File

@ -0,0 +1,31 @@
diff --git a/execute_cmd.h b/execute_cmd.h
--- a/execute_cmd.h
+++ b/execute_cmd.h
@@ -37,6 +37,9 @@ struct func_array_state
};
#endif
+/* Variables delared in execute_cmd.c, used by many other files */
+extern int executing_command_builtin;
+
extern struct fd_bitmap *new_fd_bitmap __P((int));
extern void dispose_fd_bitmap __P((struct fd_bitmap *));
extern void close_fd_bitmap __P((struct fd_bitmap *));
diff --git a/subst.c b/subst.c
--- a/subst.c
+++ b/subst.c
@@ -10676,11 +10676,12 @@ expand_word_list_internal (list, eflags)
tint = do_word_assignment (temp_list->word, 0);
this_command_name = savecmd;
/* Variable assignment errors in non-interactive shells
- running in Posix.2 mode cause the shell to exit. */
+ running in Posix.2 mode cause the shell to exit, unless
+ they are being run by the `command' builtin. */
if (tint == 0)
{
last_command_exit_value = EXECUTION_FAILURE;
- if (interactive_shell == 0 && posixly_correct)
+ if (interactive_shell == 0 && posixly_correct && executing_command_builtin == 0)
exp_jump_to_top_level (FORCE_EOF);
else
exp_jump_to_top_level (DISCARD);

View File

@ -0,0 +1,18 @@
diff --git a/parse.y b/parse.y
--- a/parse.y
+++ b/parse.y
@@ -4011,11 +4011,13 @@ eof_error:
tflags |= LEX_RESWDOK;
lex_rwlen = 0;
}
- else
+ else if (shellmeta (ch) == 0)
{
tflags &= ~LEX_RESWDOK;
/*itrace("parse_comsub:%d: found `%.4s', lex_reswdok -> 0", line_number, ret+retind-4);*/
}
+ else /* can't be in a reserved word any more */
+ lex_rwlen = 0;
}
else if MBTEST((tflags & LEX_CKCOMMENT) && ch == '#' && (lex_rwlen == 0 || ((tflags & LEX_INWORD) && lex_wlen == 0)))
; /* don't modify LEX_RESWDOK if we're starting a comment */

View File

@ -0,0 +1,203 @@
diff --git a/builtins/fc.def b/builtins/fc.def
index fe16471..98c53db 100644
--- a/builtins/fc.def
+++ b/builtins/fc.def
@@ -423,6 +423,7 @@ fc_builtin (list)
{
sh_wrerror ();
fclose (stream);
+ FREE (fn);
return (EXECUTION_FAILURE);
}
fclose (stream);
diff --git a/execute_cmd.c b/execute_cmd.c
index 63a332a..15b5e19 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -2196,8 +2196,10 @@ coproc_setvars (cp)
if (v == 0)
{
v = find_variable_nameref_for_create (cp->c_name, 1);
- if (v == INVALID_NAMEREF_VALUE)
- return;
+ if (v == INVALID_NAMEREF_VALUE) {
+ free (namevar);
+ return;
+ }
if (v && nameref_p (v))
{
free (cp->c_name);
@@ -2210,6 +2212,7 @@ coproc_setvars (cp)
{
if (readonly_p (v))
err_readonly (cp->c_name);
+ free (namevar);
return;
}
if (v == 0)
@@ -5528,7 +5531,6 @@ shell_execve (command, args, env)
char *interp;
int ilen;
- close (fd);
interp = getinterp (sample, sample_len, (int *)NULL);
ilen = strlen (interp);
errno = i;
diff --git a/expr.c b/expr.c
index 172964a..5dc57c0 100644
--- a/expr.c
+++ b/expr.c
@@ -207,7 +207,8 @@ static intmax_t exp5 __P((void));
static intmax_t exp4 __P((void));
static intmax_t expshift __P((void));
static intmax_t exp3 __P((void));
-static intmax_t exp2 __P((void));
+/* Avoid name clash with standard exp2 */
+static intmax_t bash_exp2 __P((void));
static intmax_t exppower __P((void));
static intmax_t exp1 __P((void));
static intmax_t exp0 __P((void));
@@ -809,14 +810,14 @@ exp3 ()
{
register intmax_t val1, val2;
- val1 = exp2 ();
+ val1 = bash_exp2 ();
while ((curtok == PLUS) || (curtok == MINUS))
{
int op = curtok;
readtok ();
- val2 = exp2 ();
+ val2 = bash_exp2 ();
if (op == PLUS)
val1 += val2;
@@ -828,7 +829,7 @@ exp3 ()
}
static intmax_t
-exp2 ()
+bash_exp2 ()
{
register intmax_t val1, val2;
#if defined (HAVE_IMAXDIV)
diff --git a/lib/glob/glob.c b/lib/glob/glob.c
index 7f6eafe..c018e29 100644
--- a/lib/glob/glob.c
+++ b/lib/glob/glob.c
@@ -576,7 +576,7 @@ glob_vector (pat, dir, flags)
register char *nextname, *npat, *subdir;
unsigned int count;
int lose, skip, ndirs, isdir, sdlen, add_current, patlen;
- register char **name_vector;
+ register char **name_vector = NULL;
register unsigned int i;
int mflags; /* Flags passed to strmatch (). */
int pflags; /* flags passed to sh_makepath () */
@@ -894,7 +894,7 @@ glob_vector (pat, dir, flags)
}
/* Don't call QUIT; here; let higher layers deal with it. */
-
+ FREE (name_vector);
return ((char **)NULL);
}
diff --git a/lib/sh/pathcanon.c b/lib/sh/pathcanon.c
index f19bd55..2a565d6 100644
--- a/lib/sh/pathcanon.c
+++ b/lib/sh/pathcanon.c
@@ -227,7 +227,7 @@ sh_canonpath (path, flags)
if (result[2] == '\0') /* short-circuit for bare `//' */
result[1] = '\0';
else
- strcpy (result, result + 1);
+ memmove(result, result + 1, strlen(result + 1) + 1);
}
return (result);
diff --git a/lib/sh/pathphys.c b/lib/sh/pathphys.c
index 26016b7..b64c4cd 100644
--- a/lib/sh/pathphys.c
+++ b/lib/sh/pathphys.c
@@ -245,7 +245,7 @@ error:
if (result[2] == '\0') /* short-circuit for bare `//' */
result[1] = '\0';
else
- strcpy (result, result + 1);
+ memmove(result, result + 1, strlen(result + 1) + 1);
}
return (result);
diff --git a/shell.c b/shell.c
index b43de50..4aae182 100644
--- a/shell.c
+++ b/shell.c
@@ -1948,8 +1948,10 @@ show_shell_usage (fp, extra)
fputs (_("\t-ilrsD or -c command or -O shopt_option\t\t(invocation only)\n"), fp);
for (i = 0, set_opts = 0; shell_builtins[i].name; i++)
- if (STREQ (shell_builtins[i].name, "set"))
+ if (STREQ (shell_builtins[i].name, "set")) {
set_opts = savestring (shell_builtins[i].short_doc);
+ break;
+ }
if (set_opts)
{
s = strchr (set_opts, '[');
diff --git a/subst.c b/subst.c
index 5f3e41e..7574617 100644
--- a/subst.c
+++ b/subst.c
@@ -5182,8 +5182,11 @@ parameter_list_transform (xc, itype, quoted)
list = list_rest_of_args ();
if (list == 0)
return ((char *)NULL);
- if (xc == 'A')
- return (pos_params_assignment (list, itype, quoted));
+ if (xc == 'A') {
+ ret = pos_params_assignment (list, itype, quoted);
+ dispose_words (list);
+ return (ret);
+ }
ret = list_transform (xc, (SHELL_VAR *)0, list, itype, quoted);
dispose_words (list);
return (ret);
@@ -6813,6 +6816,7 @@ parameter_brace_expand_rhs (name, value, c, quoted, pflags, qdollaratp, hasdolla
{
report_error (_("%s: invalid indirect expansion"), name);
free (vname);
+ free (t1);
dispose_word (w);
return &expand_wdesc_error;
}
@@ -6820,6 +6824,7 @@ parameter_brace_expand_rhs (name, value, c, quoted, pflags, qdollaratp, hasdolla
{
report_error (_("%s: invalid variable name"), vname);
free (vname);
+ free (t1);
dispose_word (w);
return &expand_wdesc_error;
}
diff --git a/support/man2html.c b/support/man2html.c
index 6ba5061..1d9e376 100644
--- a/support/man2html.c
+++ b/support/man2html.c
@@ -522,6 +522,7 @@ read_man_page(char *filename)
man_buf[buf_size] = '\n';
man_buf[buf_size + 1] = man_buf[buf_size + 2] = '\0';
} else {
+ free (man_buf);
man_buf = NULL;
}
fclose(man_stream);
@@ -2562,7 +2563,6 @@ scan_request(char *c)
h = name;
if (stat(h, &stbuf) != -1)
l = stbuf.st_size;
- buf = stralloc(l + 4);
#if NOCGI
if (!out_length) {
char *t, *s;

View File

@ -0,0 +1,23 @@
diff -up bash-4.4/input.c.orig bash-4.4/input.c
--- bash-4.4/input.c.orig 2022-03-10 10:50:40.046490589 -0300
+++ bash-4.4/input.c 2022-03-10 10:51:48.659491601 -0300
@@ -530,7 +530,7 @@ bufstream_ungetc(c, bp)
int c;
BUFFERED_STREAM *bp;
{
- if (c == EOF || bp->b_inputp == 0)
+ if (c == EOF || bp == 0 || bp->b_inputp == 0)
return (EOF);
bp->b_buffer[--bp->b_inputp] = c;
@@ -561,6 +561,10 @@ buffered_getchar ()
{
CHECK_TERMSIG;
+ if (bash_input.location.buffered_fd < 0 ||
+ buffers[bash_input.location.buffered_fd] == 0)
+ return EOF;
+
#if !defined (DJGPP)
return (bufstream_getc (buffers[bash_input.location.buffered_fd]));
#else

View File

@ -0,0 +1,49 @@
From 8ddc8d6e3a3d85eec6d4ba9b9ed2bc36bce56716 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Mon, 14 Nov 2016 14:26:51 -0500
Subject: [PATCH] Bash-4.4 patch 1
---
lib/readline/history.c | 6 +++++-
patchlevel.h | 2 +-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/lib/readline/history.c b/lib/readline/history.c
index 3b8dbc5..9ff25a7 100644
--- a/lib/readline/history.c
+++ b/lib/readline/history.c
@@ -57,6 +57,8 @@ extern int errno;
/* How big to make the_history when we first allocate it. */
#define DEFAULT_HISTORY_INITIAL_SIZE 502
+#define MAX_HISTORY_INITIAL_SIZE 8192
+
/* The number of slots to increase the_history by. */
#define DEFAULT_HISTORY_GROW_SIZE 50
@@ -307,7 +309,9 @@ add_history (string)
if (history_size == 0)
{
if (history_stifled && history_max_entries > 0)
- history_size = history_max_entries + 2;
+ history_size = (history_max_entries > MAX_HISTORY_INITIAL_SIZE)
+ ? MAX_HISTORY_INITIAL_SIZE
+ : history_max_entries + 2;
else
history_size = DEFAULT_HISTORY_INITIAL_SIZE;
the_history = (HIST_ENTRY **)xmalloc (history_size * sizeof (HIST_ENTRY *));
diff --git a/patchlevel.h b/patchlevel.h
index 1cd7c96..40db1a3 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 0
+#define PATCHLEVEL 1
#endif /* _PATCHLEVEL_H_ */
--
2.9.3

View File

@ -0,0 +1,39 @@
From 5b9762d6f0cd36ff1b88bde22efa30ad0ed27ec6 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 20 Jan 2017 15:38:38 -0500
Subject: [PATCH] Bash-4.4 patch 10
---
builtins/read.def | 3 ++-
patchlevel.h | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/builtins/read.def b/builtins/read.def
index 48fda33..33821f3 100644
--- a/builtins/read.def
+++ b/builtins/read.def
@@ -181,7 +181,8 @@ read_builtin (list)
WORD_LIST *list;
{
register char *varname;
- int size, i, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2;
+ int size, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2;
+ volatile int i;
int input_is_tty, input_is_pipe, unbuffered_read, skip_ctlesc, skip_ctlnul;
int raw, edit, nchars, silent, have_timeout, ignore_delim, fd, lastsig, t_errno;
unsigned int tmsec, tmusec;
diff --git a/patchlevel.h b/patchlevel.h
index 02f1d60..8002af7 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 9
+#define PATCHLEVEL 10
#endif /* _PATCHLEVEL_H_ */
--
2.9.3

View File

@ -0,0 +1,39 @@
From 76bb456d8fcd870cd31b7bf9d90798cd97cee2ab Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 20 Jan 2017 15:38:49 -0500
Subject: [PATCH] Bash-4.4 patch 11
---
patchlevel.h | 2 +-
sig.c | 3 ++-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/patchlevel.h b/patchlevel.h
index 8002af7..772676c 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 10
+#define PATCHLEVEL 11
#endif /* _PATCHLEVEL_H_ */
diff --git a/sig.c b/sig.c
index ad01631..e5bb739 100644
--- a/sig.c
+++ b/sig.c
@@ -585,7 +585,8 @@ termsig_handler (sig)
#if defined (JOB_CONTROL)
if (sig == SIGHUP && (interactive || (subshell_environment & (SUBSHELL_COMSUB|SUBSHELL_PROCSUB))))
hangup_all_jobs ();
- end_job_control ();
+ if ((subshell_environment & (SUBSHELL_COMSUB|SUBSHELL_PROCSUB)) == 0)
+ end_job_control ();
#endif /* JOB_CONTROL */
#if defined (PROCESS_SUBSTITUTION)
--
2.9.3

View File

@ -0,0 +1,119 @@
From bc007799f0e1362100375bb95d952d28de4c62fb Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 27 Jan 2017 11:25:44 -0500
Subject: [PATCH] Bash-4.4 patch 12
---
patchlevel.h | 2 +-
subst.c | 32 ++++++++++++++++++++------------
2 files changed, 21 insertions(+), 13 deletions(-)
diff --git a/patchlevel.h b/patchlevel.h
index 772676c..93dbe0d 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 11
+#define PATCHLEVEL 12
#endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
index 027a13e..dbf0157 100644
--- a/subst.c
+++ b/subst.c
@@ -2825,11 +2825,15 @@ list_string (string, separators, quoted)
/* Parse a single word from STRING, using SEPARATORS to separate fields.
ENDPTR is set to the first character after the word. This is used by
- the `read' builtin. This is never called with SEPARATORS != $IFS;
- it should be simplified.
+ the `read' builtin.
+
+ This is never called with SEPARATORS != $IFS, and takes advantage of that.
XXX - this function is very similar to list_string; they should be
combined - XXX */
+
+#define islocalsep(c) (local_cmap[(unsigned char)(c)] != 0)
+
char *
get_word_from_string (stringp, separators, endptr)
char **stringp, *separators, **endptr;
@@ -2837,6 +2841,7 @@ get_word_from_string (stringp, separators, endptr)
register char *s;
char *current_word;
int sindex, sh_style_split, whitesep, xflags;
+ unsigned char local_cmap[UCHAR_MAX+1]; /* really only need single-byte chars here */
size_t slen;
if (!stringp || !*stringp || !**stringp)
@@ -2846,20 +2851,23 @@ get_word_from_string (stringp, separators, endptr)
separators[1] == '\t' &&
separators[2] == '\n' &&
separators[3] == '\0';
- for (xflags = 0, s = ifs_value; s && *s; s++)
+ memset (local_cmap, '\0', sizeof (local_cmap));
+ for (xflags = 0, s = separators; s && *s; s++)
{
if (*s == CTLESC) xflags |= SX_NOCTLESC;
if (*s == CTLNUL) xflags |= SX_NOESCCTLNUL;
+ local_cmap[(unsigned char)*s] = 1; /* local charmap of separators */
}
s = *stringp;
slen = 0;
/* Remove sequences of whitespace at the beginning of STRING, as
- long as those characters appear in IFS. */
- if (sh_style_split || !separators || !*separators)
+ long as those characters appear in SEPARATORS. This happens if
+ SEPARATORS == $' \t\n' or if IFS is unset. */
+ if (sh_style_split || separators == 0)
{
- for (; *s && spctabnl (*s) && isifs (*s); s++);
+ for (; *s && spctabnl (*s) && islocalsep (*s); s++);
/* If the string is nothing but whitespace, update it and return. */
if (!*s)
@@ -2878,9 +2886,9 @@ get_word_from_string (stringp, separators, endptr)
This obeys the field splitting rules in Posix.2. */
sindex = 0;
- /* Don't need string length in ADVANCE_CHAR or string_extract_verbatim
- unless multibyte chars are possible. */
- slen = (MB_CUR_MAX > 1) ? STRLEN (s) : 1;
+ /* Don't need string length in ADVANCE_CHAR unless multibyte chars are
+ possible, but need it in string_extract_verbatim for bounds checking */
+ slen = STRLEN (s);
current_word = string_extract_verbatim (s, slen, &sindex, separators, xflags);
/* Set ENDPTR to the first character after the end of the word. */
@@ -2899,19 +2907,19 @@ get_word_from_string (stringp, separators, endptr)
/* Now skip sequences of space, tab, or newline characters if they are
in the list of separators. */
- while (s[sindex] && spctabnl (s[sindex]) && isifs (s[sindex]))
+ while (s[sindex] && spctabnl (s[sindex]) && islocalsep (s[sindex]))
sindex++;
/* If the first separator was IFS whitespace and the current character is
a non-whitespace IFS character, it should be part of the current field
delimiter, not a separate delimiter that would result in an empty field.
Look at POSIX.2, 3.6.5, (3)(b). */
- if (s[sindex] && whitesep && isifs (s[sindex]) && !spctabnl (s[sindex]))
+ if (s[sindex] && whitesep && islocalsep (s[sindex]) && !spctabnl (s[sindex]))
{
sindex++;
/* An IFS character that is not IFS white space, along with any adjacent
IFS white space, shall delimit a field. */
- while (s[sindex] && spctabnl (s[sindex]) && isifs (s[sindex]))
+ while (s[sindex] && spctabnl (s[sindex]) && islocalsep(s[sindex]))
sindex++;
}
--
2.9.3

View File

@ -0,0 +1,38 @@
From 1aef9c7b55dcef4af239caf93e01419e1c8e04ad Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Mon, 29 Jan 2018 16:03:33 -0500
Subject: [PATCH] Bash-4.4 patch 13
---
patchlevel.h | 2 +-
redir.c | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/patchlevel.h b/patchlevel.h
index 93dbe0db..779671cd 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 12
+#define PATCHLEVEL 13
#endif /* _PATCHLEVEL_H_ */
diff --git a/redir.c b/redir.c
index 25488eaf..1858b0b0 100644
--- a/redir.c
+++ b/redir.c
@@ -469,6 +469,8 @@ here_document_to_fd (redirectee, ri)
return (fd);
}
+ SET_CLOSE_ON_EXEC (fd);
+
errno = r = 0; /* XXX */
/* write_here_document returns 0 on success, errno on failure. */
if (redirectee->word)
--
2.13.6

View File

@ -0,0 +1,85 @@
From 2fb21d75bfddd724b0e45d4a51455a166467e496 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Mon, 29 Jan 2018 16:03:47 -0500
Subject: [PATCH] Bash-4.4 patch 14
---
execute_cmd.c | 19 ++++++++++++++++---
patchlevel.h | 2 +-
2 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/execute_cmd.c b/execute_cmd.c
index 2a3df6d6..76a80766 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -726,6 +726,8 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
{
ofifo = num_fifos ();
ofifo_list = copy_fifo_list ((int *)&osize);
+ begin_unwind_frame ("internal_fifos");
+ add_unwind_protect (xfree, ofifo_list);
saved_fifo = 1;
}
else
@@ -741,7 +743,10 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
dispose_exec_redirects ();
#if defined (PROCESS_SUBSTITUTION)
if (saved_fifo)
- free ((void *)ofifo_list);
+ {
+ free ((void *)ofifo_list);
+ discard_unwind_frame ("internal_fifos");
+ }
#endif
return (last_command_exit_value = EXECUTION_FAILURE);
}
@@ -1060,6 +1065,7 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
if (nfifo > ofifo)
close_new_fifos ((char *)ofifo_list, osize);
free ((void *)ofifo_list);
+ discard_unwind_frame ("internal_fifos");
}
#endif
@@ -4977,9 +4983,14 @@ execute_builtin_or_function (words, builtin, var, redirects,
char *ofifo_list;
#endif
-#if defined (PROCESS_SUBSTITUTION)
+#if defined (PROCESS_SUBSTITUTION)
+ begin_unwind_frame ("saved_fifos");
+ /* If we return, we longjmp and don't get a chance to restore the old
+ fifo list, so we add an unwind protect to free it */
ofifo = num_fifos ();
ofifo_list = copy_fifo_list (&osize);
+ if (ofifo_list)
+ add_unwind_protect (xfree, ofifo_list);
#endif
if (do_redirections (redirects, RX_ACTIVE|RX_UNDOABLE) != 0)
@@ -5063,7 +5074,9 @@ execute_builtin_or_function (words, builtin, var, redirects,
nfifo = num_fifos ();
if (nfifo > ofifo)
close_new_fifos (ofifo_list, osize);
- free (ofifo_list);
+ if (ofifo_list)
+ free (ofifo_list);
+ discard_unwind_frame ("saved_fifos");
#endif
return (result);
diff --git a/patchlevel.h b/patchlevel.h
index 779671cd..09a3cc84 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 13
+#define PATCHLEVEL 14
#endif /* _PATCHLEVEL_H_ */
--
2.13.6

View File

@ -0,0 +1,38 @@
From 9cce630e80008e74fa9a1d9408367341caf363f2 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Mon, 29 Jan 2018 16:04:01 -0500
Subject: [PATCH] Bash-4.4 patch 15
---
patchlevel.h | 2 +-
subst.c | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/patchlevel.h b/patchlevel.h
index 09a3cc84..6e9ed3fc 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 14
+#define PATCHLEVEL 15
#endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
index dbf0157e..fc00cab0 100644
--- a/subst.c
+++ b/subst.c
@@ -5906,6 +5906,8 @@ process_substitute (string, open_for_read_in_child)
parent. */
expanding_redir = 0;
+ remove_quoted_escapes (string);
+
subshell_level++;
result = parse_and_execute (string, "process substitution", (SEVAL_NONINT|SEVAL_NOHIST));
subshell_level--;
--
2.13.6

View File

@ -0,0 +1,68 @@
From c9f1b04651dae16e33f0aa8974c5122e26b362ae Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Mon, 29 Jan 2018 16:04:20 -0500
Subject: [PATCH] Bash-4.4 patch 16
---
lib/sh/zread.c | 23 +++++++++--------------
patchlevel.h | 2 +-
2 files changed, 10 insertions(+), 15 deletions(-)
diff --git a/lib/sh/zread.c b/lib/sh/zread.c
index 868f9705..496f20b8 100644
--- a/lib/sh/zread.c
+++ b/lib/sh/zread.c
@@ -37,7 +37,10 @@ extern int errno;
# define SEEK_CUR 1
#endif
+extern int executing_builtin;
+
extern void check_signals_and_traps (void);
+extern void check_signals (void);
extern int signal_is_trapped (int);
/* Read LEN bytes from FD into BUF. Retry the read on EINTR. Any other
@@ -50,21 +53,13 @@ zread (fd, buf, len)
{
ssize_t r;
-#if 0
-#if defined (HAVE_SIGINTERRUPT)
- if (signal_is_trapped (SIGCHLD))
- siginterrupt (SIGCHLD, 1);
-#endif
-#endif
-
while ((r = read (fd, buf, len)) < 0 && errno == EINTR)
- check_signals_and_traps (); /* XXX - should it be check_signals()? */
-
-#if 0
-#if defined (HAVE_SIGINTERRUPT)
- siginterrupt (SIGCHLD, 0);
-#endif
-#endif
+ /* XXX - bash-5.0 */
+ /* We check executing_builtin and run traps here for backwards compatibility */
+ if (executing_builtin)
+ check_signals_and_traps (); /* XXX - should it be check_signals()? */
+ else
+ check_signals ();
return r;
}
diff --git a/patchlevel.h b/patchlevel.h
index 6e9ed3fc..9074f4dd 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 15
+#define PATCHLEVEL 16
#endif /* _PATCHLEVEL_H_ */
--
2.13.6

View File

@ -0,0 +1,41 @@
From b3a5ec8dd510a68dc850f3f516c0cf9afd87451f Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Mon, 29 Jan 2018 16:04:37 -0500
Subject: [PATCH] Bash-4.4 patch 17
---
builtins/read.def | 5 +++++
patchlevel.h | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/builtins/read.def b/builtins/read.def
index 33821f3f..803bea35 100644
--- a/builtins/read.def
+++ b/builtins/read.def
@@ -690,6 +690,11 @@ add_char:
input_string[i] = '\0';
CHECK_ALRM;
+#if defined (READLINE)
+ if (edit)
+ free (rlbuf);
+#endif
+
if (retval < 0)
{
t_errno = errno;
diff --git a/patchlevel.h b/patchlevel.h
index 9074f4dd..98e714da 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 16
+#define PATCHLEVEL 17
#endif /* _PATCHLEVEL_H_ */
--
2.13.6

View File

@ -0,0 +1,38 @@
From eb78197af36bb0fb95493ebf8fce104be6832ec9 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Mon, 29 Jan 2018 16:04:56 -0500
Subject: [PATCH] Bash-4.4 patch 18
---
builtins/read.def | 2 +-
patchlevel.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/builtins/read.def b/builtins/read.def
index 803bea35..b54b3af6 100644
--- a/builtins/read.def
+++ b/builtins/read.def
@@ -610,7 +610,7 @@ read_builtin (list)
}
CHECK_ALRM;
-
+ QUIT; /* in case we didn't call check_signals() */
#if defined (READLINE)
}
#endif
diff --git a/patchlevel.h b/patchlevel.h
index 98e714da..f0ee56e4 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 17
+#define PATCHLEVEL 18
#endif /* _PATCHLEVEL_H_ */
--
2.13.6

View File

@ -0,0 +1,40 @@
From b0776d8c49ab4310fa056ce1033985996c5b9807 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Tue, 6 Feb 2018 16:22:34 -0500
Subject: [PATCH] Bash-4.4 patch 19
---
lib/readline/display.c | 4 +++-
patchlevel.h | 2 +-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/lib/readline/display.c b/lib/readline/display.c
index 41fb0531..2d2e768a 100644
--- a/lib/readline/display.c
+++ b/lib/readline/display.c
@@ -771,7 +771,9 @@ rl_redisplay ()
appear in the first and last lines of the prompt */
wadjust = (newlines == 0)
? prompt_invis_chars_first_line
- : ((newlines == prompt_lines_estimate) ? wrap_offset : prompt_invis_chars_first_line);
+ : ((newlines == prompt_lines_estimate)
+ ? (wrap_offset - prompt_invis_chars_first_line)
+ : 0);
/* fix from Darin Johnson <darin@acuson.com> for prompt string with
invisible characters that is longer than the screen width. The
diff --git a/patchlevel.h b/patchlevel.h
index f0ee56e4..a711c495 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 18
+#define PATCHLEVEL 19
#endif /* _PATCHLEVEL_H_ */
--
2.13.6

View File

@ -0,0 +1,59 @@
From 280bd77d8d3e7f7c90c9fa07de3d1e8f8e18ac29 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Mon, 14 Nov 2016 14:27:06 -0500
Subject: [PATCH] Bash-4.4 patch 2
---
patchlevel.h | 2 +-
subst.c | 9 ++++++++-
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/patchlevel.h b/patchlevel.h
index 40db1a3..a988d85 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 1
+#define PATCHLEVEL 2
#endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
index f1a4df1..4d498ef 100644
--- a/subst.c
+++ b/subst.c
@@ -5931,6 +5931,7 @@ read_comsub (fd, quoted, rflag)
char *istring, buf[128], *bufp, *s;
int istring_index, istring_size, c, tflag, skip_ctlesc, skip_ctlnul;
ssize_t bufn;
+ int nullbyte;
istring = (char *)NULL;
istring_index = istring_size = bufn = tflag = 0;
@@ -5938,6 +5939,8 @@ read_comsub (fd, quoted, rflag)
for (skip_ctlesc = skip_ctlnul = 0, s = ifs_value; s && *s; s++)
skip_ctlesc |= *s == CTLESC, skip_ctlnul |= *s == CTLNUL;
+ nullbyte = 0;
+
/* Read the output of the command through the pipe. This may need to be
changed to understand multibyte characters in the future. */
while (1)
@@ -5956,7 +5959,11 @@ read_comsub (fd, quoted, rflag)
if (c == 0)
{
#if 1
- internal_warning ("%s", _("command substitution: ignored null byte in input"));
+ if (nullbyte == 0)
+ {
+ internal_warning ("%s", _("command substitution: ignored null byte in input"));
+ nullbyte = 1;
+ }
#endif
continue;
}
--
2.9.3

View File

@ -0,0 +1,136 @@
From 354efb96f1e4574f458e994163bbe31c76769573 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 1 Jun 2018 10:19:56 -0400
Subject: [PATCH] saved background process status hash table loop fixes
---
jobs.c | 62 +++++++++++++++++++++++++++++++++++++++++-----------
patchlevel.h | 2 +-
2 files changed, 50 insertions(+), 14 deletions(-)
diff --git a/jobs.c b/jobs.c
index fc966036..2684632d 100644
--- a/jobs.c
+++ b/jobs.c
@@ -812,8 +812,22 @@ bgp_add (pid, status)
ps_index_t *bucket, psi;
struct pidstat *ps;
- bucket = pshash_getbucket (pid);
- psi = bgp_getindex ();
+ /* bucket == existing chain of pids hashing to same value
+ psi = where were going to put this pid/status */
+
+ bucket = pshash_getbucket (pid); /* index into pidstat_table */
+ psi = bgp_getindex (); /* bgpids.head, index into storage */
+
+ /* XXX - what if psi == *bucket? */
+ if (psi == *bucket)
+ {
+#ifdef DEBUG
+ internal_warning ("hashed pid %d (pid %d) collides with bgpids.head, skipping", psi, pid);
+#endif
+ bgpids.storage[psi].pid = NO_PID; /* make sure */
+ psi = bgp_getindex (); /* skip to next one */
+ }
+
ps = &bgpids.storage[psi];
ps->pid = pid;
@@ -841,32 +855,47 @@ pshash_delindex (psi)
ps_index_t psi;
{
struct pidstat *ps;
+ ps_index_t *bucket;
ps = &bgpids.storage[psi];
if (ps->pid == NO_PID)
return;
- if (ps->bucket_next != NO_PID)
+ if (ps->bucket_next != NO_PIDSTAT)
bgpids.storage[ps->bucket_next].bucket_prev = ps->bucket_prev;
- if (ps->bucket_prev != NO_PID)
+ if (ps->bucket_prev != NO_PIDSTAT)
bgpids.storage[ps->bucket_prev].bucket_next = ps->bucket_next;
else
- *(pshash_getbucket (ps->pid)) = ps->bucket_next;
+ {
+ bucket = pshash_getbucket (ps->pid);
+ *bucket = ps->bucket_next; /* deleting chain head in hash table */
+ }
+
+ /* clear out this cell, just in case */
+ ps->pid = NO_PID;
+ ps->bucket_next = ps->bucket_prev = NO_PIDSTAT;
}
static int
bgp_delete (pid)
pid_t pid;
{
- ps_index_t psi;
+ ps_index_t psi, orig_psi;
if (bgpids.storage == 0 || bgpids.nalloc == 0 || bgpids.npid == 0)
return 0;
/* Search chain using hash to find bucket in pidstat_table */
- for (psi = *(pshash_getbucket (pid)); psi != NO_PIDSTAT; psi = bgpids.storage[psi].bucket_next)
- if (bgpids.storage[psi].pid == pid)
- break;
+ for (orig_psi = psi = *(pshash_getbucket (pid)); psi != NO_PIDSTAT; psi = bgpids.storage[psi].bucket_next)
+ {
+ if (bgpids.storage[psi].pid == pid)
+ break;
+ if (orig_psi == bgpids.storage[psi].bucket_next) /* catch reported bug */
+ {
+ internal_warning ("bgp_delete: LOOP: psi (%d) == storage[psi].bucket_next", psi);
+ return 0;
+ }
+ }
if (psi == NO_PIDSTAT)
return 0; /* not found */
@@ -904,15 +933,22 @@ static int
bgp_search (pid)
pid_t pid;
{
- ps_index_t psi;
+ ps_index_t psi, orig_psi;
if (bgpids.storage == 0 || bgpids.nalloc == 0 || bgpids.npid == 0)
return -1;
/* Search chain using hash to find bucket in pidstat_table */
- for (psi = *(pshash_getbucket (pid)); psi != NO_PIDSTAT; psi = bgpids.storage[psi].bucket_next)
- if (bgpids.storage[psi].pid == pid)
- return (bgpids.storage[psi].status);
+ for (orig_psi = psi = *(pshash_getbucket (pid)); psi != NO_PIDSTAT; psi = bgpids.storage[psi].bucket_next)
+ {
+ if (bgpids.storage[psi].pid == pid)
+ return (bgpids.storage[psi].status);
+ if (orig_psi == bgpids.storage[psi].bucket_next) /* catch reported bug */
+ {
+ internal_warning ("bgp_search: LOOP: psi (%d) == storage[psi].bucket_next", psi);
+ return -1;
+ }
+ }
return -1;
}
diff --git a/patchlevel.h b/patchlevel.h
index a711c495..4a65dc0f 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 19
+#define PATCHLEVEL 20
#endif /* _PATCHLEVEL_H_ */
--
2.29.2

View File

@ -0,0 +1,52 @@
From 4f59a8babc53a9f975078c4a003bdc8831c5ee22 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Mon, 14 Nov 2016 14:27:23 -0500
Subject: [PATCH] Bash-4.4 patch 3
---
lib/glob/sm_loop.c | 9 +++++++++
patchlevel.h | 2 +-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/lib/glob/sm_loop.c b/lib/glob/sm_loop.c
index c3a2aa3..65179e2 100644
--- a/lib/glob/sm_loop.c
+++ b/lib/glob/sm_loop.c
@@ -330,6 +330,12 @@ PARSE_COLLSYM (p, vp)
for (pc = 0; p[pc]; pc++)
if (p[pc] == L('.') && p[pc+1] == L(']'))
break;
+ if (p[pc] == 0)
+ {
+ if (vp)
+ *vp = INVALID;
+ return (p + pc);
+ }
val = COLLSYM (p, pc);
if (vp)
*vp = val;
@@ -483,6 +489,9 @@ BRACKMATCH (p, test, flags)
c = *p++;
c = FOLD (c);
+ if (c == L('\0'))
+ return ((test == L('[')) ? savep : (CHAR *)0);
+
if ((flags & FNM_PATHNAME) && c == L('/'))
/* [/] can never match when matching a pathname. */
return (CHAR *)0;
diff --git a/patchlevel.h b/patchlevel.h
index a988d85..e7e960c 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 2
+#define PATCHLEVEL 3
#endif /* _PATCHLEVEL_H_ */
--
2.9.3

View File

@ -0,0 +1,81 @@
From 2965eca924466a48c5597ac5c6c86d470e718908 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Mon, 14 Nov 2016 14:27:35 -0500
Subject: [PATCH] Bash-4.4 patch 4
---
jobs.c | 15 +++++++++++++++
jobs.h | 1 +
patchlevel.h | 2 +-
subst.c | 5 +----
4 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/jobs.c b/jobs.c
index cef3c79..fc96603 100644
--- a/jobs.c
+++ b/jobs.c
@@ -453,6 +453,21 @@ cleanup_the_pipeline ()
discard_pipeline (disposer);
}
+void
+discard_last_procsub_child ()
+{
+ PROCESS *disposer;
+ sigset_t set, oset;
+
+ BLOCK_CHILD (set, oset);
+ disposer = last_procsub_child;
+ last_procsub_child = (PROCESS *)NULL;
+ UNBLOCK_CHILD (oset);
+
+ if (disposer)
+ discard_pipeline (disposer);
+}
+
struct pipeline_saver *
alloc_pipeline_saver ()
{
diff --git a/jobs.h b/jobs.h
index 4ba3513..6df0607 100644
--- a/jobs.h
+++ b/jobs.h
@@ -190,6 +190,7 @@ extern JOB **jobs;
extern void making_children __P((void));
extern void stop_making_children __P((void));
extern void cleanup_the_pipeline __P((void));
+extern void discard_last_procsub_child __P((void));
extern void save_pipeline __P((int));
extern PROCESS *restore_pipeline __P((int));
extern void start_pipeline __P((void));
diff --git a/patchlevel.h b/patchlevel.h
index e7e960c..c059f0b 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 3
+#define PATCHLEVEL 4
#endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
index 4d498ef..298187d 100644
--- a/subst.c
+++ b/subst.c
@@ -5808,10 +5808,7 @@ process_substitute (string, open_for_read_in_child)
{
#if defined (JOB_CONTROL)
if (last_procsub_child)
- {
- discard_pipeline (last_procsub_child);
- last_procsub_child = (PROCESS *)NULL;
- }
+ discard_last_procsub_child ();
last_procsub_child = restore_pipeline (0);
#endif
--
2.9.3

View File

@ -0,0 +1,42 @@
From f459cbd8be37b28be1dc90315e0ab51d7f211301 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Mon, 14 Nov 2016 14:27:55 -0500
Subject: [PATCH] Bash-4.4 patch 5
---
builtins/evalstring.c | 3 ---
patchlevel.h | 2 +-
2 files changed, 1 insertion(+), 4 deletions(-)
diff --git a/builtins/evalstring.c b/builtins/evalstring.c
index e221591..6dc756c 100644
--- a/builtins/evalstring.c
+++ b/builtins/evalstring.c
@@ -104,12 +104,9 @@ should_suppress_fork (command)
running_trap == 0 &&
*bash_input.location.string == '\0' &&
command->type == cm_simple &&
-#if 0
signal_is_trapped (EXIT_TRAP) == 0 &&
signal_is_trapped (ERROR_TRAP) == 0 &&
-#else
any_signals_trapped () < 0 &&
-#endif
command->redirects == 0 && command->value.Simple->redirects == 0 &&
((command->flags & CMD_TIME_PIPELINE) == 0) &&
((command->flags & CMD_INVERT_RETURN) == 0));
diff --git a/patchlevel.h b/patchlevel.h
index c059f0b..1bc098b 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 4
+#define PATCHLEVEL 5
#endif /* _PATCHLEVEL_H_ */
--
2.9.3

View File

@ -0,0 +1,50 @@
From 44bfefc553993613c0aff992bc4f3078d738ee1d Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 20 Jan 2017 11:47:31 -0500
Subject: [PATCH] Bash-4.4 patch 6
---
builtins/pushd.def | 7 ++++++-
patchlevel.h | 2 +-
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/builtins/pushd.def b/builtins/pushd.def
index 82653c4..6579e4c 100644
--- a/builtins/pushd.def
+++ b/builtins/pushd.def
@@ -365,7 +365,7 @@ popd_builtin (list)
break;
}
- if (which > directory_list_offset || (directory_list_offset == 0 && which == 0))
+ if (which > directory_list_offset || (which < -directory_list_offset) || (directory_list_offset == 0 && which == 0))
{
pushd_error (directory_list_offset, which_word ? which_word : "");
return (EXECUTION_FAILURE);
@@ -387,6 +387,11 @@ popd_builtin (list)
remove that directory from the list and shift the remainder
of the list into place. */
i = (direction == '+') ? directory_list_offset - which : which;
+ if (i < 0 || i > directory_list_offset)
+ {
+ pushd_error (directory_list_offset, which_word ? which_word : "");
+ return (EXECUTION_FAILURE);
+ }
free (pushd_directory_list[i]);
directory_list_offset--;
diff --git a/patchlevel.h b/patchlevel.h
index 1bc098b..14bff9f 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 5
+#define PATCHLEVEL 6
#endif /* _PATCHLEVEL_H_ */
--
2.9.3

View File

@ -0,0 +1,114 @@
From 4f747edc625815f449048579f6e65869914dd715 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 20 Jan 2017 11:47:55 -0500
Subject: [PATCH] Bash-4.4 patch 7
---
bashline.c | 22 ++++++++++++----------
patchlevel.h | 2 +-
subst.c | 4 ++++
3 files changed, 17 insertions(+), 11 deletions(-)
diff --git a/bashline.c b/bashline.c
index f4fe9f1..0275844 100644
--- a/bashline.c
+++ b/bashline.c
@@ -142,7 +142,7 @@ static int executable_completion __P((const char *, int));
static rl_icppfunc_t *save_directory_hook __P((void));
static void restore_directory_hook __P((rl_icppfunc_t));
-static int directory_exists __P((const char *));
+static int directory_exists __P((const char *, int));
static void cleanup_expansion_error __P((void));
static void maybe_make_readline_line __P((char *));
@@ -3102,18 +3102,20 @@ restore_directory_hook (hookf)
rl_directory_rewrite_hook = hookf;
}
-/* Check whether not the (dequoted) version of DIRNAME, with any trailing slash
- removed, exists. */
+/* Check whether not DIRNAME, with any trailing slash removed, exists. If
+ SHOULD_DEQUOTE is non-zero, we dequote the directory name first. */
static int
-directory_exists (dirname)
+directory_exists (dirname, should_dequote)
const char *dirname;
+ int should_dequote;
{
char *new_dirname;
int dirlen, r;
struct stat sb;
- /* First, dequote the directory name */
- new_dirname = bash_dequote_filename ((char *)dirname, rl_completion_quote_character);
+ /* We save the string and chop the trailing slash because stat/lstat behave
+ inconsistently if one is present. */
+ new_dirname = should_dequote ? bash_dequote_filename ((char *)dirname, rl_completion_quote_character) : savestring (dirname);
dirlen = STRLEN (new_dirname);
if (new_dirname[dirlen - 1] == '/')
new_dirname[dirlen - 1] = '\0';
@@ -3145,7 +3147,7 @@ bash_filename_stat_hook (dirname)
else if (t = mbschr (local_dirname, '`')) /* XXX */
should_expand_dirname = '`';
- if (should_expand_dirname && directory_exists (local_dirname))
+ if (should_expand_dirname && directory_exists (local_dirname, 0))
should_expand_dirname = 0;
if (should_expand_dirname)
@@ -3155,7 +3157,7 @@ bash_filename_stat_hook (dirname)
have to worry about restoring this setting. */
global_nounset = unbound_vars_is_error;
unbound_vars_is_error = 0;
- wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_COMPLETE); /* does the right thing */
+ wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_NOPROCSUB|W_COMPLETE); /* does the right thing */
unbound_vars_is_error = global_nounset;
if (wl)
{
@@ -3244,13 +3246,13 @@ bash_directory_completion_hook (dirname)
should_expand_dirname = '`';
}
- if (should_expand_dirname && directory_exists (local_dirname))
+ if (should_expand_dirname && directory_exists (local_dirname, 1))
should_expand_dirname = 0;
if (should_expand_dirname)
{
new_dirname = savestring (local_dirname);
- wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_COMPLETE); /* does the right thing */
+ wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_NOPROCSUB|W_COMPLETE); /* does the right thing */
if (wl)
{
*dirname = string_list (wl);
diff --git a/patchlevel.h b/patchlevel.h
index 14bff9f..deb9c5b 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 6
+#define PATCHLEVEL 7
#endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
index 298187d..027a13e 100644
--- a/subst.c
+++ b/subst.c
@@ -9458,6 +9458,10 @@ add_twochars:
tword->flags |= word->flags & (W_ASSIGNARG|W_ASSIGNRHS); /* affects $@ */
if (word->flags & W_COMPLETE)
tword->flags |= W_COMPLETE; /* for command substitutions */
+ if (word->flags & W_NOCOMSUB)
+ tword->flags |= W_NOCOMSUB;
+ if (word->flags & W_NOPROCSUB)
+ tword->flags |= W_NOPROCSUB;
temp = (char *)NULL;
--
2.9.3

View File

@ -0,0 +1,71 @@
From b9f81c2977b82490cd4dc70b0bb292bfbf86bd2c Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 20 Jan 2017 15:38:10 -0500
Subject: [PATCH] Bash-4.4 patch 8
---
expr.c | 15 +++++++++------
patchlevel.h | 2 +-
2 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/expr.c b/expr.c
index 1ddb693..172964a 100644
--- a/expr.c
+++ b/expr.c
@@ -578,24 +578,23 @@ expcond ()
rval = cval = explor ();
if (curtok == QUES) /* found conditional expr */
{
- readtok ();
- if (curtok == 0 || curtok == COL)
- evalerror (_("expression expected"));
if (cval == 0)
{
set_noeval = 1;
noeval++;
}
+ readtok ();
+ if (curtok == 0 || curtok == COL)
+ evalerror (_("expression expected"));
+
val1 = EXP_HIGHEST ();
if (set_noeval)
noeval--;
if (curtok != COL)
evalerror (_("`:' expected for conditional expression"));
- readtok ();
- if (curtok == 0)
- evalerror (_("expression expected"));
+
set_noeval = 0;
if (cval)
{
@@ -603,7 +602,11 @@ expcond ()
noeval++;
}
+ readtok ();
+ if (curtok == 0)
+ evalerror (_("expression expected"));
val2 = expcond ();
+
if (set_noeval)
noeval--;
rval = cval ? val1 : val2;
diff --git a/patchlevel.h b/patchlevel.h
index deb9c5b..16c8740 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 7
+#define PATCHLEVEL 8
#endif /* _PATCHLEVEL_H_ */
--
2.9.3

View File

@ -0,0 +1,80 @@
From e59fb114e9c0436890d110cfdda4d794a63496e7 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 20 Jan 2017 15:38:29 -0500
Subject: [PATCH] Bash-4.4 patch 9
---
lib/readline/history.c | 16 +++++++---------
patchlevel.h | 2 +-
2 files changed, 8 insertions(+), 10 deletions(-)
diff --git a/lib/readline/history.c b/lib/readline/history.c
index 9ff25a7..129c57a 100644
--- a/lib/readline/history.c
+++ b/lib/readline/history.c
@@ -279,6 +279,7 @@ add_history (string)
const char *string;
{
HIST_ENTRY *temp;
+ int new_length;
if (history_stifled && (history_length == history_max_entries))
{
@@ -295,13 +296,9 @@ add_history (string)
/* Copy the rest of the entries, moving down one slot. Copy includes
trailing NULL. */
-#if 0
- for (i = 0; i < history_length; i++)
- the_history[i] = the_history[i + 1];
-#else
memmove (the_history, the_history + 1, history_length * sizeof (HIST_ENTRY *));
-#endif
+ new_length = history_length;
history_base++;
}
else
@@ -315,7 +312,7 @@ add_history (string)
else
history_size = DEFAULT_HISTORY_INITIAL_SIZE;
the_history = (HIST_ENTRY **)xmalloc (history_size * sizeof (HIST_ENTRY *));
- history_length = 1;
+ new_length = 1;
}
else
{
@@ -325,14 +322,15 @@ add_history (string)
the_history = (HIST_ENTRY **)
xrealloc (the_history, history_size * sizeof (HIST_ENTRY *));
}
- history_length++;
+ new_length = history_length + 1;
}
}
temp = alloc_history_entry ((char *)string, hist_inittime ());
- the_history[history_length] = (HIST_ENTRY *)NULL;
- the_history[history_length - 1] = temp;
+ the_history[new_length] = (HIST_ENTRY *)NULL;
+ the_history[new_length - 1] = temp;
+ history_length = new_length;
}
/* Change the time stamp of the most recent history entry to STRING. */
diff --git a/patchlevel.h b/patchlevel.h
index 16c8740..02f1d60 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 8
+#define PATCHLEVEL 9
#endif /* _PATCHLEVEL_H_ */
--
2.9.3

View File

@ -0,0 +1,11 @@
diff --git a/parse.y b/parse.y
index 85f1c4f..9d1cdf8 100644
--- a/parse.y
+++ b/parse.y
@@ -1453,6 +1453,7 @@ yy_readline_get ()
old_sigint = (SigHandler *)set_signal_handler (SIGINT, sigint_sighandler);
}
+ sh_unset_nodelay_mode (fileno (rl_instream)); /* just in case */
current_readline_line = readline (current_readline_prompt ?
current_readline_prompt : "");

View File

@ -0,0 +1,11 @@
diff --git a/config.h.in b/config.h.in
--- a/config.h.in
+++ b/config.h.in
@@ -449,6 +449,7 @@
#undef SYS_TIME_H_DEFINES_STRUCT_TIMESPEC
#undef PTHREAD_H_DEFINES_STRUCT_TIMESPEC
+#undef HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC
#undef TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC
#undef HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC
#undef HAVE_STRUCT_STAT_ST_ATIMENSEC

View File

@ -0,0 +1,95 @@
diff --git a/include/typemax.h b/include/typemax.h
--- a/include/typemax.h
+++ b/include/typemax.h
@@ -35,14 +35,23 @@
# define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
#endif
+#ifndef TYPE_SIGNED_MAGNITUDE
+# define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
+#endif
+
+#ifndef TYPE_WIDTH
+# define TYPE_WIDTH(t) (sizeof (t) * CHAR_BIT)
+#endif
+
#ifndef TYPE_MINIMUM
-# define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \
- ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) \
- : (t) 0))
+# define TYPE_MINIMUM(t) ((t) ~ TYPE_MAXIMUM (t))
#endif
#ifndef TYPE_MAXIMUM
-# define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t)))
+# define TYPE_MAXIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) -1 \
+ : ((((t) 1 << (TYPE_WIDTH (t) - 2)) - 1) * 2 + 1)))
#endif
#ifdef HAVE_LONG_LONG
diff --git a/jobs.c b/jobs.c
--- a/jobs.c
+++ b/jobs.c
@@ -72,6 +72,8 @@
#include "execute_cmd.h"
#include "flags.h"
+#include "typemax.h"
+
#include "builtins/builtext.h"
#include "builtins/common.h"
@@ -92,7 +94,7 @@ extern int killpg __P((pid_t, int));
#endif
#if !MAX_CHILD_MAX
-# define MAX_CHILD_MAX 8192
+# define MAX_CHILD_MAX 32768
#endif
#if !defined (DEBUG)
@@ -751,7 +753,7 @@ stop_pipeline (async, deferred)
static void
bgp_resize ()
{
- ps_index_t nsize;
+ ps_index_t nsize, nsize_cur, nsize_max;
ps_index_t psi;
if (bgpids.nalloc == 0)
@@ -765,11 +767,20 @@ bgp_resize ()
else
nsize = bgpids.nalloc;
- while (nsize < js.c_childmax)
- nsize *= 2;
+ nsize_max = TYPE_MAXIMUM (ps_index_t);
+ nsize_cur = (ps_index_t)js.c_childmax;
+ if (nsize_cur < 0) /* overflow */
+ nsize_cur = MAX_CHILD_MAX;
- if (bgpids.nalloc < js.c_childmax)
- {
+ while (nsize > 0 && nsize < nsize_cur) /* > 0 should catch overflow */
+ nsize <<= 1;
+ if (nsize > nsize_max || nsize <= 0) /* overflow? */
+ nsize = nsize_max;
+ if (nsize > MAX_CHILD_MAX)
+ nsize = nsize_max = MAX_CHILD_MAX; /* hard cap */
+
+ if (bgpids.nalloc < nsize_cur && bgpids.nalloc < nsize_max)
+ {
bgpids.storage = (struct pidstat *)xrealloc (bgpids.storage, nsize * sizeof (struct pidstat));
for (psi = bgpids.nalloc; psi < nsize; psi++)
@@ -787,7 +798,7 @@ bgp_getindex ()
{
ps_index_t psi;
- if (bgpids.nalloc < js.c_childmax || bgpids.head >= bgpids.nalloc)
+ if (bgpids.nalloc < (ps_index_t)js.c_childmax || bgpids.head >= bgpids.nalloc)
bgp_resize ();
pshash_delindex (bgpids.head); /* XXX - clear before reusing */

View File

@ -0,0 +1,41 @@
diff --git a/configure.ac b/configure.ac
index e5162c4..b82a33b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -799,10 +799,13 @@ AC_CHECK_DECLS([confstr])
AC_CHECK_DECLS([printf])
AC_CHECK_DECLS([sbrk])
AC_CHECK_DECLS([setregid])
-AC_CHECK_DECLS[(setresuid, setresgid])
+dnl AC_CHECK_DECLS[(setresuid])
+dnl AC_CHECK_DECLS[(setresgid])
AC_CHECK_DECLS([strcpy])
AC_CHECK_DECLS([strsignal])
+AC_CHECK_FUNCS(setresuid setresgid)
+
dnl Extra test to detect the horribly broken HP/UX 11.00 strtold(3)
AC_CHECK_DECLS([strtold], [
AC_MSG_CHECKING([for broken strtold])
diff --git a/shell.c b/shell.c
index 484d8a9..5c24922 100644
--- a/shell.c
+++ b/shell.c
@@ -1286,7 +1286,7 @@ disable_priv_mode ()
{
int e;
-#if HAVE_DECL_SETRESUID
+#if HAVE_SETRESUID
if (setresuid (current_user.uid, current_user.uid, current_user.uid) < 0)
#else
if (setuid (current_user.uid) < 0)
@@ -1299,7 +1299,7 @@ disable_priv_mode ()
exit (e);
#endif
}
-#if HAVE_DECL_SETRESGID
+#if HAVE_SETRESGID
if (setresgid (current_user.gid, current_user.gid, current_user.gid) < 0)
#else
if (setgid (current_user.gid) < 0)

View File

@ -0,0 +1,61 @@
diff --git a/config.h.in b/config.h.in
index 1a89e85..2df4786 100644
--- a/config.h.in
+++ b/config.h.in
@@ -801,6 +801,14 @@
#undef HAVE_SETREGID
#undef HAVE_DECL_SETREGID
+/* Define if you have the setregid function. */
+#undef HAVE_SETRESGID
+#undef HAVE_DECL_SETRESGID
+
+/* Define if you have the setresuid function. */
+#undef HAVE_SETRESUID
+#undef HAVE_DECL_SETRESUID
+
/* Define if you have the setvbuf function. */
#undef HAVE_SETVBUF
diff --git a/configure.ac b/configure.ac
index a3f6d8f..e5162c4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -799,6 +799,7 @@ AC_CHECK_DECLS([confstr])
AC_CHECK_DECLS([printf])
AC_CHECK_DECLS([sbrk])
AC_CHECK_DECLS([setregid])
+AC_CHECK_DECLS[(setresuid, setresgid])
AC_CHECK_DECLS([strcpy])
AC_CHECK_DECLS([strsignal])
diff --git a/shell.c b/shell.c
index 4aae182..484d8a9 100644
--- a/shell.c
+++ b/shell.c
@@ -1286,7 +1286,11 @@ disable_priv_mode ()
{
int e;
+#if HAVE_DECL_SETRESUID
+ if (setresuid (current_user.uid, current_user.uid, current_user.uid) < 0)
+#else
if (setuid (current_user.uid) < 0)
+#endif
{
e = errno;
sys_error (_("cannot set uid to %d: effective uid %d"), current_user.uid, current_user.euid);
@@ -1295,7 +1299,11 @@ disable_priv_mode ()
exit (e);
#endif
}
+#if HAVE_DECL_SETRESGID
+ if (setresgid (current_user.gid, current_user.gid, current_user.gid) < 0)
+#else
if (setgid (current_user.gid) < 0)
+#endif
sys_error (_("cannot set gid to %d: effective gid %d"), current_user.gid, current_user.egid);
current_user.euid = current_user.uid;
--
2.25.4

View File

@ -0,0 +1,19 @@
diff --git a/builtins/history.def b/builtins/history.def
--- a/builtins/history.def
+++ b/builtins/history.def
@@ -256,10 +256,13 @@ histtime (hlist, histtimefmt)
{
static char timestr[128];
time_t t;
+ struct tm *tm;
t = history_get_time (hlist);
- if (t)
- strftime (timestr, sizeof (timestr), histtimefmt, localtime (&t));
+
+ tm = t ? localtime (&t) : 0;
+ if (t && tm)
+ strftime (timestr, sizeof (timestr), histtimefmt, tm);
else if (hlist->timestamp && hlist->timestamp[0])
snprintf (timestr, sizeof (timestr), _("%s: invalid timestamp"),
(hlist->timestamp[0] == '#') ? hlist->timestamp + 1: hlist->timestamp);

View File

@ -0,0 +1,12 @@
diff --git a/parse.y b/parse.y
--- a/parse.y
+++ b/parse.y
@@ -4193,7 +4193,7 @@ eof_error:
FREE (nestret);
}
- if MBTEST(ch == '$')
+ if MBTEST(ch == '$' && (tflags & LEX_WASDOL) == 0)
tflags |= LEX_WASDOL;
else
tflags &= ~LEX_WASDOL;

View File

@ -0,0 +1,84 @@
diff --git a/bashhist.c b/bashhist.c
index 9979f99..793c81f 100644
--- a/bashhist.c
+++ b/bashhist.c
@@ -754,6 +754,12 @@ extern char *shell_name;
#define OPENLOG_OPTS 0
#endif
+#if defined (SYSLOG_SHOPT)
+int syslog_history = SYSLOG_SHOPT;
+#else
+int syslog_history = 1;
+#endif
+
void
bash_syslog_history (line)
const char *line;
@@ -851,7 +857,8 @@ bash_add_history (line)
really_add_history (line);
#if defined (SYSLOG_HISTORY)
- bash_syslog_history (line);
+ if (syslog_history)
+ bash_syslog_history (line);
#endif
using_history ();
diff --git a/builtins/shopt.def b/builtins/shopt.def
index 2febb7e..38c398e 100644
--- a/builtins/shopt.def
+++ b/builtins/shopt.def
@@ -118,6 +118,10 @@ extern char *shell_name;
extern int debugging_mode;
#endif
+#if defined (SYSLOG_HISTORY) && defined (SYSLOG_SHOPT)
+extern int syslog_history;
+#endif
+
static void shopt_error __P((char *));
static int set_shellopts_after_change __P((char *, int));
@@ -223,6 +227,9 @@ static struct {
#endif
{ "shift_verbose", &print_shift_error, (shopt_set_func_t *)NULL },
{ "sourcepath", &source_uses_path, (shopt_set_func_t *)NULL },
+#if defined (SYSLOG_HISTORY) && defined (SYSLOG_SHOPT)
+ { "syslog_history", &syslog_history, (shopt_set_func_t *)NULL },
+#endif
{ "xpg_echo", &xpg_echo, (shopt_set_func_t *)NULL },
{ (char *)0, (int *)0, (shopt_set_func_t *)NULL }
};
diff --git a/config-top.h b/config-top.h
index cb0e002..39cf6b5 100644
--- a/config-top.h
+++ b/config-top.h
@@ -122,6 +122,13 @@
# define OPENLOG_OPTS LOG_PID
#endif
+/* Define if you want syslogging history to be controllable at runtime via a
+ shell option; if defined, the value is the default for the syslog_history
+ shopt option */
+#if defined (SYSLOG_HISTORY)
+#define SYSLOG_SHOPT 0
+#endif
+
/* Define if you want to include code in shell.c to support wordexp(3) */
/* #define WORDEXP_OPTION */
diff --git a/doc/bash.1 b/doc/bash.1
index d6cee1d..9dfa0b3 100644
--- a/doc/bash.1
+++ b/doc/bash.1
@@ -9889,6 +9889,9 @@ If set, the
to find the directory containing the file supplied as an argument.
This option is enabled by default.
.TP 8
+.B syslog_history
+If set, command history is logged to syslog.
+.TP 8
.B xpg_echo
If set, the \fBecho\fP builtin expands backslash-escape sequences
by default.

View File

@ -0,0 +1,26 @@
diff --git a/doc/Makefile.in b/doc/Makefile.in
index 5f0756c..a5fa5a0 100644
--- a/doc/Makefile.in
+++ b/doc/Makefile.in
@@ -74,7 +74,6 @@ TEXI2DVI = ${SUPPORT_SRCDIR}/texi2dvi
TEXI2HTML = ${SUPPORT_SRCDIR}/texi2html
MAN2HTML = ${BUILD_DIR}/support/man2html
HTMLPOST = ${srcdir}/htmlpost.sh
-INFOPOST = ${srcdir}/infopost.sh
QUIETPS = #set this to -q to shut up dvips
PAPERSIZE = letter # change to a4 for A4-size paper
PSDPI = 600 # could be 300 if you like
@@ -188,8 +187,8 @@ bashref.pdf: $(BASHREF_FILES) $(HSUSER) $(RLUSER)
bashref.html: $(BASHREF_FILES) $(HSUSER) $(RLUSER)
$(MAKEINFO) --html --no-split -I$(TEXINPUTDIR) $(srcdir)/bashref.texi
-bash.info: bashref.info
- ${SHELL} ${INFOPOST} < $(srcdir)/bashref.info > $@ ; \
+bash.info: $(BASHREF_FILES) $(HSUSER) $(RLUSER)
+ $(MAKEINFO) --no-split -I$(TEXINPUTDIR) $(srcdir)/bashref.texi -o $@
bash.txt: bash.1
bash.ps: bash.1
--
2.9.3

View File

@ -1,18 +1,20 @@
diff --git a/builtins.h b/builtins.h diff --git a/builtins.h b/builtins.h
index 0cfea18..a6ef958 100644
--- a/builtins.h --- a/builtins.h
+++ b/builtins.h +++ b/builtins.h
@@ -46,6 +46,7 @@ @@ -42,6 +42,7 @@
#define ASSIGNMENT_BUILTIN 0x10 /* This builtin takes assignment statements. */
#define POSIX_BUILTIN 0x20 /* This builtins is special in the Posix command search order. */ #define POSIX_BUILTIN 0x20 /* This builtins is special in the Posix command search order. */
#define LOCALVAR_BUILTIN 0x40 /* This builtin creates local variables */ #define LOCALVAR_BUILTIN 0x40 /* This builtin creates local variables */
#define ARRAYREF_BUILTIN 0x80 /* This builtin takes array references as arguments */ +#define REQUIRES_BUILTIN 0x80 /* This builtin requires other files. */
+#define REQUIRES_BUILTIN 0x100 /* This builtin requires other files. */
#define BASE_INDENT 4 #define BASE_INDENT 4
diff --git a/builtins/mkbuiltins.c b/builtins/mkbuiltins.c diff --git a/builtins/mkbuiltins.c b/builtins/mkbuiltins.c
index 4f51201..283bfea 100644
--- a/builtins/mkbuiltins.c --- a/builtins/mkbuiltins.c
+++ b/builtins/mkbuiltins.c +++ b/builtins/mkbuiltins.c
@@ -69,11 +69,16 @@ extern char *strcpy (); @@ -69,10 +69,15 @@ extern char *strcpy ();
#define whitespace(c) (((c) == ' ') || ((c) == '\t')) #define whitespace(c) (((c) == ' ') || ((c) == '\t'))
/* Flag values that builtins can have. */ /* Flag values that builtins can have. */
@ -24,61 +26,58 @@ diff --git a/builtins/mkbuiltins.c b/builtins/mkbuiltins.c
#define BUILTIN_FLAG_ASSIGNMENT 0x02 #define BUILTIN_FLAG_ASSIGNMENT 0x02
#define BUILTIN_FLAG_LOCALVAR 0x04 #define BUILTIN_FLAG_LOCALVAR 0x04
#define BUILTIN_FLAG_POSIX_BUILTIN 0x08 #define BUILTIN_FLAG_POSIX_BUILTIN 0x08
#define BUILTIN_FLAG_ARRAYREF_ARG 0x10 +#define BUILTIN_FLAG_REQUIRES 0x10
+#define BUILTIN_FLAG_REQUIRES 0x20
#define BASE_INDENT 4 #define BASE_INDENT 4
@@ -189,13 +194,21 @@ char *arrayvar_builtins[] = @@ -173,11 +178,20 @@ char *posix_builtins[] =
"typeset", "unset", "wait", /*]*/
(char *)NULL (char *)NULL
}; };
-
+
+/* The builtin commands that cause requirements on other files. */ +/* The builtin commands that cause requirements on other files. */
+static char *requires_builtins[] = +static char *requires_builtins[] =
+{ +{
+ ".", "command", "exec", "source", "inlib", + ".", "command", "exec", "source", "inlib",
+ (char *)NULL + (char *)NULL
+}; +};
+
+ +
/* Forward declarations. */ /* Forward declarations. */
static int is_special_builtin (); static int is_special_builtin ();
static int is_assignment_builtin (); static int is_assignment_builtin ();
static int is_localvar_builtin (); static int is_localvar_builtin ();
static int is_posix_builtin (); static int is_posix_builtin ();
static int is_arrayvar_builtin ();
+static int is_requires_builtin (); +static int is_requires_builtin ();
#if !defined (HAVE_RENAME) #if !defined (HAVE_RENAME)
static int rename (); static int rename ();
@@ -856,6 +869,8 @@ builtin_handler (self, defs, arg) @@ -831,6 +845,9 @@ builtin_handler (self, defs, arg)
new->flags |= BUILTIN_FLAG_LOCALVAR;
if (is_posix_builtin (name))
new->flags |= BUILTIN_FLAG_POSIX_BUILTIN; new->flags |= BUILTIN_FLAG_POSIX_BUILTIN;
if (is_arrayvar_builtin (name))
new->flags |= BUILTIN_FLAG_ARRAYREF_ARG;
+ if (is_requires_builtin (name)) + if (is_requires_builtin (name))
+ new->flags |= BUILTIN_FLAG_REQUIRES; + new->flags |= BUILTIN_FLAG_REQUIRES;
+
array_add ((char *)new, defs->builtins); array_add ((char *)new, defs->builtins);
building_builtin = 1; building_builtin = 1;
@@ -1275,13 +1290,14 @@ write_builtins (defs, structfile, externfile) @@ -1250,12 +1267,13 @@ write_builtins (defs, structfile, externfile)
else else
fprintf (structfile, "(sh_builtin_func_t *)0x0, "); fprintf (structfile, "(sh_builtin_func_t *)0x0, ");
- fprintf (structfile, "%s%s%s%s%s%s, %s_doc,\n", - fprintf (structfile, "%s%s%s%s%s, %s_doc,\n",
+ fprintf (structfile, "%s%s%s%s%s%s%s, %s_doc,\n", + fprintf (structfile, "%s%s%s%s%s%s, %s_doc,\n",
"BUILTIN_ENABLED | STATIC_BUILTIN", "BUILTIN_ENABLED | STATIC_BUILTIN",
(builtin->flags & BUILTIN_FLAG_SPECIAL) ? " | SPECIAL_BUILTIN" : "", (builtin->flags & BUILTIN_FLAG_SPECIAL) ? " | SPECIAL_BUILTIN" : "",
(builtin->flags & BUILTIN_FLAG_ASSIGNMENT) ? " | ASSIGNMENT_BUILTIN" : "", (builtin->flags & BUILTIN_FLAG_ASSIGNMENT) ? " | ASSIGNMENT_BUILTIN" : "",
(builtin->flags & BUILTIN_FLAG_LOCALVAR) ? " | LOCALVAR_BUILTIN" : "", (builtin->flags & BUILTIN_FLAG_LOCALVAR) ? " | LOCALVAR_BUILTIN" : "",
(builtin->flags & BUILTIN_FLAG_POSIX_BUILTIN) ? " | POSIX_BUILTIN" : "", (builtin->flags & BUILTIN_FLAG_POSIX_BUILTIN) ? " | POSIX_BUILTIN" : "",
(builtin->flags & BUILTIN_FLAG_ARRAYREF_ARG) ? " | ARRAYREF_BUILTIN" : "",
+ (builtin->flags & BUILTIN_FLAG_REQUIRES) ? " | REQUIRES_BUILTIN" : "", + (builtin->flags & BUILTIN_FLAG_REQUIRES) ? " | REQUIRES_BUILTIN" : "",
document_name (builtin)); document_name (builtin));
/* Don't translate short document summaries that are identical /* Don't translate short document summaries that are identical
@@ -1678,6 +1694,13 @@ is_arrayvar_builtin (name) @@ -1645,6 +1663,13 @@ is_posix_builtin (name)
return (_find_in_table (name, arrayvar_builtins)); return (_find_in_table (name, posix_builtins));
} }
+static int +static int
@ -92,9 +91,10 @@ diff --git a/builtins/mkbuiltins.c b/builtins/mkbuiltins.c
static int static int
rename (from, to) rename (from, to)
diff --git a/doc/bash.1 b/doc/bash.1 diff --git a/doc/bash.1 b/doc/bash.1
index c21e877..04ce845 100644
--- a/doc/bash.1 --- a/doc/bash.1
+++ b/doc/bash.1 +++ b/doc/bash.1
@@ -239,6 +239,14 @@ The shell becomes restricted (see @@ -238,6 +238,14 @@ The shell becomes restricted (see
.B "RESTRICTED SHELL" .B "RESTRICTED SHELL"
below). below).
.TP .TP
@ -110,9 +110,10 @@ diff --git a/doc/bash.1 b/doc/bash.1
Equivalent to \fB\-v\fP. Equivalent to \fB\-v\fP.
.TP .TP
diff --git a/doc/bashref.texi b/doc/bashref.texi diff --git a/doc/bashref.texi b/doc/bashref.texi
index 06957b6..e3fe925 100644
--- a/doc/bashref.texi --- a/doc/bashref.texi
+++ b/doc/bashref.texi +++ b/doc/bashref.texi
@@ -6927,6 +6927,13 @@ standard. @xref{Bash POSIX Mode}, for a description of the Bash @@ -6243,6 +6243,13 @@ standard. @xref{Bash POSIX Mode}, for a description of the Bash
@item --restricted @item --restricted
Make the shell a restricted shell (@pxref{The Restricted Shell}). Make the shell a restricted shell (@pxref{The Restricted Shell}).
@ -127,22 +128,31 @@ diff --git a/doc/bashref.texi b/doc/bashref.texi
Equivalent to @option{-v}. Print shell input lines as they're read. Equivalent to @option{-v}. Print shell input lines as they're read.
diff --git a/eval.c b/eval.c diff --git a/eval.c b/eval.c
index db863e7..5a5af32 100644
--- a/eval.c --- a/eval.c
+++ b/eval.c +++ b/eval.c
@@ -138,7 +138,8 @@ reader_loop () @@ -56,6 +56,7 @@ extern int need_here_doc;
extern int current_command_number, current_command_line_count, line_number;
extern int expand_aliases;
extern char *ps0_prompt;
+extern int rpm_requires;
#if defined (HAVE_POSIX_SIGNALS)
extern sigset_t top_level_mask;
@@ -148,7 +149,7 @@ reader_loop ()
if (read_command () == 0) if (read_command () == 0)
{ {
- if (interactive_shell == 0 && read_but_dont_execute) - if (interactive_shell == 0 && read_but_dont_execute)
+
+ if (interactive_shell == 0 && (read_but_dont_execute && !rpm_requires)) + if (interactive_shell == 0 && (read_but_dont_execute && !rpm_requires))
{ {
set_exit_status (last_command_exit_value); last_command_exit_value = EXECUTION_SUCCESS;
dispose_command (global_command); dispose_command (global_command);
diff --git a/execute_cmd.c b/execute_cmd.c diff --git a/execute_cmd.c b/execute_cmd.c
index b5cd405..88c7a5c 100644
--- a/execute_cmd.c --- a/execute_cmd.c
+++ b/execute_cmd.c +++ b/execute_cmd.c
@@ -561,6 +561,8 @@ async_redirect_stdin () @@ -533,6 +533,8 @@ async_redirect_stdin ()
#define DESCRIBE_PID(pid) do { if (interactive) describe_pid (pid); } while (0) #define DESCRIBE_PID(pid) do { if (interactive) describe_pid (pid); } while (0)
@ -150,12 +160,12 @@ diff --git a/execute_cmd.c b/execute_cmd.c
+ +
/* Execute the command passed in COMMAND, perhaps doing it asynchronously. /* Execute the command passed in COMMAND, perhaps doing it asynchronously.
COMMAND is exactly what read_command () places into GLOBAL_COMMAND. COMMAND is exactly what read_command () places into GLOBAL_COMMAND.
ASYNCHRONOUS, if non-zero, says to do this command in the background. ASYNCHROUNOUS, if non-zero, says to do this command in the background.
@@ -592,7 +594,13 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out, @@ -565,7 +567,13 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
if (breaking || continuing) if (breaking || continuing)
return (last_command_exit_value); return (last_command_exit_value);
- if (read_but_dont_execute) - if (command == 0 || read_but_dont_execute)
+ if (command == 0 || (read_but_dont_execute && !rpm_requires)) + if (command == 0 || (read_but_dont_execute && !rpm_requires))
+ return (EXECUTION_SUCCESS); + return (EXECUTION_SUCCESS);
+ if (rpm_requires && command->type == cm_function_def) + if (rpm_requires && command->type == cm_function_def)
@ -163,12 +173,12 @@ diff --git a/execute_cmd.c b/execute_cmd.c
+ execute_intern_function (command->value.Function_def->name, + execute_intern_function (command->value.Function_def->name,
+ command->value.Function_def); + command->value.Function_def);
+ if (read_but_dont_execute) + if (read_but_dont_execute)
return (last_command_exit_value);
if (command == 0)
return (EXECUTION_SUCCESS); return (EXECUTION_SUCCESS);
@@ -2883,7 +2891,7 @@ execute_for_command (for_command)
save_line_number = line_number; QUIT;
if (check_identifier (for_command->name, 1) == 0) @@ -5752,7 +5760,7 @@ execute_intern_function (name, funcdef)
if (check_identifier (name, posixly_correct) == 0)
{ {
- if (posixly_correct && interactive_shell == 0) - if (posixly_correct && interactive_shell == 0)
+ if (posixly_correct && interactive_shell == 0 && rpm_requires == 0) + if (posixly_correct && interactive_shell == 0 && rpm_requires == 0)
@ -176,31 +186,50 @@ diff --git a/execute_cmd.c b/execute_cmd.c
last_command_exit_value = EX_BADUSAGE; last_command_exit_value = EX_BADUSAGE;
jump_to_top_level (ERREXIT); jump_to_top_level (ERREXIT);
diff --git a/execute_cmd.h b/execute_cmd.h diff --git a/execute_cmd.h b/execute_cmd.h
index 62bec82..d42dc85 100644
--- a/execute_cmd.h --- a/execute_cmd.h
+++ b/execute_cmd.h +++ b/execute_cmd.h
@@ -22,6 +22,9 @@ @@ -22,6 +22,8 @@
#define _EXECUTE_CMD_H_ #define _EXECUTE_CMD_H_
#include "stdc.h" #include "stdc.h"
+#include "variables.h" +#include "variables.h"
+#include "command.h" +#include "command.h"
+
#if defined (ARRAY_VARS) #if defined (ARRAY_VARS)
struct func_array_state struct func_array_state
diff --git a/make_cmd.c b/make_cmd.c diff --git a/make_cmd.c b/make_cmd.c
index b42e9ff..a982fe0 100644
--- a/make_cmd.c --- a/make_cmd.c
+++ b/make_cmd.c +++ b/make_cmd.c
@@ -35,6 +35,8 @@ @@ -42,11 +42,15 @@
#include "bashintl.h"
#include "shell.h"
+#include "builtins.h"
+#include "builtins/common.h"
#include "execute_cmd.h"
#include "parser.h"
#include "flags.h" #include "flags.h"
@@ -839,6 +841,30 @@ make_coproc_command (name, command) #include "make_cmd.h"
#include "dispose_cmd.h"
+#include "execute_cmd.h"
#include "variables.h"
#include "subst.h"
#include "input.h"
#include "ocache.h"
#include "externs.h"
+#include "builtins.h"
+
+#include "builtins/common.h"
#if defined (JOB_CONTROL)
#include "jobs.h"
@@ -57,6 +61,10 @@
extern int line_number, current_command_line_count, parser_state;
extern int last_command_exit_value;
extern int shell_initialized;
+extern int rpm_requires;
+
+static char *alphabet_set = "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int here_doc_first_line = 0;
@@ -839,6 +847,27 @@ make_coproc_command (name, command)
return (make_command (cm_coproc, (SIMPLE_COM *)temp)); return (make_command (cm_coproc, (SIMPLE_COM *)temp));
} }
@ -209,9 +238,6 @@ diff --git a/make_cmd.c b/make_cmd.c
+const char *deptype; +const char *deptype;
+char *filename; +char *filename;
+{ +{
+ static char *alphabet_set = "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+ if (strchr(filename, '$') || (filename[0] != '/' && strchr(filename, '/'))) + if (strchr(filename, '$') || (filename[0] != '/' && strchr(filename, '/')))
+ return; + return;
+ +
@ -231,7 +257,7 @@ diff --git a/make_cmd.c b/make_cmd.c
/* Reverse the word list and redirection list in the simple command /* Reverse the word list and redirection list in the simple command
has just been parsed. It seems simpler to do this here the one has just been parsed. It seems simpler to do this here the one
time then by any other method that I can think of. */ time then by any other method that I can think of. */
@@ -856,6 +882,28 @@ clean_simple_command (command) @@ -856,6 +885,27 @@ clean_simple_command (command)
REVERSE_LIST (command->value.Simple->redirects, REDIRECT *); REVERSE_LIST (command->value.Simple->redirects, REDIRECT *);
} }
@ -255,15 +281,15 @@ diff --git a/make_cmd.c b/make_cmd.c
+ output_requirement (find_function(cmd0) ? "function" : "executable", cmd0); + output_requirement (find_function(cmd0) ? "function" : "executable", cmd0);
+ } + }
+ } /*rpm_requires*/ + } /*rpm_requires*/
+
+ +
parser_state &= ~PST_REDIRLIST; parser_state &= ~PST_REDIRLIST;
return (command); return (command);
} }
diff --git a/shell.c b/shell.c diff --git a/shell.c b/shell.c
index 7f63969..a0fb7ce 100644
--- a/shell.c --- a/shell.c
+++ b/shell.c +++ b/shell.c
@@ -196,6 +196,9 @@ int have_devfd = 0; @@ -201,6 +201,9 @@ int have_devfd = 0;
/* The name of the .(shell)rc file. */ /* The name of the .(shell)rc file. */
static char *bashrc_file = DEFAULT_BASHRC; static char *bashrc_file = DEFAULT_BASHRC;
@ -273,7 +299,7 @@ diff --git a/shell.c b/shell.c
/* Non-zero means to act more like the Bourne shell on startup. */ /* Non-zero means to act more like the Bourne shell on startup. */
static int act_like_sh; static int act_like_sh;
@@ -266,6 +269,7 @@ static const struct { @@ -264,6 +267,7 @@ static const struct {
{ "protected", Int, &protected_mode, (char **)0x0 }, { "protected", Int, &protected_mode, (char **)0x0 },
#endif #endif
{ "rcfile", Charp, (int *)0x0, &bashrc_file }, { "rcfile", Charp, (int *)0x0, &bashrc_file },
@ -281,9 +307,9 @@ diff --git a/shell.c b/shell.c
#if defined (RESTRICTED_SHELL) #if defined (RESTRICTED_SHELL)
{ "restricted", Int, &restricted, (char **)0x0 }, { "restricted", Int, &restricted, (char **)0x0 },
#endif #endif
@@ -510,6 +514,12 @@ main (argc, argv, env) @@ -500,6 +504,12 @@ main (argc, argv, env)
if (dump_translatable_strings)
read_but_dont_execute = 1; read_but_dont_execute = 1;
#endif
+ if (rpm_requires) + if (rpm_requires)
+ { + {
@ -294,14 +320,6 @@ diff --git a/shell.c b/shell.c
if (running_setuid && privileged_mode == 0) if (running_setuid && privileged_mode == 0)
disable_priv_mode (); disable_priv_mode ();
diff --git a/shell.h b/shell.h --
--- a/shell.h 2.9.3
+++ b/shell.h
@@ -100,6 +100,7 @@ extern int interactive, interactive_shell;
extern int startup_state;
extern int reading_shell_script;
extern int shell_initialized;
+extern int rpm_requires;
extern int bash_argv_initialized;
extern int subshell_environment;
extern int current_command_number;

View File

@ -1,7 +1,8 @@
diff --git a/tests/exec.right b/tests/exec.right diff --git a/tests/exec.right b/tests/exec.right
index 81224fa..ff77f09 100644
--- a/tests/exec.right --- a/tests/exec.right
+++ b/tests/exec.right +++ b/tests/exec.right
@@ -60,7 +60,6 @@ this is ohio-state @@ -51,7 +51,6 @@ this is ohio-state
0 0
1 1
testb testb
@ -10,42 +11,42 @@ diff --git a/tests/exec.right b/tests/exec.right
1 1
1 1
diff --git a/tests/execscript b/tests/execscript diff --git a/tests/execscript b/tests/execscript
index 3415ae3..75c48a4 100644
--- a/tests/execscript --- a/tests/execscript
+++ b/tests/execscript +++ b/tests/execscript
@@ -108,8 +108,6 @@ ${THIS_SH} ./exec6.sub @@ -108,8 +108,6 @@ ${THIS_SH} ./exec6.sub
# checks for properly deciding what constitutes an executable file # checks for properly deciding what constitutes an executable file
${THIS_SH} ./exec7.sub ${THIS_SH} ./exec7.sub
-${THIS_SH} -i ${PWD}/exec8.sub -${THIS_SH} -i ./exec8.sub
- -
${THIS_SH} ./exec9.sub ${THIS_SH} ./exec9.sub
${THIS_SH} ./exec10.sub ${THIS_SH} ./exec10.sub
diff --git a/tests/read.right b/tests/read.right diff --git a/tests/read.right b/tests/read.right
index 73cb704..a92fe7f 100644
--- a/tests/read.right --- a/tests/read.right
+++ b/tests/read.right +++ b/tests/read.right
@@ -34,17 +34,6 @@ xyz @@ -33,14 +33,6 @@ a = abcdefg
a = xyz a = xyz
a = -xyz 123- a = -xyz 123-
a = abc a = abc
-timeout 1: ok -timeout 1: ok
-unset or null 1 -
-timeout 2: ok -timeout 2: ok
-unset or null 2 -
-timeout 3: ok -./read2.sub: line 23: read: -3: invalid timeout specification
-unset or null 3
-./read2.sub: line 45: read: -3: invalid timeout specification
-1 -1
- -
-abcde -abcde
-abcde ./read3.sub: line 4: read: -1: invalid number
./read3.sub: line 17: read: -1: invalid number
abc abc
defg ab
diff --git a/tests/read.tests b/tests/read.tests diff --git a/tests/read.tests b/tests/read.tests
index fe27dae..10346f7 100644
--- a/tests/read.tests --- a/tests/read.tests
+++ b/tests/read.tests +++ b/tests/read.tests
@@ -95,9 +95,6 @@ echo " foo" | { IFS=$':' ; read line; recho "$line"; } @@ -82,9 +82,6 @@ echo " foo" | { IFS=$':' ; read line; recho "$line"; }
# test read -d delim behavior # test read -d delim behavior
${THIS_SH} ./read1.sub ${THIS_SH} ./read1.sub
@ -55,3 +56,6 @@ diff --git a/tests/read.tests b/tests/read.tests
# test read -n nchars behavior # test read -n nchars behavior
${THIS_SH} ./read3.sub ${THIS_SH} ./read3.sub
--
2.9.3

View File

@ -6,7 +6,8 @@ if [ -f /etc/bashrc ]; then
fi fi
# User specific environment # User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]; then if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
then
PATH="$HOME/.local/bin:$HOME/bin:$PATH" PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi fi
export PATH export PATH
@ -15,11 +16,3 @@ export PATH
# export SYSTEMD_PAGER= # export SYSTEMD_PAGER=
# User specific aliases and functions # User specific aliases and functions
if [ -d ~/.bashrc.d ]; then
for rc in ~/.bashrc.d/*; do
if [ -f "$rc" ]; then
. "$rc"
fi
done
fi
unset rc

View File

@ -1,50 +1,42 @@
#% define beta_tag rc2 #% define beta_tag rc2
%define patchlevel 26 %global _hardened_build 1
%define baseversion 5.2 %define patchleveltag .20
%define baseversion 4.4
%bcond_without tests %bcond_without tests
Version: %{baseversion}.%{patchlevel} Version: %{baseversion}%{patchleveltag}
Name: bash Name: bash
Summary: The GNU Bourne Again shell Summary: The GNU Bourne Again shell
Release: 6%{?dist} Release: 5%{?dist}
License: GPL-3.0-or-later License: GPLv3+
Url: https://www.gnu.org/software/bash Url: https://www.gnu.org/software/bash
Source0: https://ftp.gnu.org/gnu/bash/bash-%{baseversion}.tar.gz Source0: https://ftp.gnu.org/gnu/bash/bash-%{baseversion}.tar.gz
# For now there isn't any doc # For now there isn't any doc
#Source2: ftp://ftp.gnu.org/gnu/bash/bash-doc-%%{version}.tar.gz #Source2: ftp://ftp.gnu.org/gnu/bash/bash-doc-%{version}.tar.gz
Source1: dot-bashrc Source1: dot-bashrc
Source2: dot-bash_profile Source2: dot-bash_profile
Source3: dot-bash_logout Source3: dot-bash_logout
Source4: https://ftp.gnu.org/gnu/bash/bash-%{baseversion}.tar.gz.sig
# Retreived from https://tiswww.cwru.edu/~chet/gpgkey.asc
# which is the https version of the link on http://tiswww.case.edu/php/chet/bash/bashtop.html
Source5: chet-gpgkey.asc
# Official upstream patches # Official upstream patches
# Patches are converted to apply with '-p1' # Patches are converted to apply with '-p1'
%{lua:for i=1,rpm.expand('%{patchlevel}') do %{lua:for i=1,20 do print(string.format("Patch%u: bash-4.4-patch-%u.patch\n", i, i)) end}
print(string.format('Patch%u: bash-%s-patch-%u.patch\n', i, rpm.expand('%{baseversion}'), i))
end}
# Other patches # Other patches
# Non-interactive shells beginning with argv[0][0] == '-' should run the startup files when not in posix mode. Patch101: bash-2.02-security.patch
Patch102: bash-2.03-profile.patch Patch102: bash-2.03-paths.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=60870 Patch103: bash-2.03-profile.patch
Patch103: bash-2.05a-interpreter.patch Patch104: bash-2.05a-interpreter.patch
# Generate info for debuginfo files. Patch105: bash-2.05b-debuginfo.patch
Patch104: bash-2.05b-debuginfo.patch Patch106: bash-2.05b-manso.patch
# Pid passed to setpgrp() can not be pid of a zombie process. Patch107: bash-2.05b-pgrp_sync.patch
Patch105: bash-2.05b-pgrp_sync.patch Patch108: bash-2.05b-xcc.patch
# Source bashrc file when bash is run under ssh. Patch110: bash-3.2-ssh_source_bash.patch
Patch107: bash-3.2-ssh_source_bash.patch Patch112: bash-infotags.patch
# Use makeinfo to generate .texi file Patch113: bash-requires.patch
# Patch108: bash-infotags.patch Patch114: bash-setlocale.patch
# Try to pick up latest `--rpm-requires` patch from http://git.altlinux.org/gears/b/bash4.git Patch115: bash-tty-tests.patch
Patch109: bash-requires.patch
Patch110: bash-setlocale.patch
# Disable tty tests while doing bash builds
Patch111: bash-tty-tests.patch
# 484809, check if interp section is NOBITS # 484809, check if interp section is NOBITS
Patch116: bash-4.0-nobits.patch Patch116: bash-4.0-nobits.patch
@ -62,16 +54,16 @@ Patch119: bash-4.2-rc2-logout.patch
# Static analyzis shows some issues in bash-2.05a-interpreter.patch # Static analyzis shows some issues in bash-2.05a-interpreter.patch
Patch120: bash-4.2-coverity.patch Patch120: bash-4.2-coverity.patch
# Don't call malloc in signal handler
Patch121: bash-4.1-defer-sigchld-trap.patch
# 799958, updated info about trap # 799958, updated info about trap
# This patch should be upstreamed.
Patch122: bash-4.2-manpage_trap.patch Patch122: bash-4.2-manpage_trap.patch
# https://www.securecoding.cert.org/confluence/display/seccode/INT32-C.+Ensure+that+operations+on+signed+integers+do+not+result+in+overflow # https://www.securecoding.cert.org/confluence/display/seccode/INT32-C.+Ensure+that+operations+on+signed+integers+do+not+result+in+overflow
# This patch should be upstreamed.
Patch123: bash-4.2-size_type.patch Patch123: bash-4.2-size_type.patch
# 1112710 - mention ulimit -c and -f POSIX block size # 1112710 - mention ulimit -c and -f POSIX block size
# This patch should be upstreamed.
Patch124: bash-4.3-man-ulimit.patch Patch124: bash-4.3-man-ulimit.patch
# 1102815 - fix double echoes in vi visual mode # 1102815 - fix double echoes in vi visual mode
@ -84,26 +76,53 @@ Patch126: bash-4.3-memleak-lc_all.patch
# this patch disables it # this patch disables it
Patch127: bash-4.4-no-loadable-builtins.patch Patch127: bash-4.4-no-loadable-builtins.patch
# 2020528 - Add a runtime option to enable history logging to syslog # 1068697 - Explicitly unset nonblocking mode while reading from stdin
# This option is undocumented in upstream and is documented by this patch # This should be dropped while rebasing to bash-4.5
Patch128: bash-5.0-syslog-history.patch Patch128: bash-4.4-unset-nonblock-stdin.patch
Patch129: bash-configure-c99.patch
Patch130: bash-configure-c99-2.patch # 1389838 - command builtin should not abort on variable assignment errors
# This should be dropped while rebasing to bash-4.5
Patch129: bash-4.4-assignment-error.patch
# 1458008 - test builtin ignores subsecond while comparing file modification times
# This should be dropped while rebasing to bash-4.5
Patch130: bash-4.5-test-modification-time.patch
# 1556867 - case in a for loop inside subshell causes syntax error
# This should be dropped while rebasing to bash-4.5
Patch131: bash-4.4-case-in-command-subst.patch
Patch132: bash-4.4-coverity.patch
# 1687835 - [RFE] Add a runtime option to enable history logging to syslog
# This should be dropped while rebasing to bash-5.0
Patch133: bash-5.0-syslog-history.patch
# 1727952 - Parsing commands break when using $$ in command substitution $(..)
# https://lists.gnu.org/archive/html/bug-bash/2017-01/msg00065.html
Patch134: bash-5.0-shellpid-subshell.patch
# 1793943 - CVE-2019-18276: when effective UID is not equal to its real UID the saved UID is
# not dropped
Patch135: bash-5.0-cve-2019-18276.patch
Patch136: bash-5.0-cve-2019-18276-2.patch
# 1890888 - Took long time to return when bash -c 'exit 2 & wait $!' run in the big size LimitNPROC
# values
Patch137: bash-5.0-bgp-resize.patch
# 1794884 - HISTTIMEFORMAT causes Segmentation fault under certain conditions
Patch138: bash-5.0-histtimeformat-segfault.patch
#2062291 - Segfault in 'buffered_getchar()' function in bash
Patch139: bash-4.4-fix-buffered_getchar-crash.patch
# Enable audit logs # Enable audit logs
Patch131: bash-4.3-audit.patch Patch140: bash-4.3-audit.patch
# Fixes for issues found by OpenScanHub
Patch132: bash-5.3-sast.patch
BuildRequires: gcc
BuildRequires: texinfo bison BuildRequires: texinfo bison
BuildRequires: ncurses-devel BuildRequires: ncurses-devel
BuildRequires: autoconf, gettext BuildRequires: autoconf, gettext
BuildRequires: gnupg2
# Required for bash tests
BuildRequires: glibc-all-langpacks
BuildRequires: make
BuildRequires: audit-libs-devel BuildRequires: audit-libs-devel
Requires: filesystem >= 3 Requires: filesystem >= 3
Provides: /bin/sh Provides: /bin/sh
@ -117,7 +136,8 @@ incorporates useful features from the Korn shell (ksh) and the C shell
%package devel %package devel
Summary: Development headers for %{name} Summary: Development headers for %{name}
Requires: %{name}%{?_isa} = %{version}-%{release} Requires: %{name} = %{version}-%{release}
Requires: pkgconf-pkg-config
%description devel %description devel
This package contains development headers for %{name}. This package contains development headers for %{name}.
@ -130,7 +150,6 @@ Requires: %{name} = %{version}-%{release}
This package contains documentation files for %{name}. This package contains documentation files for %{name}.
%prep %prep
%{gpgverify} --keyring='%{SOURCE5}' --signature='%{SOURCE4}' --data='%{SOURCE0}'
%autosetup -n %{name}-%{baseversion} -p1 %autosetup -n %{name}-%{baseversion} -p1
echo %{version} > _distribution echo %{version} > _distribution
@ -146,12 +165,7 @@ autoconf
# Recycles pids is neccessary. When bash's last fork's pid was X # Recycles pids is neccessary. When bash's last fork's pid was X
# and new fork's pid is also X, bash has to wait for this same pid. # and new fork's pid is also X, bash has to wait for this same pid.
# Without Recycles pids bash will not wait. # Without Recycles pids bash will not wait.
MFLAGS="CPPFLAGS=-D_GNU_SOURCE -DRECYCLES_PIDS -DDEFAULT_PATH_VALUE='\"/usr/local/bin:/usr/bin\"' -DSTANDARD_UTILS_PATH='\"/bin:/usr/bin:/usr/sbin:/sbin\"' `getconf LFS_CFLAGS` -DSYSLOG_HISTORY -DSYSLOG_SHOPT=0" make "CPPFLAGS=-D_GNU_SOURCE -DRECYCLES_PIDS -DDEFAULT_PATH_VALUE='\"/usr/local/bin:/usr/bin\"' `getconf LFS_CFLAGS` -DSYSLOG_HISTORY" %{?_smp_mflags}
# work around missing deps in Makefiles
make "$MFLAGS" version.h
make "$MFLAGS" %{?_smp_mflags} -C builtins
make "$MFLAGS" %{?_smp_mflags}
%install %install
if [ -e autoconf ]; then if [ -e autoconf ]; then
@ -164,7 +178,7 @@ sed -i -e 's,bashref\.info,bash.info,' doc/bashref.info
%make_install install-headers %make_install install-headers
mkdir -p %{buildroot}/%{_sysconfdir} mkdir -p %{buildroot}/etc
# make manpages for bash builtins as per suggestion in DOC/README # make manpages for bash builtins as per suggestion in DOC/README
pushd doc pushd doc
@ -201,7 +215,7 @@ rm -f %{buildroot}/%{_mandir}/man1/false.1
ln -sf bash %{buildroot}%{_bindir}/sh ln -sf bash %{buildroot}%{_bindir}/sh
rm -f %{buildroot}%{_infodir}/dir rm -f %{buildroot}%{_infodir}/dir
mkdir -p %{buildroot}%{_sysconfdir}/skel mkdir -p %{buildroot}/etc/skel
install -p -m644 %SOURCE1 %{buildroot}/etc/skel/.bashrc install -p -m644 %SOURCE1 %{buildroot}/etc/skel/.bashrc
install -p -m644 %SOURCE2 %{buildroot}/etc/skel/.bash_profile install -p -m644 %SOURCE2 %{buildroot}/etc/skel/.bash_profile
install -p -m644 %SOURCE3 %{buildroot}/etc/skel/.bash_logout install -p -m644 %SOURCE3 %{buildroot}/etc/skel/.bash_logout
@ -244,7 +258,7 @@ mkdir -p %{buildroot}/%{_pkgdocdir}/doc
rm -rf examples/loadables rm -rf examples/loadables
for file in CHANGES COMPAT NEWS NOTES POSIX RBASH README examples for file in CHANGES COMPAT NEWS NOTES POSIX RBASH README examples
do do
cp -rp "$file" %{buildroot}%{_pkgdocdir}/"$file" cp -rp "$file" %{buildroot}/%{_pkgdocdir}/"$file"
echo "%%doc %{_pkgdocdir}/$file" >> %{name}-doc.files echo "%%doc %{_pkgdocdir}/$file" >> %{name}-doc.files
done done
echo "%%doc %{_pkgdocdir}/doc" >> %{name}-doc.files echo "%%doc %{_pkgdocdir}/doc" >> %{name}-doc.files
@ -274,7 +288,7 @@ end
%postun -p <lua> %postun -p <lua>
-- Run it only if we are uninstalling -- Run it only if we are uninstalling
if arg[2] == 0 if arg[2] == "0"
then then
t={} t={}
for line in io.lines("/etc/shells") for line in io.lines("/etc/shells")
@ -330,174 +344,72 @@ end
%{_libdir}/pkgconfig/%{name}.pc %{_libdir}/pkgconfig/%{name}.pc
%changelog %changelog
* Tue Oct 29 2024 Troy Dawson <tdawson@redhat.com> - 5.2.26-6 * Fri Feb 09 2024 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.20-5
- Bump release for October 2024 mass rebuild: - Restore audit logs in bash-4.3 or newer versions
Resolves: RHEL-64018 Resolves: RHEL-24990
* Thu Aug 29 2024 Siteshwar Vashisht <svashisht@redhat.com> - 5.2.26-5 * Tue Apr 05 2022 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.20-4
- Fix issues identified by OpenScanHub - Fix a crash in buffered_getchar() function
Resolves: RHEL-44649 Resolves: #2062291
* Mon Jun 24 2024 Troy Dawson <tdawson@redhat.com> - 5.2.26-4 * Thu Sep 30 2021 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.20-3
- Bump release for June 2024 mass rebuild
* Fri Feb 09 2024 Siteshwar Vashisht <svashisht@redhat.com> - 5.2.26-3
- Update patch for audit logs
Resolves: RHEL-22619
* Tue Jan 23 2024 Fedora Release Engineering <releng@fedoraproject.org> - 5.2.26-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Mon Jan 22 2024 Siteshwar Vashisht <svashisht@redhat.com> - 5.2.26-1
- Update to bash-5.2 patchlevel 26
Resolves: #2259619
* Fri Jan 19 2024 Fedora Release Engineering <releng@fedoraproject.org> - 5.2.21-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Mon Nov 20 2023 Florian Weimer <fweimer@redhat.com> - 5.2.21-2
- Fix another C compatibility issue in the configure script
* Fri Nov 10 2023 Siteshwar Vashisht <svashisht@redhat.com> - 5.2.21-1
- Update to bash-5.2 patchlevel 21
Resolves: #2248970
* Wed Jul 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 5.2.15-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Tue Apr 11 2023 Lukáš Zaoral <lzaoral@redhat.com> - 5.2.15-4
- migrate to SPDX license format
* Mon Feb 06 2023 Florian Weimer <fweimer@redhat.com> - 5.2.15-3
- Fix C99 compatibility issue on configure script
* Wed Jan 18 2023 Fedora Release Engineering <releng@fedoraproject.org> - 5.2.15-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
* Mon Jan 02 2023 Siteshwar Vashisht <svashisht@redhat.com> - 5.2.15-1
- Update to bash-5.2 patchlevel 15
Resolves: #2152991
* Fri Nov 18 2022 Debarshi Ray <rishi@fedoraproject.org> - 5.2.9-3
- Override STANDARD_UTILS_PATH in the same way as DEFAULT_PATH_VALUE
Related: #2132363
* Fri Nov 18 2022 Siteshwar Vashisht <svashisht@redhat.com> - 5.2.9-2
- Fix binary file detection
Resolves: #2135537
* Fri Nov 18 2022 Siteshwar Vashisht <svashisht@redhat.com> - 5.2.9-1
- Update to bash-5.2 patchlevel 9
Resolves: #2140722
* Mon Oct 10 2022 Siteshwar Vashisht <svashisht@redhat.com> - 5.2.2-2
- Fix an issue with nested expansions
Resolves: #2133097
* Thu Oct 06 2022 Siteshwar Vashisht <svashisht@redhat.com> - 5.2.2-1
- Update to bash-5.2 patchlevel 2
* Wed Oct 05 2022 Siteshwar Vashisht <svashisht@redhat.com> - 5.2.0-2
- Bump version number - Bump version number
Related: #2129927 Resolves: #2004189
* Tue Oct 04 2022 Siteshwar Vashisht <svashisht@redhat.com> - 5.2.0-1 * Mon Jul 26 2021 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.20-2
- Update to bash-5.2 - Fix crash if a timestamp in a history file overflowed a time_t
Resolves: #2129927 Resolves: #1794884
* Mon Sep 26 2022 Siteshwar Vashisht <svashisht@redhat.com> - 5.1.16-4 * Fri Mar 26 2021 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.20-1
- Add a null check in parameter_brace_transform() function - Fix infinite loop in long running scripts
Resolves: #2122331 Resolves: #1943495
* Wed Jul 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 5.1.16-3 * Wed Nov 04 2020 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.19-14
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild - Fix hang when limit for nproc is very high
Resolves: #1890888
* Wed Jan 19 2022 Fedora Release Engineering <releng@fedoraproject.org> - 5.1.16-2 * Fri Oct 09 2020 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.19-13
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild - Correctly drop saved UID when effective UID is not equal to its real UID
Resolves: #1793943
* Mon Jan 17 2022 Siteshwar Vashisht <svashisht@redhat.com> - 5.1.16-1 * Mon Jun 22 2020 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.19-12
- Update to bash-5.1 patchlevel 16
Resolves: #2037042
* Fri Nov 26 2021 Siteshwar Vashisht <svashisht@redhat.com> - 5.1.12-1
- Update to bash-5.1 patchlevel 12
* Fri Nov 05 2021 Siteshwar Vashisht <svashisht@redhat.com> - 5.1.8-3
- Add a runtime option to enable history logging to syslog
Resolves: #2020528
* Wed Jul 21 2021 Fedora Release Engineering <releng@fedoraproject.org> - 5.1.8-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
* Sat May 29 2021 Siteshwar Vashisht <svashisht@redhat.com> - 5.1.8-1
- Update to bash-5.1 patchlevel 8
* Wed Feb 17 2021 Siteshwar Vashisht <svashisht@redhat.com> - 5.1.4-1
- Update to bash-5.1 patchlevel 4
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 5.1.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Wed Jan 6 10:40:25 CET 2021 Siteshwar Vashisht <svashisht@redhat.com> - 5.1.0-1
- Rebase to bash 5.1
Resolves: #1904866
* Fri Dec 4 14:44:06 CET 2020 Siteshwar Vashisht <svashisht@redhat.com> - 5.0.17-3
- Enable sourcing files from ~/.bashrc.d
Resolves: #1726397
* Mon Jul 27 2020 Fedora Release Engineering <releng@fedoraproject.org> - 5.0.17-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Mon Jun 01 2020 Siteshwar Vashisht <svashisht@redhat.com> - 5.0.17-1
- Update to bash-5.0 patchlevel 17
* Tue Jan 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 5.0.11-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Fri Dec 06 2019 Siteshwar Vashisht <svashisht@redhat.com> - 5.0.11-1
- Update to bash-5.0 patchlevel 11
Resolves: #1745602
* Fri Aug 02 2019 Kamil Dudka <kdudka@redhat.com> - 5.0.7-3
- Sanitize public header file <shell.h>
Resolves: #1736676
* Wed Jul 24 2019 Fedora Release Engineering <releng@fedoraproject.org> - 5.0.7-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Tue May 07 2019 Siteshwar Vashisht <svashisht@redhat.com> - 5.0.7-1
- Update to bash-5.0 patchlevel 7
* Thu Feb 14 2019 Siteshwar Vashisht <svashisht@redhat.com> - 5.0.2-1
- Rebase to bash 5.0
Resolves: #1675080
* Thu Jan 31 2019 Fedora Release Engineering <releng@fedoraproject.org> - 4.4.23-7
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
* Thu Jan 10 2019 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.23-6
- Avoid duplicating user path entries - Avoid duplicating user path entries
Resolves: #1652639 Resolves: #1667008
* Mon Oct 08 2018 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.23-5 * Mon Jun 22 2020 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.19-11
- Fix some issues identified by coverity - Drop saved UID when effective UID is not equal to its real UID
Resolves: #1793943
* Mon Sep 10 2018 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.23-4 * Thu Aug 22 2019 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.19-10
- Fix runtime option to enable history logging to syslog
Related: #1687835
* Wed Jul 10 2019 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.19-9
- Fix `$$` expansion in subshell
Resolves: #1727952
* Mon May 27 2019 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.19-8
- Add a runtime option to enable history logging to syslog
Resolves: #1687835
* Mon Jan 14 2019 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.19-7
- Bump version number
Resolves: #1650059
* Tue Oct 09 2018 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.19-6
- Set custom PATH in non-login shells - Set custom PATH in non-login shells
Resolves: #1615131 Resolves: #1627074
* Thu Jul 12 2018 Fedora Release Engineering <releng@fedoraproject.org> - 4.4.23-3 * Thu Sep 20 2018 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.19-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild - Fix some issues identified by coverity
Resolves: #1602450
* Mon Jun 25 2018 Miro Hrončok <mhroncok@redhat.com> - 4.4.23-2 * Mon Aug 06 2018 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.19-4
- Bump version number
* Tue Jun 26 2018 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.19-3
- Move user bin directories in front of the PATH - Move user bin directories in front of the PATH
See: https://fedoraproject.org/wiki/Changes/UserPathPrioritization Resolves: #1595223
Resolves: #1595098
* Tue Jun 12 2018 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.23-1
- Update to bash-4.4 patchlevel 23
Resolves: #1585510
* Thu Mar 15 2018 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.19-2 * Thu Mar 15 2018 Siteshwar Vashisht <svashisht@redhat.com> - 4.4.19-2
- Fix handling case statement in command subsitution - Fix handling case statement in command subsitution

View File

@ -1,16 +0,0 @@
srpm bash
mcd $BUILDDIR/bash
cat <<EOF > config.cache
bash_cv_func_ctype_nonascii=yes
bash_cv_opendir_not_robust=no
bash_cv_ulimit_maxfds=yes
bash_cv_func_sigsetjmp=present
bash_cv_printf_a_format=yes
bash_cv_job_control_missing=present
bash_cv_sys_named_pipes=present
bash_cv_unusable_rtsigs=no
EOF
$SRC/bash-*/configure --prefix=/ --cache-file=config.cache --build=$BUILD --host=$TARGET
make $J
make $J install DESTDIR=${ROOTFS}
(cd $ROOTFS/bin; ln -sf bash sh)

View File

@ -1,12 +0,0 @@
diff --git a/aclocal.m4 b/aclocal.m4
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1324,7 +1324,7 @@ main()
wait(&status);
exit(ok ? 0 : 5);
}
-]])], [bash_cv_pgrp_pipe=no], [bash_cv_pgrp_pipe=yes],
+]])], [bash_cv_pgrp_pipe=yes], [bash_cv_pgrp_pipe=yes],
[AC_MSG_WARN(cannot check pgrp synchronization if cross compiling -- defaulting to no)
bash_cv_pgrp_pipe=no]
)])

View File

@ -1,24 +0,0 @@
diff --git a/examples/loadables/Makefile.in b/examples/loadables/Makefile.in
--- a/examples/loadables/Makefile.in
+++ b/examples/loadables/Makefile.in
@@ -59,7 +59,7 @@ host_cpu = @host_cpu@
host_vendor = @host_vendor@
STYLE_CFLAGS = @STYLE_CFLAGS@
-CFLAGS = @CFLAGS@
++CFLAGS = -O2 -g
LOCAL_CFLAGS = @LOCAL_CFLAGS@
DEFS = @DEFS@
LOCAL_DEFS = @LOCAL_DEFS@
diff --git a/examples/loadables/perl/Makefile.in b/examples/loadables/perl/Makefile.in
--- a/examples/loadables/perl/Makefile.in
+++ b/examples/loadables/perl/Makefile.in
@@ -42,7 +42,7 @@ SHELL = @MAKE_SHELL@
PERL5 = perl5
-CFLAGS = @CFLAGS@
+CFLAGS = -O2 -g
#
# These values are generated for configure by ${topdir}/support/shobj-conf.

View File

@ -1,13 +0,0 @@
diff --git a/locale.c b/locale.c
index 17ccc58..a6c07a3 100644
--- a/locale.c
+++ b/locale.c
@@ -78,8 +78,6 @@ set_default_locale ()
{
#if defined (HAVE_SETLOCALE)
default_locale = setlocale (LC_ALL, "");
- if (default_locale)
- default_locale = savestring (default_locale);
#else
default_locale = savestring ("C");
#endif /* HAVE_SETLOCALE */

View File

@ -1,13 +0,0 @@
diff --git a/doc/bash.1 b/doc/bash.1
--- a/doc/bash.1
+++ b/doc/bash.1
@@ -10726,6 +10726,9 @@ If set, the shell automatically closes file descriptors assigned using the
.el above)
instead of leaving them open when the command completes.
.TP 8
+.B syslog_history
+If set, command history is logged to syslog.
+.TP 8
.B xpg_echo
If set, the \fBecho\fP builtin expands backslash-escape sequences
by default.

View File

@ -1,12 +0,0 @@
diff --git a/subst.c b/subst.c
--- a/subst.c
+++ b/subst.c
@@ -7962,7 +7962,7 @@ parameter_brace_transform (varname, value, ind, xform, rtype, quoted, pflags, fl
return ((char *)NULL);
}
- if (valid_parameter_transform (xform) == 0)
+ if (xform[0] == 0 || valid_parameter_transform (xform) == 0)
{
this_command_name = oname;
#if 0 /* TAG: bash-5.2 Martin Schulte <gnu@schrader-schulte.de> 10/2020 */

View File

@ -1,24 +0,0 @@
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 0
+#define PATCHLEVEL 1
#endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
index d9feabca..93b91606 100644
--- a/subst.c
+++ b/subst.c
@@ -10857,7 +10857,7 @@ expand_array_subscript (string, sindex, quoted, flags)
exp = substring (string, si+1, ni);
t = expand_subscript_string (exp, quoted & ~(Q_ARITH|Q_DOUBLE_QUOTES));
free (exp);
- exp = sh_backslash_quote (t, abstab, 0);
+ exp = t ? sh_backslash_quote (t, abstab, 0) : savestring ("");
free (t);
slen = STRLEN (exp);

View File

@ -1,41 +0,0 @@
diff --git a/general.c b/general.c
--- a/general.c
+++ b/general.c
@@ -683,21 +683,20 @@ check_binary_file (sample, sample_len)
int sample_len;
{
register int i;
+ int nline;
unsigned char c;
if (sample_len >= 4 && sample[0] == 0x7f && sample[1] == 'E' && sample[2] == 'L' && sample[3] == 'F')
return 1;
/* Generally we check the first line for NULs. If the first line looks like
- a `#!' interpreter specifier, we just look for NULs anywhere in the
- buffer. */
- if (sample[0] == '#' && sample[1] == '!')
- return (memchr (sample, '\0', sample_len) != NULL);
+ a `#!' interpreter specifier, we look for NULs in the first two lines. */
+ nline = (sample[0] == '#' && sample[1] == '!') ? 2 : 1;
for (i = 0; i < sample_len; i++)
{
c = sample[i];
- if (c == '\n')
+ if (c == '\n' && --nline == 0)
return (0);
if (c == '\0')
return (1);
diff --git a/patchlevel.h b/patchlevel.h
index e59027ac..9ddc79f7 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 9
+#define PATCHLEVEL 10
#endif /* _PATCHLEVEL_H_ */

View File

@ -1,25 +0,0 @@
diff --git a/builtins/read.def b/builtins/read.def
--- a/builtins/read.def
+++ b/builtins/read.def
@@ -167,6 +167,9 @@ reset_timeout ()
/* Cancel alarm before restoring signal handler. */
if (read_timeout)
shtimer_clear (read_timeout);
+#if defined (READLINE)
+ rl_clear_timeout ();
+#endif
read_timeout = 0;
}
diff --git a/patchlevel.h b/patchlevel.h
index 9ddc79f7..9ff902a0 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 10
+#define PATCHLEVEL 11
#endif /* _PATCHLEVEL_H_ */

View File

@ -1,268 +0,0 @@
diff --git a/builtins/common.h b/builtins/common.h
--- a/builtins/common.h
+++ b/builtins/common.h
@@ -257,6 +257,10 @@ extern int print_shift_error;
extern int expand_once_flag;
#endif
+#if defined (EXTENDED_GLOB)
+extern int extglob_flag;
+#endif
+
extern int expaliases_flag;
/* variables from source.def */
diff --git a/builtins/shopt.def b/builtins/shopt.def
--- a/builtins/shopt.def
+++ b/builtins/shopt.def
@@ -149,6 +149,11 @@ static int shopt_set_complete_direxpand PARAMS((char *, int));
static int set_assoc_expand PARAMS((char *, int));
#endif
+#if defined (EXTENDED_GLOB)
+int extglob_flag = EXTGLOB_DEFAULT;
+static int shopt_set_extglob PARAMS((char *, int));
+#endif
+
int expaliases_flag = 0;
static int shopt_set_expaliases PARAMS((char *, int));
@@ -206,7 +211,7 @@ static struct {
{ "extdebug", &debugging_mode, shopt_set_debug_mode },
#endif
#if defined (EXTENDED_GLOB)
- { "extglob", &extended_glob, (shopt_set_func_t *)NULL },
+ { "extglob", &extglob_flag, shopt_set_extglob },
#endif
{ "extquote", &extended_quote, (shopt_set_func_t *)NULL },
{ "failglob", &fail_glob_expansion, (shopt_set_func_t *)NULL },
@@ -377,7 +382,7 @@ reset_shopt_options ()
#endif
#if defined (EXTENDED_GLOB)
- extended_glob = EXTGLOB_DEFAULT;
+ extended_glob = extglob_flag = EXTGLOB_DEFAULT;
#endif
#if defined (ARRAY_VARS)
@@ -643,6 +648,17 @@ shopt_set_expaliases (option_name, mode)
return 0;
}
+#if defined (EXTENDED_GLOB)
+static int
+shopt_set_extglob (option_name, mode)
+ char *option_name;
+ int mode;
+{
+ extended_glob = extglob_flag;
+ return 0;
+}
+#endif
+
#if defined (READLINE)
static int
shopt_enable_hostname_completion (option_name, mode)
diff --git a/execute_cmd.c b/execute_cmd.c
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -3990,13 +3990,11 @@ execute_cond_node (cond)
else
#endif /* COND_REGEXP */
{
- int oe;
- oe = extended_glob;
extended_glob = 1;
result = binary_test (cond->op->word, arg1, arg2, TEST_PATMATCH|TEST_ARITHEXP|TEST_LOCALE)
? EXECUTION_SUCCESS
: EXECUTION_FAILURE;
- extended_glob = oe;
+ extended_glob = extglob_flag;
}
if (arg1 != nullstr)
free (arg1);
diff --git a/parse.y b/parse.y
--- a/parse.y
+++ b/parse.y
@@ -125,7 +125,7 @@ do { \
} while (0)
#if defined (EXTENDED_GLOB)
-extern int extended_glob;
+extern int extended_glob, extglob_flag;
#endif
#if defined (TRANSLATABLE_STRINGS)
@@ -3304,7 +3304,7 @@ reset_parser ()
#if defined (EXTENDED_GLOB)
/* Reset to global value of extended glob */
if (parser_state & (PST_EXTPAT|PST_CMDSUBST))
- extended_glob = global_extglob;
+ extended_glob = extglob_flag;
#endif
if (parser_state & (PST_CMDSUBST|PST_STRING))
expand_aliases = expaliases_flag;
@@ -4124,10 +4124,10 @@ parse_comsub (qc, open, close, lenp, flags)
expand_aliases = posixly_correct != 0;
#if defined (EXTENDED_GLOB)
/* If (parser_state & PST_EXTPAT), we're parsing an extended pattern for a
- conditional command and have already set global_extglob appropriately. */
+ conditional command and have already set extended_glob appropriately. */
if (shell_compatibility_level <= 51 && was_extpat == 0)
{
- local_extglob = global_extglob = extended_glob;
+ local_extglob = extended_glob;
extended_glob = 1;
}
#endif
@@ -4235,7 +4235,7 @@ xparse_dolparen (base, string, indp, flags)
{
sh_parser_state_t ps;
sh_input_line_state_t ls;
- int orig_ind, nc, sflags, start_lineno;
+ int orig_ind, nc, sflags, start_lineno, local_extglob;
char *ret, *ep, *ostring;
/*debug_parser(1);*/
@@ -4278,7 +4278,7 @@ xparse_dolparen (base, string, indp, flags)
old value will be restored by restore_parser_state(). */
expand_aliases = 0;
#if defined (EXTENDED_GLOB)
- global_extglob = extended_glob; /* for reset_parser() */
+ local_extglob = extended_glob;
#endif
token_to_read = DOLPAREN; /* let's trick the parser */
@@ -4296,6 +4296,9 @@ xparse_dolparen (base, string, indp, flags)
restore_input_line_state (&ls);
restore_parser_state (&ps);
+#if defined (EXTENDED_GLOB)
+ extended_glob = local_extglob;
+#endif
token_to_read = 0;
/* If parse_string returns < 0, we need to jump to top level with the
@@ -4731,12 +4734,16 @@ cond_term ()
}
/* rhs */
+#if defined (EXTENDED_GLOB)
local_extglob = extended_glob;
if (parser_state & PST_EXTPAT)
extended_glob = 1;
+#endif
tok = read_token (READ);
+#if defined (EXTENDED_GLOB)
if (parser_state & PST_EXTPAT)
extended_glob = local_extglob;
+#endif
parser_state &= ~(PST_REGEXP|PST_EXTPAT);
if (tok == WORD)
@@ -4783,7 +4790,6 @@ parse_cond_command ()
{
COND_COM *cexp;
- global_extglob = extended_glob;
cexp = cond_expr ();
return (make_cond_command (cexp));
}
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 11
+#define PATCHLEVEL 12
#endif /* _PATCHLEVEL_H_ */
diff --git a/y.tab.c b/y.tab.c
--- a/y.tab.c
+++ b/y.tab.c
@@ -175,7 +175,7 @@ do { \
} while (0)
#if defined (EXTENDED_GLOB)
-extern int extended_glob;
+extern int extended_glob, extglob_flag;
#endif
#if defined (TRANSLATABLE_STRINGS)
@@ -5615,7 +5615,7 @@ reset_parser ()
#if defined (EXTENDED_GLOB)
/* Reset to global value of extended glob */
if (parser_state & (PST_EXTPAT|PST_CMDSUBST))
- extended_glob = global_extglob;
+ extended_glob = extglob_flag;
#endif
if (parser_state & (PST_CMDSUBST|PST_STRING))
expand_aliases = expaliases_flag;
@@ -6435,10 +6435,10 @@ parse_comsub (qc, open, close, lenp, flags)
expand_aliases = posixly_correct != 0;
#if defined (EXTENDED_GLOB)
/* If (parser_state & PST_EXTPAT), we're parsing an extended pattern for a
- conditional command and have already set global_extglob appropriately. */
+ conditional command and have already set extended_glob appropriately. */
if (shell_compatibility_level <= 51 && was_extpat == 0)
{
- local_extglob = global_extglob = extended_glob;
+ local_extglob = extended_glob;
extended_glob = 1;
}
#endif
@@ -6546,7 +6546,7 @@ xparse_dolparen (base, string, indp, flags)
{
sh_parser_state_t ps;
sh_input_line_state_t ls;
- int orig_ind, nc, sflags, start_lineno;
+ int orig_ind, nc, sflags, start_lineno, local_extglob;
char *ret, *ep, *ostring;
/*debug_parser(1);*/
@@ -6589,7 +6589,7 @@ xparse_dolparen (base, string, indp, flags)
old value will be restored by restore_parser_state(). */
expand_aliases = 0;
#if defined (EXTENDED_GLOB)
- global_extglob = extended_glob; /* for reset_parser() */
+ local_extglob = extended_glob;
#endif
token_to_read = DOLPAREN; /* let's trick the parser */
@@ -6607,6 +6607,9 @@ xparse_dolparen (base, string, indp, flags)
restore_input_line_state (&ls);
restore_parser_state (&ps);
+#if defined (EXTENDED_GLOB)
+ extended_glob = local_extglob;
+#endif
token_to_read = 0;
/* If parse_string returns < 0, we need to jump to top level with the
@@ -7042,12 +7045,16 @@ cond_term ()
}
/* rhs */
+#if defined (EXTENDED_GLOB)
local_extglob = extended_glob;
if (parser_state & PST_EXTPAT)
extended_glob = 1;
+#endif
tok = read_token (READ);
+#if defined (EXTENDED_GLOB)
if (parser_state & PST_EXTPAT)
extended_glob = local_extglob;
+#endif
parser_state &= ~(PST_REGEXP|PST_EXTPAT);
if (tok == WORD)
@@ -7094,7 +7101,6 @@ parse_cond_command ()
{
COND_COM *cexp;
- global_extglob = extended_glob;
cexp = cond_expr ();
return (make_cond_command (cexp));
}

View File

@ -1,34 +0,0 @@
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 12
+#define PATCHLEVEL 13
#endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
--- a/subst.c
+++ b/subst.c
@@ -7497,8 +7497,6 @@ expand_arrayref:
? quote_string (temp)
: quote_escapes (temp);
rflags |= W_ARRAYIND;
- if (estatep)
- *estatep = es; /* structure copy */
}
/* Note that array[*] and array[@] expanded to a quoted null string by
returning the W_HASQUOTEDNULL flag to the caller in addition to TEMP. */
@@ -7507,7 +7505,9 @@ expand_arrayref:
else if (es.subtype == 2 && temp && QUOTED_NULL (temp) && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)))
rflags |= W_HASQUOTEDNULL;
- if (estatep == 0)
+ if (estatep)
+ *estatep = es; /* structure copy */
+ else
flush_eltstate (&es);
}
#endif

View File

@ -1,93 +0,0 @@
diff --git a/execute_cmd.c b/execute_cmd.c
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -3624,6 +3624,7 @@ execute_case_command (case_command)
free (pattern);
dispose_words (es);
+ QUIT;
if (match)
{
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 13
+#define PATCHLEVEL 14
#endif /* _PATCHLEVEL_H_ */
diff --git a/sig.c b/sig.c
--- a/sig.c
+++ b/sig.c
@@ -94,6 +94,7 @@ static SigHandler *old_winch = (SigHandler *)SIG_DFL;
#endif
static void initialize_shell_signals PARAMS((void));
+static void kill_shell PARAMS((int));
void
initialize_signals (reinit)
@@ -486,6 +487,8 @@ restore_sigmask ()
#endif
}
+static int handling_termsig = 0;
+
sighandler
termsig_sighandler (sig)
int sig;
@@ -532,6 +535,14 @@ termsig_sighandler (sig)
sig == terminating_signal)
terminate_immediately = 1;
+ /* If we are currently handling a terminating signal, we have a couple of
+ choices here. We can ignore this second terminating signal and let the
+ shell exit from the first one, or we can exit immediately by killing
+ the shell with this signal. This code implements the latter; to implement
+ the former, replace the kill_shell(sig) with return. */
+ if (handling_termsig)
+ kill_shell (sig); /* just short-circuit now */
+
terminating_signal = sig;
if (terminate_immediately)
@@ -564,16 +575,13 @@ void
termsig_handler (sig)
int sig;
{
- static int handling_termsig = 0;
- int i, core;
- sigset_t mask;
-
/* Simple semaphore to keep this function from being executed multiple
times. Since we no longer are running as a signal handler, we don't
block multiple occurrences of the terminating signals while running. */
if (handling_termsig)
return;
- handling_termsig = 1;
+
+ handling_termsig = terminating_signal; /* for termsig_sighandler */
terminating_signal = 0; /* keep macro from re-testing true. */
/* I don't believe this condition ever tests true. */
@@ -613,6 +621,16 @@ termsig_handler (sig)
run_exit_trap (); /* XXX - run exit trap possibly in signal context? */
+ kill_shell (sig);
+}
+
+static void
+kill_shell (sig)
+ int sig;
+{
+ int i, core;
+ sigset_t mask;
+
/* We don't change the set of blocked signals. If a user starts the shell
with a terminating signal blocked, we won't get here (and if by some
magic chance we do, we'll exit below). What we do is to restore the

View File

@ -1,163 +0,0 @@
diff --git a/builtins/common.h b/builtins/common.h
--- a/builtins/common.h
+++ b/builtins/common.h
@@ -51,6 +51,7 @@ do { \
#define SEVAL_FUNCDEF 0x080 /* only allow function definitions */
#define SEVAL_ONECMD 0x100 /* only allow a single command */
#define SEVAL_NOHISTEXP 0x200 /* inhibit history expansion */
+#define SEVAL_NOOPTIMIZE 0x400 /* don't try to set optimization flags */
/* Flags for describe_command, shared between type.def and command.def */
#define CDESC_ALL 0x001 /* type -a */
diff --git a/builtins/eval.def b/builtins/eval.def
--- a/builtins/eval.def
+++ b/builtins/eval.def
@@ -53,5 +53,5 @@ eval_builtin (list)
return (EX_USAGE);
list = loptend; /* skip over possible `--' */
- return (list ? evalstring (string_list (list), "eval", SEVAL_NOHIST) : EXECUTION_SUCCESS);
+ return (list ? evalstring (string_list (list), "eval", SEVAL_NOHIST|SEVAL_NOOPTIMIZE) : EXECUTION_SUCCESS);
}
diff --git a/builtins/evalstring.c b/builtins/evalstring.c
--- a/builtins/evalstring.c
+++ b/builtins/evalstring.c
@@ -132,8 +132,8 @@ optimize_connection_fork (command)
if (command->type == cm_connection &&
(command->value.Connection->connector == AND_AND || command->value.Connection->connector == OR_OR || command->value.Connection->connector == ';') &&
(command->value.Connection->second->flags & CMD_TRY_OPTIMIZING) &&
- ((startup_state == 2 && should_suppress_fork (command->value.Connection->second)) ||
- ((subshell_environment & SUBSHELL_PAREN) && should_optimize_fork (command->value.Connection->second, 0))))
+ (should_suppress_fork (command->value.Connection->second) ||
+ ((subshell_environment & SUBSHELL_PAREN) && should_optimize_fork (command->value.Connection->second, 0))))
{
command->value.Connection->second->flags |= CMD_NO_FORK;
command->value.Connection->second->value.Simple->flags |= CMD_NO_FORK;
@@ -290,6 +290,7 @@ parse_prologue (string, flags, tag)
(flags & SEVAL_NOFREE) -> don't free STRING when finished
(flags & SEVAL_RESETLINE) -> reset line_number to 1
(flags & SEVAL_NOHISTEXP) -> history_expansion_inhibited -> 1
+ (flags & SEVAL_NOOPTIMIZE) -> don't try to turn on optimizing flags
*/
int
@@ -502,7 +503,9 @@ parse_and_execute (string, from_file, flags)
if we are at the end of the command string, the last in a
series of connection commands is
command->value.Connection->second. */
- else if (command->type == cm_connection && can_optimize_connection (command))
+ else if (command->type == cm_connection &&
+ (flags & SEVAL_NOOPTIMIZE) == 0 &&
+ can_optimize_connection (command))
{
command->value.Connection->second->flags |= CMD_TRY_OPTIMIZING;
command->value.Connection->second->value.Simple->flags |= CMD_TRY_OPTIMIZING;
diff --git a/execute_cmd.c b/execute_cmd.c
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -1654,7 +1654,8 @@ execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close)
subshell sets an exit trap, so we set CMD_NO_FORK for simple commands
and set CMD_TRY_OPTIMIZING for simple commands on the right side of an
and-or or `;' list to test for optimizing forks when they are executed. */
- if (user_subshell && command->type == cm_subshell)
+ if (user_subshell && command->type == cm_subshell &&
+ (command->flags & (CMD_TIME_PIPELINE|CMD_INVERT_RETURN)) == 0)
optimize_subshell_command (command->value.Subshell->command);
/* Do redirections, then dispose of them before recursive call. */
diff --git a/jobs.c b/jobs.c
--- a/jobs.c
+++ b/jobs.c
@@ -4220,7 +4220,7 @@ run_sigchld_trap (nchild)
jobs_list_frozen = 1;
for (i = 0; i < nchild; i++)
{
- parse_and_execute (savestring (trap_command), "trap", SEVAL_NOHIST|SEVAL_RESETLINE);
+ parse_and_execute (savestring (trap_command), "trap", SEVAL_NOHIST|SEVAL_RESETLINE|SEVAL_NOOPTIMIZE);
}
run_unwind_frame ("SIGCHLD trap");
diff --git a/parse.y b/parse.y
--- a/parse.y
+++ b/parse.y
@@ -2827,7 +2827,7 @@ execute_variable_command (command, vname)
if (last_lastarg)
last_lastarg = savestring (last_lastarg);
- parse_and_execute (savestring (command), vname, SEVAL_NONINT|SEVAL_NOHIST);
+ parse_and_execute (savestring (command), vname, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_NOOPTIMIZE);
restore_parser_state (&ps);
bind_variable ("_", last_lastarg, 0);
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 14
+#define PATCHLEVEL 15
#endif /* _PATCHLEVEL_H_ */
diff --git a/trap.c b/trap.c
--- a/trap.c
+++ b/trap.c
@@ -304,6 +304,7 @@ run_pending_traps ()
sh_parser_state_t pstate;
volatile int save_return_catch_flag, function_code;
procenv_t save_return_catch;
+ char *trap_command, *old_trap;
#if defined (ARRAY_VARS)
ARRAY *ps;
#endif
@@ -419,6 +420,9 @@ run_pending_traps ()
}
else
{
+ old_trap = trap_list[sig];
+ trap_command = savestring (old_trap);
+
save_parser_state (&pstate);
save_subst_varlist = subst_assign_varlist;
subst_assign_varlist = 0;
@@ -441,7 +445,8 @@ run_pending_traps ()
}
if (function_code == 0)
- x = parse_and_execute (savestring (trap_list[sig]), "trap", SEVAL_NONINT|SEVAL_NOHIST|SEVAL_RESETLINE);
+ /* XXX is x always last_command_exit_value? */
+ x = parse_and_execute (trap_command, "trap", SEVAL_NONINT|SEVAL_NOHIST|SEVAL_RESETLINE|SEVAL_NOOPTIMIZE);
else
{
parse_and_execute_cleanup (sig + 1); /* XXX - could use -1 */
@@ -1002,7 +1007,7 @@ run_exit_trap ()
if (code == 0 && function_code == 0)
{
reset_parser ();
- parse_and_execute (trap_command, "exit trap", SEVAL_NONINT|SEVAL_NOHIST|SEVAL_RESETLINE);
+ parse_and_execute (trap_command, "exit trap", SEVAL_NONINT|SEVAL_NOHIST|SEVAL_RESETLINE|SEVAL_NOOPTIMIZE);
}
else if (code == ERREXIT)
retval = last_command_exit_value;
@@ -1109,7 +1114,7 @@ _run_trap_internal (sig, tag)
function_code = setjmp_nosigs (return_catch);
}
- flags = SEVAL_NONINT|SEVAL_NOHIST;
+ flags = SEVAL_NONINT|SEVAL_NOHIST|SEVAL_NOOPTIMIZE;
if (sig != DEBUG_TRAP && sig != RETURN_TRAP && sig != ERROR_TRAP)
flags |= SEVAL_RESETLINE;
evalnest++;
diff --git a/y.tab.c b/y.tab.c
--- a/y.tab.c
+++ b/y.tab.c
@@ -5138,7 +5138,7 @@ execute_variable_command (command, vname)
if (last_lastarg)
last_lastarg = savestring (last_lastarg);
- parse_and_execute (savestring (command), vname, SEVAL_NONINT|SEVAL_NOHIST);
+ parse_and_execute (savestring (command), vname, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_NOOPTIMIZE);
restore_parser_state (&ps);
bind_variable ("_", last_lastarg, 0);

File diff suppressed because it is too large Load Diff

View File

@ -1,23 +0,0 @@
diff --git a/builtins/evalfile.c b/builtins/evalfile.c
--- a/builtins/evalfile.c
+++ b/builtins/evalfile.c
@@ -266,7 +266,7 @@ file_error_and_exit:
#endif
/* set the flags to be passed to parse_and_execute */
- pflags = SEVAL_RESETLINE;
+ pflags = SEVAL_RESETLINE|SEVAL_NOOPTIMIZE;
pflags |= (flags & FEVAL_HISTORY) ? 0 : SEVAL_NOHIST;
if (flags & FEVAL_BUILTIN)
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 16
+#define PATCHLEVEL 17
#endif /* _PATCHLEVEL_H_ */

File diff suppressed because it is too large Load Diff

View File

@ -1,38 +0,0 @@
diff --git a/jobs.c b/jobs.c
--- a/jobs.c
+++ b/jobs.c
@@ -3077,9 +3077,13 @@ if (job == NO_JOB)
/* Don't modify terminal pgrp if we are running in background or a
subshell. Make sure subst.c:command_substitute uses the same
conditions to determine whether or not it should undo this and
- give the terminal to pipeline_pgrp. */
-
+ give the terminal to pipeline_pgrp. We don't give the terminal
+ back to shell_pgrp if an async job in the background exits because
+ we never gave it to that job in the first place. An async job in
+ the foreground is one we started in the background and foregrounded
+ with `fg', and gave it the terminal. */
if ((flags & JWAIT_NOTERM) == 0 && running_in_background == 0 &&
+ (job == NO_JOB || IS_ASYNC (job) == 0 || IS_FOREGROUND (job)) &&
(subshell_environment & (SUBSHELL_ASYNC|SUBSHELL_PIPE)) == 0)
give_terminal_to (shell_pgrp, 0);
}
@@ -3623,6 +3627,7 @@ start_job (job, foreground)
{
get_tty_state ();
save_stty = shell_tty_info;
+ jobs[job]->flags &= ~J_ASYNC; /* no longer async */
/* Give the terminal to this job. */
if (IS_JOBCONTROL (job))
give_terminal_to (jobs[job]->pgrp, 0);
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 18
+#define PATCHLEVEL 19
#endif /* _PATCHLEVEL_H_ */

View File

@ -1,25 +0,0 @@
diff --git a/lib/readline/nls.c b/lib/readline/nls.c
--- a/lib/readline/nls.c
+++ b/lib/readline/nls.c
@@ -141,6 +141,10 @@ _rl_init_locale (void)
if (lspec == 0)
lspec = "";
ret = setlocale (LC_CTYPE, lspec); /* ok, since it does not change locale */
+ if (ret == 0 || *ret == 0)
+ ret = setlocale (LC_CTYPE, (char *)NULL);
+ if (ret == 0 || *ret == 0)
+ ret = RL_DEFAULT_LOCALE;
#else
ret = (lspec == 0 || *lspec == 0) ? RL_DEFAULT_LOCALE : lspec;
#endif
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 1
+#define PATCHLEVEL 2
#endif /* _PATCHLEVEL_H_ */

View File

@ -1,33 +0,0 @@
diff --git a/parse.y b/parse.y
--- a/parse.y
+++ b/parse.y
@@ -3150,6 +3150,7 @@ time_command_acceptable ()
case TIME: /* time time pipeline */
case TIMEOPT: /* time -p time pipeline */
case TIMEIGN: /* time -p -- ... */
+ case DOLPAREN:
return 1;
default:
return 0;
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 19
+#define PATCHLEVEL 20
#endif /* _PATCHLEVEL_H_ */
diff --git a/y.tab.c b/y.tab.c
--- a/y.tab.c
+++ b/y.tab.c
@@ -5465,6 +5465,7 @@ time_command_acceptable ()
case TIME: /* time time pipeline */
case TIMEOPT: /* time -p time pipeline */
case TIMEIGN: /* time -p -- ... */
+ case DOLPAREN:
return 1;
default:
return 0;

View File

@ -1,32 +0,0 @@
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 20
+#define PATCHLEVEL 21
#endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
--- a/subst.c
+++ b/subst.c
@@ -1693,7 +1693,7 @@ extract_heredoc_dolbrace_string (string, sindex, quoted, flags)
t = extract_command_subst (string, &si, flags);
CHECK_STRING_OVERRUN (i, si, slen, c);
- tlen = si - i - 1;
+ tlen = si - i - 2;
RESIZE_MALLOCED_BUFFER (result, result_index, tlen + 4, result_size, 64);
result[result_index++] = c;
result[result_index++] = LPAREN;
@@ -1713,7 +1713,7 @@ extract_heredoc_dolbrace_string (string, sindex, quoted, flags)
t = extract_process_subst (string, (string[i] == '<' ? "<(" : ">)"), &si, flags);
CHECK_STRING_OVERRUN (i, si, slen, c);
- tlen = si - i - 1;
+ tlen = si - i - 2;
RESIZE_MALLOCED_BUFFER (result, result_index, tlen + 4, result_size, 64);
result[result_index++] = c;
result[result_index++] = LPAREN;

View File

@ -1,29 +0,0 @@
diff --git a/lib/readline/display.c b/lib/readline/display.c
--- a/lib/readline/display.c
+++ b/lib/readline/display.c
@@ -2683,11 +2683,8 @@ rl_forced_update_display (void)
register char *temp;
if (visible_line)
- {
- temp = visible_line;
- while (*temp)
- *temp++ = '\0';
- }
+ memset (visible_line, 0, line_size);
+
rl_on_new_line ();
forced_display++;
(*rl_redisplay_function) ();
diff --git a/patchlevel.h b/patchlevel.h
index 1712b108..e5e8cabd 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 21
+#define PATCHLEVEL 22
#endif /* _PATCHLEVEL_H_ */

View File

@ -1,38 +0,0 @@
diff --git a/builtins/declare.def b/builtins/declare.def
--- a/builtins/declare.def
+++ b/builtins/declare.def
@@ -420,11 +420,19 @@ declare_internal (list, local_var)
if (local_var && variable_context && STREQ (name, "-"))
{
+ int o;
+
+ o = localvar_inherit;
+ localvar_inherit = 0;
var = make_local_variable ("-", 0);
- FREE (value_cell (var)); /* just in case */
- value = get_current_options ();
- var_setvalue (var, value);
- VSETATTR (var, att_invisible);
+ localvar_inherit = o;
+
+ if (value_cell (var) == NULL) /* no duplicate instances */
+ {
+ value = get_current_options ();
+ var_setvalue (var, value);
+ VSETATTR (var, att_invisible);
+ }
NEXT_VARIABLE ();
}
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 22
+#define PATCHLEVEL 23
#endif /* _PATCHLEVEL_H_ */

View File

@ -1,56 +0,0 @@
diff --git a/arrayfunc.c b/arrayfunc.c
--- a/arrayfunc.c
+++ b/arrayfunc.c
@@ -650,7 +650,7 @@ assign_assoc_from_kvlist (var, nlist, h, flags)
continue;
}
- aval = expand_subscript_string (v, 0);
+ aval = expand_assignment_string_to_string (v, 0);
if (aval == 0)
{
aval = (char *)xmalloc (1);
@@ -842,7 +842,7 @@ assign_compound_array_list (var, nlist, flags)
/* See above; we need to expand the value here */
if (assoc_p (var))
{
- val = expand_subscript_string (val, 0);
+ val = expand_assignment_string_to_string (val, 0);
if (val == 0)
{
val = (char *)xmalloc (1);
@@ -1030,7 +1030,7 @@ expand_and_quote_assoc_word (w, type)
nword[i++] = w[ind++];
nword[i++] = w[ind++];
- t = expand_subscript_string (w+ind, 0);
+ t = expand_assignment_string_to_string (w+ind, 0);
s = (t && strchr (t, CTLESC)) ? quote_escapes (t) : t;
value = sh_single_quote (s ? s : "");
if (s != t)
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 23
+#define PATCHLEVEL 24
#endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
--- a/subst.c
+++ b/subst.c
@@ -10802,7 +10802,11 @@ expand_subscript_string (string, quoted)
oe = expand_no_split_dollar_star;
ret = (char *)NULL;
+#if 0
td.flags = W_NOPROCSUB|W_NOTILDE|W_NOSPLIT2; /* XXX - W_NOCOMSUB? */
+#else
+ td.flags = W_NOPROCSUB|W_NOSPLIT2; /* XXX - W_NOCOMSUB? */
+#endif
td.word = savestring (string); /* in case it's freed on error */
expand_no_split_dollar_star = 1;

View File

@ -1,24 +0,0 @@
diff --git a/execute_cmd.c b/execute_cmd.c
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -1725,6 +1725,9 @@ execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close)
return_code = (return_code == EXECUTION_SUCCESS) ? EXECUTION_FAILURE
: EXECUTION_SUCCESS;
+ /* Check for terminating signals before we return to our caller, which we
+ expect to exit immediately anyway. */
+ CHECK_TERMSIG;
/* If we were explicitly placed in a subshell with (), we need
to do the `shell cleanup' things, such as running traps[0]. */
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 24
+#define PATCHLEVEL 25
#endif /* _PATCHLEVEL_H_ */

View File

@ -1,23 +0,0 @@
diff --git a/lib/readline/colors.c b/lib/readline/colors.c
--- a/lib/readline/colors.c
+++ b/lib/readline/colors.c
@@ -73,7 +73,7 @@
static bool is_colored (enum indicator_no type);
static void restore_default_color (void);
-#define RL_COLOR_PREFIX_EXTENSION "readline-colored-completion-prefix"
+#define RL_COLOR_PREFIX_EXTENSION ".readline-colored-completion-prefix"
COLOR_EXT_TYPE *_rl_color_ext_list = 0;
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 25
+#define PATCHLEVEL 26
#endif /* _PATCHLEVEL_H_ */

View File

@ -1,60 +0,0 @@
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 2
+#define PATCHLEVEL 3
#endif /* _PATCHLEVEL_H_ */
diff --git a/print_cmd.c b/print_cmd.c
--- a/print_cmd.c
+++ b/print_cmd.c
@@ -297,10 +297,12 @@ make_command_string_internal (command)
case '\n': /* special case this */
{
char c = command->value.Connection->connector;
+ int was_newline;
s[0] = printing_comsub ? c : ';';
s[1] = '\0';
+ was_newline = deferred_heredocs == 0 && was_heredoc == 0 && c == '\n';
if (deferred_heredocs == 0)
{
if (was_heredoc == 0)
@@ -314,6 +316,8 @@ make_command_string_internal (command)
if (inside_function_def)
cprintf ("\n");
+ else if (printing_comsub && c == '\n' && was_newline == 0)
+ cprintf ("\n"); /* preserve newlines in comsubs but don't double them */
else
{
if (c == ';')
@@ -1365,7 +1369,11 @@ print_function_def (func)
cmdcopy->redirects = func_redirects;
}
else
- newline ("}");
+ {
+ /* { */
+ newline ("}");
+ was_heredoc = 0; /* not printing any here-documents now */
+ }
dispose_command (cmdcopy);
}
@@ -1442,7 +1450,10 @@ named_function_string (name, command, flags)
cmdcopy->redirects = func_redirects;
}
else
- newline ("}");
+ { /* { */
+ newline ("}");
+ was_heredoc = 0;
+ }
result = the_printed_command;

View File

@ -1,50 +0,0 @@
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 3
+#define PATCHLEVEL 4
#endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
--- a/subst.c
+++ b/subst.c
@@ -1798,6 +1798,9 @@ extract_heredoc_dolbrace_string (string, sindex, quoted, flags)
return (result);
}
+#define PARAMEXPNEST_MAX 32 // for now
+static int dbstate[PARAMEXPNEST_MAX];
+
/* Extract a parameter expansion expression within ${ and } from STRING.
Obey the Posix.2 rules for finding the ending `}': count braces while
skipping over enclosed quoted strings and command substitutions.
@@ -1828,6 +1831,8 @@ extract_dollar_brace_string (string, sindex, quoted, flags)
if (quoted == Q_HERE_DOCUMENT && dolbrace_state == DOLBRACE_QUOTE && (flags & SX_NOALLOC) == 0)
return (extract_heredoc_dolbrace_string (string, sindex, quoted, flags));
+ dbstate[0] = dolbrace_state;
+
pass_character = 0;
nesting_level = 1;
slen = strlen (string + *sindex) + *sindex;
@@ -1852,6 +1857,8 @@ extract_dollar_brace_string (string, sindex, quoted, flags)
if (string[i] == '$' && string[i+1] == LBRACE)
{
+ if (nesting_level < PARAMEXPNEST_MAX)
+ dbstate[nesting_level] = dolbrace_state;
nesting_level++;
i += 2;
if (dolbrace_state == DOLBRACE_QUOTE || dolbrace_state == DOLBRACE_WORD)
@@ -1864,6 +1871,7 @@ extract_dollar_brace_string (string, sindex, quoted, flags)
nesting_level--;
if (nesting_level == 0)
break;
+ dolbrace_state = (nesting_level < PARAMEXPNEST_MAX) ? dbstate[nesting_level] : dbstate[0]; /* Guess using initial state */
i++;
continue;
}

View File

@ -1,24 +0,0 @@
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 4
+#define PATCHLEVEL 5
#endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
--- a/subst.c
+++ b/subst.c
@@ -8965,7 +8965,8 @@ pat_subst (string, pat, rep, mflags)
return (ret);
}
else if (*string == 0 && (match_pattern (string, pat, mtype, &s, &e) != 0))
- return ((mflags & MATCH_EXPREP) ? strcreplace (rep, '&', "", 2) : savestring (rep));
+ return (mflags & MATCH_EXPREP) ? strcreplace (rep, '&', "", 2)
+ : (rep ? savestring (rep) : savestring (""));
ret = (char *)xmalloc (rsize = 64);
ret[0] = '\0';

View File

@ -1,230 +0,0 @@
diff --git a/builtins/common.h b/builtins/common.h
--- a/builtins/common.h
+++ b/builtins/common.h
@@ -257,6 +257,8 @@ extern int print_shift_error;
extern int expand_once_flag;
#endif
+extern int expaliases_flag;
+
/* variables from source.def */
extern int source_searches_cwd;
extern int source_uses_path;
diff --git a/builtins/shopt.def b/builtins/shopt.def
--- a/builtins/shopt.def
+++ b/builtins/shopt.def
@@ -149,6 +149,9 @@ static int shopt_set_complete_direxpand PARAMS((char *, int));
static int set_assoc_expand PARAMS((char *, int));
#endif
+int expaliases_flag = 0;
+static int shopt_set_expaliases PARAMS((char *, int));
+
static int shopt_set_debug_mode PARAMS((char *, int));
static int shopt_login_shell;
@@ -198,7 +201,7 @@ static struct {
#endif
{ "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL },
{ "execfail", &no_exit_on_failed_exec, (shopt_set_func_t *)NULL },
- { "expand_aliases", &expand_aliases, (shopt_set_func_t *)NULL },
+ { "expand_aliases", &expaliases_flag, shopt_set_expaliases },
#if defined (DEBUGGER)
{ "extdebug", &debugging_mode, shopt_set_debug_mode },
#endif
@@ -350,7 +353,7 @@ reset_shopt_options ()
check_window_size = CHECKWINSIZE_DEFAULT;
allow_null_glob_expansion = glob_dot_filenames = 0;
no_exit_on_failed_exec = 0;
- expand_aliases = 0;
+ expand_aliases = expaliases_flag = 0;
extended_quote = 1;
fail_glob_expansion = 0;
glob_asciirange = GLOBASCII_DEFAULT;
@@ -631,6 +634,15 @@ shopt_set_debug_mode (option_name, mode)
return (0);
}
+static int
+shopt_set_expaliases (option_name, mode)
+ char *option_name;
+ int mode;
+{
+ expand_aliases = expaliases_flag;
+ return 0;
+}
+
#if defined (READLINE)
static int
shopt_enable_hostname_completion (option_name, mode)
diff --git a/execute_cmd.c b/execute_cmd.c
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -1536,7 +1536,7 @@ execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close)
expansion with `shopt -s expand_alias' to continue to expand
aliases. */
if (ois != interactive_shell)
- expand_aliases = 0;
+ expand_aliases = expaliases_flag = 0;
}
/* Subshells are neither login nor interactive. */
diff --git a/general.c b/general.c
--- a/general.c
+++ b/general.c
@@ -91,7 +91,7 @@ static struct {
{
&interactive_comments,
&source_uses_path,
- &expand_aliases,
+ &expaliases_flag,
&inherit_errexit,
&print_shift_error,
0
@@ -106,7 +106,8 @@ posix_initialize (on)
/* Things that should be turned on when posix mode is enabled. */
if (on != 0)
{
- interactive_comments = source_uses_path = expand_aliases = 1;
+ interactive_comments = source_uses_path = 1;
+ expand_aliases = expaliases_flag = 1;
inherit_errexit = 1;
source_searches_cwd = 0;
print_shift_error = 1;
@@ -116,13 +117,14 @@ posix_initialize (on)
else if (saved_posix_vars) /* on == 0, restore saved settings */
{
set_posix_options (saved_posix_vars);
+ expand_aliases = expaliases_flag;
free (saved_posix_vars);
saved_posix_vars = 0;
}
else /* on == 0, restore a default set of settings */
{
source_searches_cwd = 1;
- expand_aliases = interactive_shell;
+ expand_aliases = expaliases_flag = interactive_shell; /* XXX */
print_shift_error = 0;
}
}
diff --git a/parse.y b/parse.y
--- a/parse.y
+++ b/parse.y
@@ -3306,6 +3306,8 @@ reset_parser ()
if (parser_state & (PST_EXTPAT|PST_CMDSUBST))
extended_glob = global_extglob;
#endif
+ if (parser_state & (PST_CMDSUBST|PST_STRING))
+ expand_aliases = expaliases_flag;
parser_state = 0;
here_doc_first_line = 0;
@@ -4388,6 +4390,7 @@ parse_string_to_command (string, flags)
if (flags & SX_COMPLETE)
parser_state |= PST_NOERROR;
+ parser_state |= PST_STRING;
expand_aliases = 0;
cmd = 0;
@@ -6401,7 +6404,7 @@ parse_string_to_word_list (s, flags, whom)
/* State flags we don't want to persist into compound assignments. */
parser_state &= ~PST_NOEXPAND; /* parse_comsub sentinel */
/* State flags we want to set for this run through the tokenizer. */
- parser_state |= PST_COMPASSIGN|PST_REPARSE;
+ parser_state |= PST_COMPASSIGN|PST_REPARSE|PST_STRING;
}
while ((tok = read_token (READ)) != yacc_EOF)
diff --git a/parser.h b/parser.h
--- a/parser.h
+++ b/parser.h
@@ -50,6 +50,7 @@
#define PST_ENDALIAS 0x200000 /* just finished expanding and consuming an alias */
#define PST_NOEXPAND 0x400000 /* don't expand anything in read_token_word; for command substitution */
#define PST_NOERROR 0x800000 /* don't print error messages in yyerror */
+#define PST_STRING 0x1000000 /* parsing a string to a command or word list */
/* Definition of the delimiter stack. Needed by parse.y and bashhist.c. */
struct dstack {
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 5
+#define PATCHLEVEL 6
#endif /* _PATCHLEVEL_H_ */
diff --git a/shell.c b/shell.c
--- a/shell.c
+++ b/shell.c
@@ -1844,8 +1844,8 @@ reset_option_defaults ()
static void
init_interactive ()
{
- expand_aliases = interactive_shell = startup_state = 1;
- interactive = 1;
+ expand_aliases = expaliases_flag = 1;
+ interactive_shell = startup_state = interactive = 1;
#if defined (HISTORY)
if (enable_history_list == -1)
enable_history_list = 1; /* set default */
@@ -1865,7 +1865,7 @@ init_noninteractive ()
bash_history_reinit (0);
#endif /* HISTORY */
interactive_shell = startup_state = interactive = 0;
- expand_aliases = posixly_correct; /* XXX - was 0 not posixly_correct */
+ expand_aliases = expaliases_flag = posixly_correct; /* XXX - was 0 not posixly_correct */
no_line_editing = 1;
#if defined (JOB_CONTROL)
/* Even if the shell is not interactive, enable job control if the -i or
@@ -1882,7 +1882,7 @@ init_interactive_script ()
enable_history_list = 1;
#endif
init_noninteractive ();
- expand_aliases = interactive_shell = startup_state = 1;
+ expand_aliases = expaliases_flag = interactive_shell = startup_state = 1;
#if defined (HISTORY)
remember_on_history = enable_history_list; /* XXX */
#endif
@@ -2025,7 +2025,7 @@ shell_reinitialize ()
debugging = do_version = line_number = last_command_exit_value = 0;
forced_interactive = interactive_shell = 0;
subshell_environment = running_in_background = 0;
- expand_aliases = 0;
+ expand_aliases = expaliases_flag = 0;
bash_argv_initialized = 0;
/* XXX - should we set jobs_m_flag to 0 here? */
diff --git a/y.tab.c b/y.tab.c
--- a/y.tab.c
+++ b/y.tab.c
@@ -5617,6 +5617,8 @@ reset_parser ()
if (parser_state & (PST_EXTPAT|PST_CMDSUBST))
extended_glob = global_extglob;
#endif
+ if (parser_state & (PST_CMDSUBST|PST_STRING))
+ expand_aliases = expaliases_flag;
parser_state = 0;
here_doc_first_line = 0;
@@ -6699,6 +6701,7 @@ parse_string_to_command (string, flags)
if (flags & SX_COMPLETE)
parser_state |= PST_NOERROR;
+ parser_state |= PST_STRING;
expand_aliases = 0;
cmd = 0;
@@ -8712,7 +8715,7 @@ parse_string_to_word_list (s, flags, whom)
/* State flags we don't want to persist into compound assignments. */
parser_state &= ~PST_NOEXPAND; /* parse_comsub sentinel */
/* State flags we want to set for this run through the tokenizer. */
- parser_state |= PST_COMPASSIGN|PST_REPARSE;
+ parser_state |= PST_COMPASSIGN|PST_REPARSE|PST_STRING;
}
while ((tok = read_token (READ)) != yacc_EOF)

View File

@ -1,206 +0,0 @@
diff --git a/builtins/evalstring.c b/builtins/evalstring.c
--- a/builtins/evalstring.c
+++ b/builtins/evalstring.c
@@ -431,6 +431,8 @@ parse_and_execute (string, from_file, flags)
if (parse_command () == 0)
{
+ int local_expalias, local_alflag;
+
if ((flags & SEVAL_PARSEONLY) || (interactive_shell == 0 && read_but_dont_execute))
{
last_result = EXECUTION_SUCCESS;
@@ -507,6 +509,19 @@ parse_and_execute (string, from_file, flags)
}
#endif /* ONESHOT */
+ /* We play tricks in the parser and command_substitute() turning
+ expand_aliases on and off depending on which parsing pass and
+ whether or not we're in posix mode. This only matters for
+ parsing, and we let the higher layers deal with that. We just
+ want to ensure that expand_aliases is set to the appropriate
+ global value when we go to execute this command, so we save
+ and restore it around the execution (we don't restore it if
+ the global value of the flag (expaliases_flag) changes). */
+ local_expalias = expand_aliases;
+ local_alflag = expaliases_flag;
+ if (subshell_environment & SUBSHELL_COMSUB)
+ expand_aliases = expaliases_flag;
+
/* See if this is a candidate for $( <file ). */
if (startup_state == 2 &&
(subshell_environment & SUBSHELL_COMSUB) &&
@@ -524,6 +539,10 @@ parse_and_execute (string, from_file, flags)
dispose_fd_bitmap (bitmap);
discard_unwind_frame ("pe_dispose");
+ /* If the global value didn't change, we restore what we had. */
+ if ((subshell_environment & SUBSHELL_COMSUB) && local_alflag == expaliases_flag)
+ expand_aliases = local_expalias;
+
if (flags & SEVAL_ONECMD)
{
reset_parser ();
diff --git a/command.h b/command.h
--- a/command.h
+++ b/command.h
@@ -114,6 +114,7 @@ enum command_type { cm_for, cm_case, cm_while, cm_if, cm_simple, cm_select,
#define PF_COMPLETE 0x10 /* same as W_COMPLETE, sets SX_COMPLETE */
#define PF_EXPANDRHS 0x20 /* same as W_EXPANDRHS */
#define PF_ALLINDS 0x40 /* array, act as if [@] was supplied */
+#define PF_BACKQUOTE 0x80 /* differentiate `` from $() for command_substitute */
/* Possible values for subshell_environment */
#define SUBSHELL_ASYNC 0x01 /* subshell caused by `command &' */
diff --git a/parse.y b/parse.y
--- a/parse.y
+++ b/parse.y
@@ -3612,6 +3612,7 @@ tokword:
#define P_BACKQUOTE 0x0010 /* parsing a backquoted command substitution */
#define P_ARRAYSUB 0x0020 /* parsing a [...] array subscript for assignment */
#define P_DOLBRACE 0x0040 /* parsing a ${...} construct */
+#define P_ARITH 0x0080 /* parsing a $(( )) arithmetic expansion */
/* Lexical state while parsing a grouping construct or $(...). */
#define LEX_WASDOL 0x0001
@@ -3910,6 +3911,9 @@ parse_matched_pair (qc, open, close, lenp, flags)
}
else if ((flags & (P_ARRAYSUB|P_DOLBRACE)) && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */
goto parse_dollar_word;
+ else if ((flags & P_ARITH) && (tflags & LEX_WASDOL) && ch == '(') /*)*/
+ /* $() inside $(( ))/$[ ] */
+ goto parse_dollar_word;
#if defined (PROCESS_SUBSTITUTION)
/* XXX - technically this should only be recognized at the start of
a word */
@@ -3940,7 +3944,7 @@ parse_dollar_word:
else if (ch == '{') /* } */
nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags);
else if (ch == '[') /* ] */
- nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags);
+ nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags|P_ARITH);
CHECK_NESTRET_ERROR ();
APPEND_NESTRET ();
@@ -4079,7 +4083,7 @@ parse_comsub (qc, open, close, lenp, flags)
peekc = shell_getc (1);
shell_ungetc (peekc);
if (peekc == '(') /*)*/
- return (parse_matched_pair (qc, open, close, lenp, 0));
+ return (parse_matched_pair (qc, open, close, lenp, P_ARITH));
}
/*itrace("parse_comsub: qc = `%c' open = %c close = %c", qc, open, close);*/
@@ -4500,7 +4504,7 @@ parse_arith_cmd (ep, adddq)
int ttoklen;
exp_lineno = line_number;
- ttok = parse_matched_pair (0, '(', ')', &ttoklen, 0);
+ ttok = parse_matched_pair (0, '(', ')', &ttoklen, P_ARITH);
rval = 1;
if (ttok == &matched_pair_error)
return -1;
@@ -5015,7 +5019,7 @@ read_token_word (character)
pop_delimiter (dstack);
}
else
- ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0);
+ ttok = parse_matched_pair (cd, '[', ']', &ttoklen, P_ARITH);
if (ttok == &matched_pair_error)
return -1; /* Bail immediately. */
RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 3,
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 6
+#define PATCHLEVEL 7
#endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
--- a/subst.c
+++ b/subst.c
@@ -7123,8 +7123,12 @@ command_substitute (string, quoted, flags)
remove_quoted_escapes (string);
/* We want to expand aliases on this pass if we are not in posix mode
- for backwards compatibility. */
- if (expand_aliases)
+ for backwards compatibility. parse_and_execute() takes care of
+ setting expand_aliases back to the global value when executing the
+ parsed string. We only do this for $(...) command substitution,
+ since that is what parse_comsub handles; `` comsubs are processed
+ using parse.y:parse_matched_pair(). */
+ if (expand_aliases && (flags & PF_BACKQUOTE) == 0)
expand_aliases = posixly_correct == 0;
startup_state = 2; /* see if we can avoid a fork */
@@ -11292,7 +11296,7 @@ add_string:
else
{
de_backslash (temp);
- tword = command_substitute (temp, quoted, 0);
+ tword = command_substitute (temp, quoted, PF_BACKQUOTE);
temp1 = tword ? tword->word : (char *)NULL;
if (tword)
dispose_word_desc (tword);
diff --git a/y.tab.c b/y.tab.c
--- a/y.tab.c
+++ b/y.tab.c
@@ -5923,6 +5923,7 @@ tokword:
#define P_BACKQUOTE 0x0010 /* parsing a backquoted command substitution */
#define P_ARRAYSUB 0x0020 /* parsing a [...] array subscript for assignment */
#define P_DOLBRACE 0x0040 /* parsing a ${...} construct */
+#define P_ARITH 0x0080 /* parsing a $(( )) arithmetic expansion */
/* Lexical state while parsing a grouping construct or $(...). */
#define LEX_WASDOL 0x0001
@@ -6221,6 +6222,9 @@ parse_matched_pair (qc, open, close, lenp, flags)
}
else if ((flags & (P_ARRAYSUB|P_DOLBRACE)) && (tflags & LEX_WASDOL) && (ch == '(' || ch == '{' || ch == '[')) /* ) } ] */
goto parse_dollar_word;
+ else if ((flags & P_ARITH) && (tflags & LEX_WASDOL) && ch == '(') /*)*/
+ /* $() inside $(( ))/$[ ] */
+ goto parse_dollar_word;
#if defined (PROCESS_SUBSTITUTION)
/* XXX - technically this should only be recognized at the start of
a word */
@@ -6251,7 +6255,7 @@ parse_dollar_word:
else if (ch == '{') /* } */
nestret = parse_matched_pair (0, '{', '}', &nestlen, P_FIRSTCLOSE|P_DOLBRACE|rflags);
else if (ch == '[') /* ] */
- nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags);
+ nestret = parse_matched_pair (0, '[', ']', &nestlen, rflags|P_ARITH);
CHECK_NESTRET_ERROR ();
APPEND_NESTRET ();
@@ -6390,7 +6394,7 @@ parse_comsub (qc, open, close, lenp, flags)
peekc = shell_getc (1);
shell_ungetc (peekc);
if (peekc == '(') /*)*/
- return (parse_matched_pair (qc, open, close, lenp, 0));
+ return (parse_matched_pair (qc, open, close, lenp, P_ARITH));
}
/*itrace("parse_comsub: qc = `%c' open = %c close = %c", qc, open, close);*/
@@ -6811,7 +6815,7 @@ parse_arith_cmd (ep, adddq)
int ttoklen;
exp_lineno = line_number;
- ttok = parse_matched_pair (0, '(', ')', &ttoklen, 0);
+ ttok = parse_matched_pair (0, '(', ')', &ttoklen, P_ARITH);
rval = 1;
if (ttok == &matched_pair_error)
return -1;
@@ -7326,7 +7330,7 @@ read_token_word (character)
pop_delimiter (dstack);
}
else
- ttok = parse_matched_pair (cd, '[', ']', &ttoklen, 0);
+ ttok = parse_matched_pair (cd, '[', ']', &ttoklen, P_ARITH);
if (ttok == &matched_pair_error)
return -1; /* Bail immediately. */
RESIZE_MALLOCED_BUFFER (token, token_index, ttoklen + 3,

View File

@ -1,34 +0,0 @@
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 7
+#define PATCHLEVEL 8
#endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
--- a/subst.c
+++ b/subst.c
@@ -3819,6 +3819,10 @@ pos_params (string, start, end, quoted, pflags)
#define EXP_CHAR(s) (s == '$' || s == '`' || s == CTLESC || s == '~')
#endif
+/* We don't perform process substitution in arithmetic expressions, so don't
+ bother checking for it. */
+#define ARITH_EXP_CHAR(s) (s == '$' || s == '`' || s == CTLESC || s == '~')
+
/* If there are any characters in STRING that require full expansion,
then call FUNC to expand STRING; otherwise just perform quote
removal if necessary. This returns a new string. */
@@ -4028,7 +4032,7 @@ expand_arith_string (string, quoted)
i = saw_quote = 0;
while (string[i])
{
- if (EXP_CHAR (string[i]))
+ if (ARITH_EXP_CHAR (string[i]))
break;
else if (string[i] == '\'' || string[i] == '\\' || string[i] == '"')
saw_quote = string[i];

View File

@ -1,23 +0,0 @@
diff --git a/expr.c b/expr.c
--- a/expr.c
+++ b/expr.c
@@ -1168,6 +1168,8 @@ expr_streval (tok, e, lvalue)
/* [[[[[ */
#if defined (ARRAY_VARS)
aflag = tflag; /* use a different variable for now */
+ if (shell_compatibility_level > 51)
+ aflag |= AV_ATSTARKEYS;
v = (e == ']') ? array_variable_part (tok, tflag, (char **)0, (int *)0) : find_variable (tok);
#else
v = find_variable (tok);
diff --git a/patchlevel.h b/patchlevel.h
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 8
+#define PATCHLEVEL 9
#endif /* _PATCHLEVEL_H_ */

View File

@ -1,186 +0,0 @@
diff --git a/arrayfunc.c b/arrayfunc.c
--- a/arrayfunc.c
+++ b/arrayfunc.c
@@ -208,7 +208,10 @@ bind_assoc_var_internal (entry, hash, key, value, flags)
newval = make_array_variable_value (entry, 0, key, value, flags);
if (entry->assign_func)
- (*entry->assign_func) (entry, newval, 0, key);
+ {
+ (*entry->assign_func) (entry, newval, 0, key);
+ FREE (key);
+ }
else
assoc_insert (hash, key, newval);
@@ -985,6 +988,7 @@ quote_compound_array_word (w, type)
if (t != w+ind)
free (t);
strcpy (nword + i, value);
+ free (value);
return nword;
}
diff --git a/builtins/evalfile.c b/builtins/evalfile.c
--- a/builtins/evalfile.c
+++ b/builtins/evalfile.c
@@ -79,7 +79,8 @@ _evalfile (filename, flags)
{
volatile int old_interactive;
procenv_t old_return_catch;
- int return_val, fd, result, pflags, i, nnull;
+ int return_val, fd, result, pflags, nnull;
+ size_t i;
ssize_t nr; /* return value from read(2) */
char *string;
struct stat finfo;
@@ -112,10 +113,10 @@ _evalfile (filename, flags)
if (fd < 0 || (fstat (fd, &finfo) == -1))
{
- i = errno;
+ result = errno;
if (fd >= 0)
close (fd);
- errno = i;
+ errno = result;
file_error_and_exit:
if (((flags & FEVAL_ENOENTOK) == 0) || errno != ENOENT)
diff --git a/lib/readline/text.c b/lib/readline/text.c
--- a/lib/readline/text.c
+++ b/lib/readline/text.c
@@ -1409,8 +1409,7 @@ rl_change_case (int count, int op)
#if defined (HANDLE_MULTIBYTE)
WCHAR_T wc, nwc;
char mb[MB_LEN_MAX+1];
- int mlen;
- size_t m;
+ size_t m, mlen;
mbstate_t mps;
#endif
@@ -1479,12 +1478,13 @@ rl_change_case (int count, int op)
memset (&ts, 0, sizeof (mbstate_t));
mlen = WCRTOMB (mb, nwc, &ts);
- if (mlen < 0)
+
+ if (MB_INVALIDCH (mlen))
{
nwc = wc;
memset (&ts, 0, sizeof (mbstate_t));
mlen = WCRTOMB (mb, nwc, &ts);
- if (mlen < 0) /* should not happen */
+ if (MB_INVALIDCH (mlen)) /* should not happen */
strncpy (mb, rl_line_buffer + start, mlen = m);
}
if (mlen > 0)
diff --git a/lib/readline/util.c b/lib/readline/util.c
--- a/lib/readline/util.c
+++ b/lib/readline/util.c
@@ -556,7 +556,10 @@ _rl_audit_tty (char *string)
size = strlen (string) + 1;
if (NLMSG_SPACE (size) > MAX_AUDIT_MESSAGE_LENGTH)
- return;
+ {
+ close (fd);
+ return;
+ }
memset (&req, 0, sizeof(req));
req.nlh.nlmsg_len = NLMSG_SPACE (size);
diff --git a/lib/sh/casemod.c b/lib/sh/casemod.c
--- a/lib/sh/casemod.c
+++ b/lib/sh/casemod.c
@@ -111,8 +111,7 @@ sh_modcase (string, pat, flags)
#if defined (HANDLE_MULTIBYTE)
wchar_t nwc;
char mb[MB_LEN_MAX+1];
- int mlen;
- size_t m;
+ size_t m, mlen;
mbstate_t state;
#endif
@@ -254,8 +253,9 @@ singlebyte:
else
{
mlen = wcrtomb (mb, nwc, &state);
- if (mlen > 0)
- mb[mlen] = '\0';
+ if (MB_INVALIDCH (mlen))
+ strncpy (mb, string + start, mlen = m);
+ mb[mlen] = '\0';
/* Don't assume the same width */
strncpy (ret + retind, mb, mlen);
retind += mlen;
diff --git a/lib/sh/zwrite.c b/lib/sh/zwrite.c
--- a/lib/sh/zwrite.c
+++ b/lib/sh/zwrite.c
@@ -41,7 +41,9 @@ zwrite (fd, buf, nb)
char *buf;
size_t nb;
{
- int n, i, nt;
+ int nt;
+ size_t n;
+ ssize_t i;
for (n = nb, nt = 0;;)
{
diff --git a/subst.c b/subst.c
--- a/subst.c
+++ b/subst.c
@@ -4287,12 +4287,17 @@ expand_string_dollar_quote (string, flags)
continue;
}
trans = locale_expand (t, 0, news-sindex, 0, &translen);
- free (t);
if (singlequote_translations &&
((news-sindex-1) != translen || STREQN (t, trans, translen) == 0))
- t = sh_single_quote (trans);
+ {
+ free (t);
+ t = sh_single_quote (trans);
+ }
else
- t = sh_mkdoublequoted (trans, translen, 0);
+ {
+ free (t);
+ t = sh_mkdoublequoted (trans, translen, 0);
+ }
sindex = news;
}
#endif /* TRANSLATABLE_STRINGS */
diff --git a/support/bashbug.sh.in b/support/bashbug.sh.in
--- a/support/bashbug.sh.in
+++ b/support/bashbug.sh.in
@@ -132,9 +132,9 @@ if [ -z "$DEFEDITOR" ] && [ -z "$EDITOR" ]; then
DEFEDITOR=emacs
elif [ -x /usr/bin/xemacs ]; then
DEFEDITOR=xemacs
- elif [ -x /usr/bin/vim; then
+ elif [ -x /usr/bin/vim ]; then
DEFEDITOR=vim
- elif [ -x /usr/bin/gvim; then
+ elif [ -x /usr/bin/gvim ]; then
DEFEDITOR=gvim
elif [ -x /usr/bin/nano ]; then
DEFEDITOR=nano
diff --git a/support/man2html.c b/support/man2html.c
--- a/support/man2html.c
+++ b/support/man2html.c
@@ -809,7 +809,7 @@ out_html(char *c)
} else if (output_possible) {
while (*c) {
outbuffer[obp++] = *c;
- if (*c == '\n' || obp > HUGE_STR_MAX) {
+ if (*c == '\n' || obp >= HUGE_STR_MAX) {
outbuffer[obp] = '\0';
add_links(outbuffer);
obp = 0;
--
2.46.0

View File

@ -1,20 +0,0 @@
Another C compatibility issue: char ** and char * are distinct types,
and strtold expects the former for its second argument.
Submitted upstream:
<https://lists.gnu.org/archive/html/bug-bash/2023-11/msg00104.html>
diff --git a/configure.ac b/configure.ac
index 6defea0835fe8877..955c1149a8141e19 100644
--- a/configure.ac
+++ b/configure.ac
@@ -885,7 +885,7 @@ AC_CHECK_DECLS([strtold], [
[AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM(
[[#include <stdlib.h>]],
- [[long double r; char *foo, bar; r = strtold(foo, &bar);]]
+ [[long double r; char *foo, *bar; r = strtold(foo, &bar);]]
)],
[bash_cv_strtold_broken=no],[bash_cv_strtold_broken=yes])
]

View File

@ -1,21 +0,0 @@
Avoid an implicit declaration of dup2 in its configure probe. This
prevents build issues with future compilers.
Already reported upstream:
<https://lists.gnu.org/archive/html/bug-bash/2023-02/msg00000.html>
diff --git a/aclocal.m4 b/aclocal.m4
index 6162f6eb9ef90754..5cbbe96d7158197a 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -238,6 +238,9 @@ AC_CACHE_VAL(bash_cv_dup2_broken,
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
int
main()
{

Some files were not shown because too many files have changed in this diff Show More