RHEL 9.0.0 Alpha bootstrap

The content of this branch was automatically imported from Fedora ELN
with the following as its source:
https://src.fedoraproject.org/rpms/bash#a6e6d286e4a319b6ca72fd4b4457f11f806f25c1
This commit is contained in:
Petr Šabata 2020-10-14 22:12:16 +02:00
parent de226a4903
commit 33fc6cffab
47 changed files with 4426 additions and 0 deletions

6
.gitignore vendored
View File

@ -0,0 +1,6 @@
bash-4.1.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

16
STAGE1-bash Normal file
View File

@ -0,0 +1,16 @@
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)

11
bash-2.03-paths.patch Normal file
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. */

12
bash-2.03-profile.patch Normal file
View File

@ -0,0 +1,12 @@
diff -up bash-3.2/config-top.h.profile bash-3.2/config-top.h
--- bash-3.2/config-top.h.profile 2008-07-17 13:35:39.000000000 +0200
+++ bash-3.2/config-top.h 2008-07-17 13:42:18.000000000 +0200
@@ -26,6 +26,8 @@
what POSIX.2 specifies. */
#define CONTINUE_AFTER_KILL_ERROR
+#define NON_INTERACTIVE_LOGIN_SHELLS
+
/* Define BREAK_COMPLAINS if you want the non-standard, but useful
error messages about `break' and `continue' out of context. */
#define BREAK_COMPLAINS

View File

@ -0,0 +1,218 @@
diff --git a/config.h.in b/config.h.in
index 0adc903..366e639 100644
--- a/config.h.in
+++ b/config.h.in
@@ -758,6 +758,9 @@
/* Define if you have the pselect function. */
#undef HAVE_PSELECT
+/* Define if you have the pread function. */
+#undef HAVE_PREAD
+
/* Define if you have the putenv function. */
#undef HAVE_PUTENV
@@ -956,6 +959,9 @@
/* Define if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
+/* Define if you have the <elf.h> header file. */
+#undef HAVE_ELF_H
+
/* Define if you have the <grp.h> header file. */
#undef HAVE_GRP_H
diff --git a/configure.ac b/configure.ac
index 2c74f13..4e9c3a4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -782,7 +782,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 select setdtablesize \
- setitimer tcgetpgrp uname ulimit waitpid)
+ setitimer tcgetpgrp uname ulimit waitpid pread)
AC_REPLACE_FUNCS(rename)
dnl checks for c library functions
diff --git a/execute_cmd.c b/execute_cmd.c
index 4eae19c..0af6f8f 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -41,6 +41,10 @@
# include <unistd.h>
#endif
+#ifdef HAVE_ELF_H
+# include <elf.h>
+#endif
+
#include "posixtime.h"
#if defined (HAVE_SYS_RESOURCE_H) && !defined (RLIMTYPE)
@@ -5706,6 +5710,14 @@ shell_execve (command, args, env)
{
/* The file has the execute bits set, but the kernel refuses to
run it for some reason. See why. */
+#if defined (HAVE_HASH_BANG_EXEC) || defined (HAVE_ELF_H)
+ int fd = open (command, O_RDONLY);
+
+ if (fd >= 0)
+ sample_len = read (fd, sample, sizeof (sample));
+ else
+ sample_len = -1;
+#endif
#if defined (HAVE_HASH_BANG_EXEC)
READ_SAMPLE_BUF (command, sample, sample_len);
if (sample_len > 0)
@@ -5715,6 +5727,7 @@ shell_execve (command, args, env)
char *interp;
int ilen;
+ close (fd);
interp = getinterp (sample, sample_len, (int *)NULL);
ilen = strlen (interp);
errno = i;
@@ -5730,7 +5743,138 @@ shell_execve (command, args, env)
return (EX_NOEXEC);
}
#endif
- errno = i;
+#if defined (HAVE_ELF_H)
+ if (i == ENOENT
+ && sample_len > EI_NIDENT
+ && memcmp (sample, ELFMAG, SELFMAG) == 0)
+ {
+ off_t offset = -1;
+
+ /* It is an ELF file. Now determine whether it is dynamically
+ linked and if yes, get the offset of the interpreter
+ string. */
+ if (sample[EI_CLASS] == ELFCLASS32
+ && sample_len > sizeof (Elf32_Ehdr))
+ {
+ Elf32_Ehdr ehdr;
+ Elf32_Phdr *phdr;
+ int nphdr;
+
+ /* We have to copy the data since the sample buffer
+ might not be aligned correctly to be accessed as
+ an Elf32_Ehdr struct. */
+ memcpy (&ehdr, sample, sizeof (Elf32_Ehdr));
+
+ nphdr = ehdr.e_phnum;
+ phdr = (Elf32_Phdr *) malloc (nphdr * ehdr.e_phentsize);
+ if (phdr != NULL)
+ {
+#ifdef HAVE_PREAD
+ sample_len = pread (fd, phdr, nphdr * ehdr.e_phentsize,
+ ehdr.e_phoff);
+#else
+ if (lseek (fd, ehdr.e_phoff, SEEK_SET) != -1)
+ sample_len = read (fd, phdr,
+ nphdr * ehdr.e_phentsize);
+ else
+ sample_len = -1;
+#endif
+ if (sample_len == nphdr * ehdr.e_phentsize)
+ while (nphdr-- > 0)
+ if (phdr[nphdr].p_type == PT_INTERP)
+ {
+ offset = phdr[nphdr].p_offset;
+ break;
+ }
+ free (phdr);
+ }
+ }
+ else if (sample[EI_CLASS] == ELFCLASS64
+ && sample_len > sizeof (Elf64_Ehdr))
+ {
+ Elf64_Ehdr ehdr;
+ Elf64_Phdr *phdr;
+ int nphdr;
+
+ /* We have to copy the data since the sample buffer
+ might not be aligned correctly to be accessed as
+ an Elf64_Ehdr struct. */
+ memcpy (&ehdr, sample, sizeof (Elf64_Ehdr));
+
+ nphdr = ehdr.e_phnum;
+ phdr = (Elf64_Phdr *) malloc (nphdr * ehdr.e_phentsize);
+ if (phdr != NULL)
+ {
+#ifdef HAVE_PREAD
+ sample_len = pread (fd, phdr, nphdr * ehdr.e_phentsize,
+ ehdr.e_phoff);
+#else
+ if (lseek (fd, ehdr.e_phoff, SEEK_SET) != -1)
+ sample_len = read (fd, phdr,
+ nphdr * ehdr.e_phentsize);
+ else
+ sample_len = -1;
+#endif
+ if (sample_len == nphdr * ehdr.e_phentsize)
+ while (nphdr-- > 0)
+ if (phdr[nphdr].p_type == PT_INTERP)
+ {
+ offset = phdr[nphdr].p_offset;
+ break;
+ }
+ free (phdr);
+ }
+ }
+
+ if (offset != -1)
+ {
+ size_t maxlen = 0;
+ size_t actlen = 0;
+ char *interp = NULL;
+
+ do
+ {
+ if (actlen == maxlen)
+ {
+ char *newinterp = realloc (interp, maxlen += 200);
+ if (newinterp == NULL)
+ {
+ actlen = 0;
+ break;
+ }
+ interp = newinterp;
+
+#ifdef HAVE_PREAD
+ actlen = pread (fd, interp, maxlen, offset);
+#else
+ if (lseek (fd, offset, SEEK_SET) != -1)
+ actlen = read (fd, interp, maxlen);
+ else
+ actlen = -1;
+#endif
+ }
+ }
+ while (actlen > 0 && memchr (interp, '\0', actlen) == NULL);
+
+ if (actlen > 0)
+ {
+ close (fd);
+ errno = i;
+ sys_error ("%s: %s: bad ELF interpreter", command,
+ interp);
+ free (interp);
+ return (EX_NOEXEC);
+ }
+
+ free (interp);
+ }
+ }
+#endif
+#if defined (HAVE_HASH_BANG_EXEC) || defined (HAVE_ELF_H)
+ close (fd);
+#endif
+
+ errno = i;
file_error (command);
}
return (last_command_exit_value);
--
2.17.2

View File

@ -0,0 +1,10 @@
--- bash-2.05b/builtins/Makefile.in.debuginfo 2003-03-25 17:25:21.000000000 +0000
+++ bash-2.05b/builtins/Makefile.in 2003-03-25 17:25:49.000000000 +0000
@@ -93,7 +93,6 @@
$(RM) $@
./$(MKBUILTINS) $(DIRECTDEFINE) $<
$(CC) -c $(CCFLAGS) $*.c || ( $(RM) $*.c ; exit 1 )
- $(RM) $*.c
# How to make a .c file from a .def file.
.def.c:

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])
])

96
bash-3.2-audit.patch Normal file
View File

@ -0,0 +1,96 @@
diff -up bash-4.2/config.h.in.audit bash-4.2/config.h.in
--- bash-4.2/config.h.in.audit 2013-01-31 16:26:16.857698992 +0100
+++ bash-4.2/config.h.in 2013-01-31 16:26:16.876699255 +0100
@@ -1131,6 +1131,14 @@
/* End additions for lib/intl */
+
+/* Additions for lib/readline */
+
+/* Define if you have <linux/audit.h> and it defines AUDIT_USER_TTY */
+#undef HAVE_DECL_AUDIT_USER_TTY
+
+/* End additions for lib/readline */
+
#include "config-bot.h"
#endif /* _CONFIG_H_ */
diff -up bash-4.2/configure.in.audit bash-4.2/configure.in
--- bash-4.2/configure.in.audit 2013-01-31 16:26:16.858699005 +0100
+++ bash-4.2/configure.ac 2013-01-31 16:26:16.877699269 +0100
@@ -888,6 +888,8 @@ BASH_FUNC_DUP2_CLOEXEC_CHECK
BASH_SYS_PGRP_SYNC
BASH_SYS_SIGNAL_VINTAGE
+AC_CHECK_DECLS([AUDIT_USER_TTY],,, [[#include <linux/audit.h>]])
+
dnl checking for the presence of certain library symbols
BASH_SYS_ERRLIST
BASH_SYS_SIGLIST
diff -up bash-4.2/lib/readline/readline.c.audit bash-4.2/lib/readline/readline.c
--- bash-4.2/lib/readline/readline.c.audit 2013-01-31 16:26:16.871699185 +0100
+++ bash-4.2/lib/readline/readline.c 2013-01-31 17:24:23.902744860 +0100
@@ -55,6 +55,12 @@
extern int errno;
#endif /* !errno */
+#if defined (HAVE_DECL_AUDIT_USER_TTY)
+# include <sys/socket.h>
+# include <linux/audit.h>
+# include <linux/netlink.h>
+#endif
+
/* System-specific feature definitions and include files. */
#include "rldefs.h"
#include "rlmbutil.h"
@@ -301,7 +307,48 @@ rl_set_prompt (prompt)
rl_visible_prompt_length = rl_expand_prompt (rl_prompt);
return 0;
}
-
+
+#if defined (HAVE_DECL_AUDIT_USER_TTY)
+/* Report STRING to the audit system. */
+static void
+audit_tty (char *string)
+{
+ struct sockaddr_nl addr;
+ struct msghdr msg;
+ struct nlmsghdr nlm;
+ struct iovec iov[2];
+ size_t size;
+ int fd;
+
+ size = strlen (string) + 1;
+ fd = socket (AF_NETLINK, SOCK_RAW, NETLINK_AUDIT);
+ if (fd < 0)
+ return;
+ nlm.nlmsg_len = NLMSG_LENGTH (size);
+ nlm.nlmsg_type = AUDIT_USER_TTY;
+ nlm.nlmsg_flags = NLM_F_REQUEST;
+ nlm.nlmsg_seq = 0;
+ nlm.nlmsg_pid = 0;
+ iov[0].iov_base = &nlm;
+ iov[0].iov_len = sizeof (nlm);
+ iov[1].iov_base = string;
+ iov[1].iov_len = size;
+ addr.nl_family = AF_NETLINK;
+ addr.nl_pad = 0;
+ addr.nl_pid = 0;
+ addr.nl_groups = 0;
+ msg.msg_name = &addr;
+ msg.msg_namelen = sizeof (addr);
+ msg.msg_iov = iov;
+ msg.msg_iovlen = 2;
+ msg.msg_control = NULL;
+ msg.msg_controllen = 0;
+ msg.msg_flags = 0;
+ (void)sendmsg (fd, &msg, 0);
+ close (fd);
+}
+#endif
+
/* Read a line of input. Prompt with PROMPT. An empty PROMPT means
none. A return value of NULL means that EOF was encountered. */
char *

View File

@ -0,0 +1,12 @@
diff -up bash-4.0/config-top.h.ssh_source_bash bash-4.0/config-top.h
--- bash-4.0/config-top.h.ssh_source_bash 2009-01-21 15:20:06.000000000 +0100
+++ bash-4.0/config-top.h 2009-01-21 15:25:46.000000000 +0100
@@ -90,7 +90,7 @@
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,
which can be fooled under certain not-uncommon circumstances. */
-/* #define SSH_SOURCE_BASHRC */
+#define SSH_SOURCE_BASHRC
/* Define if you want the case-capitalizing operators (~[~]) and the
`capcase' variable attribute (declare -c). */

154
bash-4.0-nobits.patch Normal file
View File

@ -0,0 +1,154 @@
diff -up bash-4.0/execute_cmd.c.nobits bash-4.0/execute_cmd.c
--- bash-4.0/execute_cmd.c.nobits 2009-08-11 11:53:38.000000000 +0200
+++ bash-4.0/execute_cmd.c 2009-08-14 16:18:18.000000000 +0200
@@ -4747,6 +4747,7 @@ shell_execve (command, args, env)
&& memcmp (sample, ELFMAG, SELFMAG) == 0)
{
off_t offset = -1;
+ int dynamic_nobits = 0;
/* It is an ELF file. Now determine whether it is dynamically
linked and if yes, get the offset of the interpreter
@@ -4756,13 +4757,61 @@ shell_execve (command, args, env)
{
Elf32_Ehdr ehdr;
Elf32_Phdr *phdr;
- int nphdr;
+ Elf32_Shdr *shdr;
+ int nphdr, nshdr;
/* We have to copy the data since the sample buffer
might not be aligned correctly to be accessed as
an Elf32_Ehdr struct. */
memcpy (&ehdr, sample, sizeof (Elf32_Ehdr));
+ nshdr = ehdr.e_shnum;
+ shdr = (Elf32_Shdr *) malloc (nshdr * ehdr.e_shentsize);
+
+ if (shdr != NULL)
+ {
+#ifdef HAVE_PREAD
+ sample_len = pread (fd, shdr, nshdr * ehdr.e_shentsize,
+ ehdr.e_shoff);
+#else
+ if (lseek (fd, ehdr.e_shoff, SEEK_SET) != -1)
+ sample_len = read (fd, shdr,
+ nshdr * ehdr.e_shentsize);
+ else
+ sample_len = -1;
+#endif
+ if (sample_len == nshdr * ehdr.e_shentsize)
+ {
+ char *strings = (char *) malloc (shdr[ehdr.e_shstrndx].sh_size);
+ if (strings != NULL)
+ {
+#ifdef HAVE_PREAD
+ sample_len = pread (fd, strings,
+ shdr[ehdr.e_shstrndx].sh_size,
+ shdr[ehdr.e_shstrndx].sh_offset);
+#else
+ if (lseek (fd, shdr[ehdr.e_shstrndx].sh_offset,
+ SEEK_SET) != -1)
+ sample_len = read (fd, strings,
+ shdr[ehdr.e_shstrndx].sh_size);
+ else
+ sample_len = -1;
+#endif
+ if (sample_len == shdr[ehdr.e_shstrndx].sh_size)
+ while (nshdr-- > 0)
+ if (strcmp (strings + shdr[nshdr].sh_name,
+ ".interp") == 0 &&
+ shdr[nshdr].sh_type == SHT_NOBITS)
+ {
+ dynamic_nobits++;
+ break;
+ }
+ free (strings);
+ }
+ }
+ free (shdr);
+ }
+
nphdr = ehdr.e_phnum;
phdr = (Elf32_Phdr *) malloc (nphdr * ehdr.e_phentsize);
if (phdr != NULL)
@@ -4792,13 +4841,60 @@ shell_execve (command, args, env)
{
Elf64_Ehdr ehdr;
Elf64_Phdr *phdr;
- int nphdr;
+ Elf64_Shdr *shdr;
+ int nphdr, nshdr;
/* We have to copy the data since the sample buffer
might not be aligned correctly to be accessed as
an Elf64_Ehdr struct. */
memcpy (&ehdr, sample, sizeof (Elf64_Ehdr));
+ nshdr = ehdr.e_shnum;
+ shdr = (Elf64_Shdr *) malloc (nshdr * ehdr.e_shentsize);
+ if (shdr != NULL)
+ {
+#ifdef HAVE_PREAD
+ sample_len = pread (fd, shdr, nshdr * ehdr.e_shentsize,
+ ehdr.e_shoff);
+#else
+ if (lseek (fd, ehdr.e_shoff, SEEK_SET) != -1)
+ sample_len = read (fd, shdr,
+ nshdr * ehdr.e_shentsize);
+ else
+ sample_len = -1;
+#endif
+ if (sample_len == nshdr * ehdr.e_shentsize)
+ {
+ char *strings = (char *) malloc (shdr[ehdr.e_shstrndx].sh_size);
+ if (strings != NULL)
+ {
+#ifdef HAVE_PREAD
+ sample_len = pread (fd, strings,
+ shdr[ehdr.e_shstrndx].sh_size,
+ shdr[ehdr.e_shstrndx].sh_offset);
+#else
+ if (lseek (fd, shdr[ehdr.e_shstrndx].sh_offset,
+ SEEK_SET) != -1)
+ sample_len = read (fd, strings,
+ shdr[ehdr.e_shstrndx].sh_size);
+ else
+ sample_len = -1;
+#endif
+ if (sample_len == shdr[ehdr.e_shstrndx].sh_size)
+ while (nshdr-- > 0)
+ if (strcmp (strings + shdr[nshdr].sh_name,
+ ".interp") == 0 &&
+ shdr[nshdr].sh_type == SHT_NOBITS)
+ {
+ dynamic_nobits++;
+ break;
+ }
+ free (strings);
+ }
+ }
+ free (shdr);
+ }
+
nphdr = ehdr.e_phnum;
phdr = (Elf64_Phdr *) malloc (nphdr * ehdr.e_phentsize);
if (phdr != NULL)
@@ -4858,8 +4954,15 @@ shell_execve (command, args, env)
{
close (fd);
errno = i;
- sys_error ("%s: %s: bad ELF interpreter", command,
- interp);
+ if (dynamic_nobits > 0)
+ {
+ sys_error ("%s: bad ELF interpreter", command);
+ }
+ else
+ {
+ sys_error ("%s: %s: bad ELF interpreter", command,
+ interp);
+ }
free (interp);
return (EX_NOEXEC);
}

View File

@ -0,0 +1,12 @@
diff -up bash-4.1/config-top.h.broken_pipe bash-4.1/config-top.h
--- bash-4.1/config-top.h.broken_pipe 2011-01-06 18:01:30.000000000 +0100
+++ bash-4.1/config-top.h 2011-01-06 18:02:14.000000000 +0100
@@ -51,7 +51,7 @@
/* Define DONT_REPORT_BROKEN_PIPE_WRITE_ERRORS if you don't want builtins
like `echo' and `printf' to report errors when output does not succeed
due to EPIPE. */
-/* #define DONT_REPORT_BROKEN_PIPE_WRITE_ERRORS */
+#define DONT_REPORT_BROKEN_PIPE_WRITE_ERRORS
/* The default value of the PATH variable. */
#ifndef DEFAULT_PATH_VALUE

24
bash-4.1-examples.patch Normal file
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.

103
bash-4.2-coverity.patch Normal file
View File

@ -0,0 +1,103 @@
diff --git a/execute_cmd.c b/execute_cmd.c
index a988400..412128c 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -5760,7 +5760,7 @@ shell_execve (command, args, env)
Elf32_Ehdr ehdr;
Elf32_Phdr *phdr;
Elf32_Shdr *shdr;
- int nphdr, nshdr;
+ Elf32_Half nphdr, nshdr;
/* We have to copy the data since the sample buffer
might not be aligned correctly to be accessed as
@@ -5768,12 +5768,12 @@ shell_execve (command, args, env)
memcpy (&ehdr, sample, sizeof (Elf32_Ehdr));
nshdr = ehdr.e_shnum;
- shdr = (Elf32_Shdr *) malloc (nshdr * ehdr.e_shentsize);
+ shdr = (Elf32_Shdr *) malloc ((size_t)nshdr * (size_t)ehdr.e_shentsize);
if (shdr != NULL)
{
#ifdef HAVE_PREAD
- sample_len = pread (fd, shdr, nshdr * ehdr.e_shentsize,
+ sample_len = pread (fd, shdr, (size_t)nshdr * (size_t)ehdr.e_shentsize,
ehdr.e_shoff);
#else
if (lseek (fd, ehdr.e_shoff, SEEK_SET) != -1)
@@ -5815,11 +5815,11 @@ shell_execve (command, args, env)
}
nphdr = ehdr.e_phnum;
- phdr = (Elf32_Phdr *) malloc (nphdr * ehdr.e_phentsize);
+ phdr = (Elf32_Phdr *) malloc ((size_t)nphdr * (size_t)ehdr.e_phentsize);
if (phdr != NULL)
{
#ifdef HAVE_PREAD
- sample_len = pread (fd, phdr, nphdr * ehdr.e_phentsize,
+ sample_len = pread (fd, phdr, (size_t)nphdr * (size_t)ehdr.e_phentsize,
ehdr.e_phoff);
#else
if (lseek (fd, ehdr.e_phoff, SEEK_SET) != -1)
@@ -5844,7 +5844,7 @@ shell_execve (command, args, env)
Elf64_Ehdr ehdr;
Elf64_Phdr *phdr;
Elf64_Shdr *shdr;
- int nphdr, nshdr;
+ Elf32_Half nphdr, nshdr;
/* We have to copy the data since the sample buffer
might not be aligned correctly to be accessed as
@@ -5852,11 +5852,11 @@ shell_execve (command, args, env)
memcpy (&ehdr, sample, sizeof (Elf64_Ehdr));
nshdr = ehdr.e_shnum;
- shdr = (Elf64_Shdr *) malloc (nshdr * ehdr.e_shentsize);
+ shdr = (Elf64_Shdr *) malloc ((size_t)nshdr * (size_t)ehdr.e_shentsize);
if (shdr != NULL)
{
#ifdef HAVE_PREAD
- sample_len = pread (fd, shdr, nshdr * ehdr.e_shentsize,
+ sample_len = pread (fd, shdr, (size_t)nshdr * (size_t)ehdr.e_shentsize,
ehdr.e_shoff);
#else
if (lseek (fd, ehdr.e_shoff, SEEK_SET) != -1)
@@ -5898,11 +5898,11 @@ shell_execve (command, args, env)
}
nphdr = ehdr.e_phnum;
- phdr = (Elf64_Phdr *) malloc (nphdr * ehdr.e_phentsize);
+ phdr = (Elf64_Phdr *) malloc ((size_t)nphdr * (size_t)ehdr.e_phentsize);
if (phdr != NULL)
{
#ifdef HAVE_PREAD
- sample_len = pread (fd, phdr, nphdr * ehdr.e_phentsize,
+ sample_len = pread (fd, phdr, (size_t)nphdr * (size_t)ehdr.e_phentsize,
ehdr.e_phoff);
#else
if (lseek (fd, ehdr.e_phoff, SEEK_SET) != -1)
@@ -5924,8 +5924,8 @@ shell_execve (command, args, env)
if (offset != -1)
{
- size_t maxlen = 0;
- size_t actlen = 0;
+ ssize_t maxlen = 0;
+ ssize_t actlen = 0;
char *interp = NULL;
do
@@ -5974,7 +5974,8 @@ shell_execve (command, args, env)
}
#endif
#if defined (HAVE_HASH_BANG_EXEC) || defined (HAVE_ELF_H)
- close (fd);
+ if (fd >= 0)
+ close (fd);
#endif
errno = i;
--
2.17.2

View File

@ -0,0 +1,12 @@
diff -up bash-4.1/doc/bash.1.manpage_trap bash-4.1/doc/bash.1
--- bash-4.1/doc/bash.1.manpage_trap 2012-08-28 10:06:00.561999092 +0200
+++ bash-4.1/doc/bash.1 2012-08-28 10:06:24.225304505 +0200
@@ -9251,7 +9251,7 @@ being inverted via
These are the same conditions obeyed by the \fBerrexit\fP (\fB\-e\fP) option.
.if t .sp 0.5
.if n .sp 1
-Signals ignored upon entry to the shell cannot be trapped or reset.
+Signals ignored upon entry to the shell cannot be trapped, reset or listed.
Trapped signals that are not being ignored are reset to their original
values in a subshell or subshell environment when one is created.
The return status is false if any

41
bash-4.2-rc2-logout.patch Normal file
View File

@ -0,0 +1,41 @@
diff --git a/config-top.h b/config-top.h
index 026d4a4..cb0e002 100644
--- a/config-top.h
+++ b/config-top.h
@@ -92,7 +92,7 @@
/* #define SYS_BASHRC "/etc/bash.bashrc" */
/* System-wide .bash_logout for login shells. */
-/* #define SYS_BASH_LOGOUT "/etc/bash.bash_logout" */
+#define SYS_BASH_LOGOUT "/etc/bash.bash_logout"
/* Define this to make non-interactive shells begun with argv[0][0] == '-'
run the startup files when not in posix mode. */
diff --git a/doc/bash.1 b/doc/bash.1
index 04ce845..bfde55e 100644
--- a/doc/bash.1
+++ b/doc/bash.1
@@ -335,8 +335,8 @@ option may be used when the shell is started to inhibit this behavior.
When an interactive login shell exits,
or a non-interactive login shell executes the \fBexit\fP builtin command,
.B bash
-reads and executes commands from the file \fI~/.bash_logout\fP, if it
-exists.
+reads and executes commands from the files \fI~/.bash_logout\fP
+and \fI/etc/bash.bash_logout\fP, if the files exists.
.PP
When an interactive shell that is not a login shell is started,
.B bash
@@ -10558,6 +10558,9 @@ The \fBbash\fP executable
.FN /etc/profile
The systemwide initialization file, executed for login shells
.TP
+.FN /etc/bash.bash_logout
+The systemwide login shell cleanup file, executed when a login shell exits
+.TP
.FN ~/.bash_profile
The personal initialization file, executed for login shells
.TP
--
2.9.3

14
bash-4.2-size_type.patch Normal file
View File

@ -0,0 +1,14 @@
diff -up bash-4.2/variables.h.size_type bash-4.2/variables.h
--- bash-4.2/variables.h.size_type 2012-11-29 10:33:25.109036844 +0100
+++ bash-4.2/variables.h 2012-11-29 10:46:12.718530162 +0100
@@ -95,8 +95,8 @@ typedef struct variable {
typedef struct _vlist {
SHELL_VAR **list;
- int list_size; /* allocated size */
- int list_len; /* current number of entries */
+ size_t list_size; /* allocated size */
+ size_t list_len; /* current number of entries */
} VARLIST;
/* The various attributes that a given variable can have. */

15
bash-4.3-man-ulimit.patch Normal file
View File

@ -0,0 +1,15 @@
diff --git a/doc/bash.1 b/doc/bash.1
index 6e8aebb..e846e68 100644
--- a/doc/bash.1
+++ b/doc/bash.1
@@ -10333,6 +10333,7 @@ and
which are in 512-byte increments.
The return status is 0 unless an invalid option or argument is supplied,
or an error occurs while setting a new limit.
+In POSIX Mode 512-byte blocks are used for the `-c' and `-f' options.
.RE
.TP
\fBumask\fP [\fB\-p\fP] [\fB\-S\fP] [\fImode\fP]
--
2.9.3

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);

46
bash-4.3-noecho.patch Normal file
View File

@ -0,0 +1,46 @@
diff --git a/parse.y b/parse.y
index 07e6e3e..4cd373f 100644
--- a/parse.y
+++ b/parse.y
@@ -4410,6 +4410,8 @@ xparse_dolparen (base, string, indp, flags)
save_parser_state (&ps);
save_input_line_state (&ls);
orig_eof_token = shell_eof_token;
+ /* avoid echoing every substitution again */
+ echo_input_at_read = 0;
#if defined (ALIAS) || defined (DPAREN_ARITHMETIC)
saved_pushed_strings = pushed_string_list; /* separate parsing context */
pushed_string_list = (STRING_SAVER *)NULL;
diff --git a/subst.c b/subst.c
index 9559187..0c2caa6 100644
--- a/subst.c
+++ b/subst.c
@@ -9145,6 +9145,7 @@ param_expand (string, sindex, quoted, expanded_something,
WORD_LIST *list;
WORD_DESC *tdesc, *ret;
int tflag;
+ int old_echo_input;
/*itrace("param_expand: `%s' pflags = %d", string+*sindex, pflags);*/
zindex = *sindex;
@@ -9514,6 +9515,9 @@ arithsub:
}
comsub:
+ old_echo_input = echo_input_at_read;
+ /* avoid echoing every substitution again */
+ echo_input_at_read = 0;
if (pflags & PF_NOCOMSUB)
/* we need zindex+1 because string[zindex] == RPAREN */
temp1 = substring (string, *sindex, zindex+1);
@@ -9526,6 +9530,7 @@ comsub:
}
FREE (temp);
temp = temp1;
+ echo_input_at_read = old_echo_input;
break;
/* Do POSIX.2d9-style arithmetic substitution. This will probably go
--
2.17.2

View File

@ -0,0 +1,15 @@
diff --git a/Makefile.in b/Makefile.in
index a1f9483..24c646a 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -800,7 +800,6 @@ install: .made installdirs
infodir=$(infodir) htmldir=$(htmldir) DESTDIR=$(DESTDIR) $@ )
-( cd $(DEFDIR) ; $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) $@ )
-( cd $(PO_DIR) ; $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) $@ )
- -( cd $(LOADABLES_DIR) && $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) $@ )
install-strip:
$(MAKE) $(MFLAGS) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
--
2.9.3

150
bash-5.0-patch-1.patch Normal file
View File

@ -0,0 +1,150 @@
From 4d2e315490b778707b3a3afdfc514d5083a97a11 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 18 Jan 2019 15:12:37 -0500
Subject: [PATCH] Bash-5.0 patch 1: fix pathname expansion of directory names
containing backslashes
---
bashline.c | 62 +++++++++++++++++++++++++++++++++++++++++---
lib/glob/glob_loop.c | 6 -----
patchlevel.h | 2 +-
3 files changed, 60 insertions(+), 10 deletions(-)
diff --git a/bashline.c b/bashline.c
index 2846aabf..75e79f1a 100644
--- a/bashline.c
+++ b/bashline.c
@@ -231,6 +231,7 @@ static int bash_possible_variable_completions __P((int, int));
static int bash_complete_command __P((int, int));
static int bash_possible_command_completions __P((int, int));
+static int completion_glob_pattern __P((char *));
static char *glob_complete_word __P((const char *, int));
static int bash_glob_completion_internal __P((int));
static int bash_glob_complete_word __P((int, int));
@@ -1741,7 +1742,7 @@ bash_default_completion (text, start, end, qc, compflags)
/* This could be a globbing pattern, so try to expand it using pathname
expansion. */
- if (!matches && glob_pattern_p (text))
+ if (!matches && completion_glob_pattern ((char *)text))
{
matches = rl_completion_matches (text, glob_complete_word);
/* A glob expression that matches more than one filename is problematic.
@@ -1850,7 +1851,7 @@ command_word_completion_function (hint_text, state)
glob_matches = (char **)NULL;
}
- globpat = glob_pattern_p (hint_text);
+ globpat = completion_glob_pattern ((char *)hint_text);
/* If this is an absolute program name, do not check it against
aliases, reserved words, functions or builtins. We must check
@@ -3713,6 +3714,61 @@ bash_complete_command_internal (what_to_do)
return bash_specific_completion (what_to_do, command_word_completion_function);
}
+static int
+completion_glob_pattern (string)
+ char *string;
+{
+ register int c;
+ char *send;
+ int open;
+
+ DECLARE_MBSTATE;
+
+ open = 0;
+ send = string + strlen (string);
+
+ while (c = *string++)
+ {
+ switch (c)
+ {
+ case '?':
+ case '*':
+ return (1);
+
+ case '[':
+ open++;
+ continue;
+
+ case ']':
+ if (open)
+ return (1);
+ continue;
+
+ case '+':
+ case '@':
+ case '!':
+ if (*string == '(') /*)*/
+ return (1);
+ continue;
+
+ case '\\':
+ if (*string == 0)
+ return (0);
+ }
+
+ /* Advance one fewer byte than an entire multibyte character to
+ account for the auto-increment in the loop above. */
+#ifdef HANDLE_MULTIBYTE
+ string--;
+ ADVANCE_CHAR_P (string, send - string);
+ string++;
+#else
+ ADVANCE_CHAR_P (string, send - string);
+#endif
+ }
+ return (0);
+}
+
static char *globtext;
static char *globorig;
@@ -3877,7 +3933,7 @@ bash_vi_complete (count, key)
t = substring (rl_line_buffer, p, rl_point);
}
- if (t && glob_pattern_p (t) == 0)
+ if (t && completion_glob_pattern (t) == 0)
rl_explicit_arg = 1; /* XXX - force glob_complete_word to append `*' */
FREE (t);
diff --git a/lib/glob/glob_loop.c b/lib/glob/glob_loop.c
index 5f319cc2..7d6ae211 100644
--- a/lib/glob/glob_loop.c
+++ b/lib/glob/glob_loop.c
@@ -54,17 +54,11 @@ INTERNAL_GLOB_PATTERN_P (pattern)
continue;
case L('\\'):
-#if 0
/* Don't let the pattern end in a backslash (GMATCH returns no match
if the pattern ends in a backslash anyway), but otherwise return 1,
since the matching engine uses backslash as an escape character
and it can be removed. */
return (*p != L('\0'));
-#else
- /* The pattern may not end with a backslash. */
- if (*p++ == L('\0'))
- return 0;
-#endif
}
return 0;
diff --git a/patchlevel.h b/patchlevel.h
index 1cd7c96c..40db1a32 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.17.2

116
bash-5.0-patch-10.patch Normal file
View File

@ -0,0 +1,116 @@
From 6a3116f58c876ca58a786f0ddff578ecf126588e Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Thu, 29 Aug 2019 11:20:15 -0400
Subject: [PATCH] Bash-5.0 patch 10: changes to posix-mode assignment
statements preceding functions and special builtins
---
patchlevel.h | 2 +-
tests/varenv.right | 6 +++---
variables.c | 38 ++++++++++++++++++++++++++------------
3 files changed, 30 insertions(+), 16 deletions(-)
diff --git a/patchlevel.h b/patchlevel.h
index 02f1d606..8002af70 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_ */
diff --git a/tests/varenv.right b/tests/varenv.right
index 159a8773..ca7d4cf1 100644
--- a/tests/varenv.right
+++ b/tests/varenv.right
@@ -146,9 +146,9 @@ declare -x foo="abc"
inside: declare -x var="value"
outside: declare -- var="one"
inside: declare -x var="value"
-outside: declare -x var="value"
-inside: declare -- var="local"
-outside: declare -x var="global"
+outside: declare -- var="outside"
+inside: declare -x var="global"
+outside: declare -- var="outside"
foo=<unset> environment foo=
foo=foo environment foo=foo
foo=foo environment foo=foo
diff --git a/variables.c b/variables.c
index 610629ab..af3fd04a 100644
--- a/variables.c
+++ b/variables.c
@@ -4460,9 +4460,9 @@ char **tempvar_list;
int tvlist_ind;
/* Take a variable from an assignment statement preceding a posix special
- builtin (including `return') and create a global variable from it. This
- is called from merge_temporary_env, which is only called when in posix
- mode. */
+ builtin (including `return') and create a variable from it as if a
+ standalone assignment statement had been performed. This is called from
+ merge_temporary_env, which is only called when in posix mode. */
static void
push_posix_temp_var (data)
PTR_T data;
@@ -4472,16 +4472,27 @@ push_posix_temp_var (data)
var = (SHELL_VAR *)data;
- binding_table = global_variables->table;
- if (binding_table == 0)
- binding_table = global_variables->table = hash_create (VARIABLES_HASH_BUCKETS);
+ /* Just like do_assignment_internal(). This makes assignments preceding
+ special builtins act like standalone assignment statements when in
+ posix mode, satisfying the posix requirement that this affect the
+ "current execution environment." */
+ v = bind_variable (var->name, value_cell (var), ASS_FORCE|ASS_NOLONGJMP);
- v = bind_variable_internal (var->name, value_cell (var), binding_table, 0, ASS_FORCE|ASS_NOLONGJMP);
+ /* If this modifies an existing local variable, v->context will be non-zero.
+ If it comes back with v->context == 0, we bound at the global context.
+ Set binding_table appropriately. It doesn't matter whether it's correct
+ if the variable is local, only that it's not global_variables->table */
+ binding_table = v->context ? shell_variables->table : global_variables->table;
/* global variables are no longer temporary and don't need propagating. */
- var->attributes &= ~(att_tempvar|att_propagate);
+ if (binding_table == global_variables->table)
+ var->attributes &= ~(att_tempvar|att_propagate);
+
if (v)
- v->attributes |= var->attributes;
+ {
+ v->attributes |= var->attributes;
+ v->attributes &= ~att_tempvar; /* not a temp var now */
+ }
if (find_special_var (var->name) >= 0)
tempvar_list[tvlist_ind++] = savestring (var->name);
@@ -4575,14 +4586,17 @@ dispose_temporary_env (pushf)
sh_free_func_t *pushf;
{
int i;
+ HASH_TABLE *disposer;
tempvar_list = strvec_create (HASH_ENTRIES (temporary_env) + 1);
tempvar_list[tvlist_ind = 0] = 0;
-
- hash_flush (temporary_env, pushf);
- hash_dispose (temporary_env);
+
+ disposer = temporary_env;
temporary_env = (HASH_TABLE *)NULL;
+ hash_flush (disposer, pushf);
+ hash_dispose (disposer);
+
tempvar_list[tvlist_ind] = 0;
array_needs_making = 1;
--
2.21.0

50
bash-5.0-patch-11.patch Normal file
View File

@ -0,0 +1,50 @@
From d894cfd104086ddf68c286e67a5fb2e02eb43b7b Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Thu, 29 Aug 2019 11:21:20 -0400
Subject: [PATCH] Bash-5.0 patch 11: fix quoted null character removal in
operands of conditional ([[) commands
---
patchlevel.h | 2 +-
subst.c | 6 +++++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/patchlevel.h b/patchlevel.h
index 8002af70..772676c8 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/subst.c b/subst.c
index 95591878..fd6db240 100644
--- a/subst.c
+++ b/subst.c
@@ -3625,7 +3625,9 @@ remove_backslashes (string)
this case, we quote the string specially for the globbing code. If
SPECIAL is 2, this is an rhs argument for the =~ operator, and should
be quoted appropriately for regcomp/regexec. The caller is responsible
- for removing the backslashes if the unquoted word is needed later. */
+ for removing the backslashes if the unquoted word is needed later. In
+ any case, since we don't perform word splitting, we need to do quoted
+ null character removal. */
char *
cond_expand_word (w, special)
WORD_DESC *w;
@@ -3646,6 +3648,8 @@ cond_expand_word (w, special)
{
if (special == 0) /* LHS */
{
+ if (l->word)
+ word_list_remove_quoted_nulls (l);
dequote_list (l);
r = string_list (l);
}
--
2.21.0

56
bash-5.0-patch-12.patch Normal file
View File

@ -0,0 +1,56 @@
From b0852fb54efbcee630847fcfdc435133f82043b9 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 7 Feb 2020 15:16:28 -0500
Subject: [PATCH] Bash-5.0 patch 12: fix problems moving back beyond start of
history
---
lib/readline/misc.c | 5 ++++-
patchlevel.h | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/lib/readline/misc.c b/lib/readline/misc.c
index 64b1457d..42005b0c 100644
--- a/lib/readline/misc.c
+++ b/lib/readline/misc.c
@@ -576,6 +576,7 @@ int
rl_get_previous_history (int count, int key)
{
HIST_ENTRY *old_temp, *temp;
+ int had_saved_line;
if (count < 0)
return (rl_get_next_history (-count, key));
@@ -588,6 +589,7 @@ rl_get_previous_history (int count, int key)
_rl_history_saved_point = (rl_point == rl_end) ? -1 : rl_point;
/* If we don't have a line saved, then save this one. */
+ had_saved_line = _rl_saved_line_for_history != 0;
rl_maybe_save_line ();
/* If the current line has changed, save the changes. */
@@ -611,7 +613,8 @@ rl_get_previous_history (int count, int key)
if (temp == 0)
{
- rl_maybe_unsave_line ();
+ if (had_saved_line == 0)
+ _rl_free_saved_history_line ();
rl_ding ();
}
else
diff --git a/patchlevel.h b/patchlevel.h
index 772676c8..93dbe0db 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_ */
--
2.25.1

62
bash-5.0-patch-13.patch Normal file
View File

@ -0,0 +1,62 @@
From f747f9ff4c8aed2d51fa54db3cb10e8118034753 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 7 Feb 2020 15:17:29 -0500
Subject: [PATCH] Bash-5.0 patch 13: reading history entries with timestamps
can result in joined entries
---
lib/readline/histfile.c | 15 ++++++++++++++-
patchlevel.h | 2 +-
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/lib/readline/histfile.c b/lib/readline/histfile.c
index a8a92aa3..6c3adc9b 100644
--- a/lib/readline/histfile.c
+++ b/lib/readline/histfile.c
@@ -369,9 +369,11 @@ read_history_range (const char *filename, int from, int to)
}
has_timestamps = HIST_TIMESTAMP_START (buffer);
- history_multiline_entries += has_timestamps && history_write_timestamps;
+ history_multiline_entries += has_timestamps && history_write_timestamps;
/* Skip lines until we are at FROM. */
+ if (has_timestamps)
+ last_ts = buffer;
for (line_start = line_end = buffer; line_end < bufend && current_line < from; line_end++)
if (*line_end == '\n')
{
@@ -380,7 +382,18 @@ read_history_range (const char *filename, int from, int to)
line. We should check more extensively here... */
if (HIST_TIMESTAMP_START(p) == 0)
current_line++;
+ else
+ last_ts = p;
line_start = p;
+ /* If we are at the last line (current_line == from) but we have
+ timestamps (has_timestamps), then line_start points to the
+ text of the last command, and we need to skip to its end. */
+ if (current_line >= from && has_timestamps)
+ {
+ for (line_end = p; line_end < bufend && *line_end != '\n'; line_end++)
+ ;
+ line_start = (*line_end == '\n') ? line_end + 1 : line_end;
+ }
}
/* If there are lines left to gobble, then gobble them now. */
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_ */
--
2.25.1

44
bash-5.0-patch-14.patch Normal file
View File

@ -0,0 +1,44 @@
From 8b6524c482573ea12eb20be756cdb8ca31d945f3 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 7 Feb 2020 15:18:41 -0500
Subject: [PATCH] Bash-5.0 patch 14: edit-and-execute-command does not handle
empty command lines
---
bashline.c | 7 ++-----
patchlevel.h | 2 +-
2 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/bashline.c b/bashline.c
index 824ea9d9..97adaa0f 100644
--- a/bashline.c
+++ b/bashline.c
@@ -961,11 +961,8 @@ edit_and_execute_command (count, c, editing_mode, edit_command)
/* This breaks down when using command-oriented history and are not
finished with the command, so we should not ignore the last command */
using_history ();
- if (rl_line_buffer[0])
- {
- current_command_line_count++; /* for rl_newline above */
- bash_add_history (rl_line_buffer);
- }
+ current_command_line_count++; /* for rl_newline above */
+ bash_add_history (rl_line_buffer);
current_command_line_count = 0; /* for dummy history entry */
bash_add_history ("");
history_lines_this_session++;
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.25.1

64
bash-5.0-patch-15.patch Normal file
View File

@ -0,0 +1,64 @@
From ad1b3e68229273b4983b607c5eeb56551536c583 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 7 Feb 2020 15:19:53 -0500
Subject: [PATCH] Bash-5.0 patch 15: aliases and -c commands can cause
premature termination
---
builtins/evalstring.c | 6 ++++--
patchlevel.h | 2 +-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/builtins/evalstring.c b/builtins/evalstring.c
index cadc9bc0..2f13a66a 100644
--- a/builtins/evalstring.c
+++ b/builtins/evalstring.c
@@ -91,6 +91,7 @@ should_suppress_fork (command)
return (startup_state == 2 && parse_and_execute_level == 1 &&
running_trap == 0 &&
*bash_input.location.string == '\0' &&
+ parser_expanding_alias () == 0 &&
command->type == cm_simple &&
signal_is_trapped (EXIT_TRAP) == 0 &&
signal_is_trapped (ERROR_TRAP) == 0 &&
@@ -105,6 +106,7 @@ can_optimize_connection (command)
COMMAND *command;
{
return (*bash_input.location.string == '\0' &&
+ parser_expanding_alias () == 0 &&
(command->value.Connection->connector == AND_AND || command->value.Connection->connector == OR_OR || command->value.Connection->connector == ';') &&
command->value.Connection->second->type == cm_simple);
}
@@ -290,7 +292,7 @@ parse_and_execute (string, from_file, flags)
with_input_from_string (string, from_file);
clear_shell_input_line ();
- while (*(bash_input.location.string))
+ while (*(bash_input.location.string) || parser_expanding_alias ())
{
command = (COMMAND *)NULL;
@@ -545,7 +547,7 @@ parse_string (string, from_file, flags, endp)
ostring = string;
with_input_from_string (string, from_file);
- while (*(bash_input.location.string))
+ while (*(bash_input.location.string)) /* XXX - parser_expanding_alias () ? */
{
command = (COMMAND *)NULL;
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_ */
--
2.25.1

53
bash-5.0-patch-16.patch Normal file
View File

@ -0,0 +1,53 @@
From 6c6454cb18d7cd30b3b26d5ba6479431e599f3ed Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 7 Feb 2020 15:20:38 -0500
Subject: [PATCH] Bash-5.0 patch 16: bash waits too long to reap /dev/fd
process substitutions with loops and group commands
---
execute_cmd.c | 16 ++++++++++++++++
patchlevel.h | 2 +-
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/execute_cmd.c b/execute_cmd.c
index f1d74bfe..3864986d 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -1103,6 +1103,22 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
free ((void *)ofifo_list);
discard_unwind_frame ("internal_fifos");
}
+# if defined (HAVE_DEV_FD)
+ /* Reap process substitutions at the end of loops */
+ switch (command->type)
+ {
+ case cm_while:
+ case cm_until:
+ case cm_for:
+ case cm_group:
+# if defined (ARITH_FOR_COMMAND)
+ case cm_arith_for:
+# endif
+ reap_procsubs ();
+ default:
+ break;
+ }
+# endif /* HAVE_DEV_FD */
#endif
/* Invert the return value if we have to */
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.25.1

213
bash-5.0-patch-17.patch Normal file
View File

@ -0,0 +1,213 @@
From 9e49d343e3cd7e20dad1b86ebfb764e8027596a7 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 24 Apr 2020 11:05:06 -0400
Subject: [PATCH] Bash-5.0 patch 17: better fix for reaping process
substitution file descriptors
---
execute_cmd.c | 26 ++++++--------------------
patchlevel.h | 2 +-
subst.c | 35 +++++++++++++++++++++--------------
subst.h | 5 ++---
4 files changed, 30 insertions(+), 38 deletions(-)
diff --git a/execute_cmd.c b/execute_cmd.c
index 3864986d..4a05758d 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -564,7 +564,7 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
volatile int save_line_number;
#if defined (PROCESS_SUBSTITUTION)
volatile int ofifo, nfifo, osize, saved_fifo;
- volatile char *ofifo_list;
+ volatile void *ofifo_list;
#endif
if (breaking || continuing)
@@ -750,12 +750,14 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
reap_procsubs ();
# endif
- if (variable_context != 0) /* XXX - also if sourcelevel != 0? */
+ /* XXX - also if sourcelevel != 0? */
+ if (variable_context != 0)
{
ofifo = num_fifos ();
ofifo_list = copy_fifo_list ((int *)&osize);
begin_unwind_frame ("internal_fifos");
- add_unwind_protect (xfree, ofifo_list);
+ if (ofifo_list)
+ add_unwind_protect (xfree, ofifo_list);
saved_fifo = 1;
}
else
@@ -1099,26 +1101,10 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
{
nfifo = num_fifos ();
if (nfifo > ofifo)
- close_new_fifos ((char *)ofifo_list, osize);
+ close_new_fifos ((void *)ofifo_list, osize);
free ((void *)ofifo_list);
discard_unwind_frame ("internal_fifos");
}
-# if defined (HAVE_DEV_FD)
- /* Reap process substitutions at the end of loops */
- switch (command->type)
- {
- case cm_while:
- case cm_until:
- case cm_for:
- case cm_group:
-# if defined (ARITH_FOR_COMMAND)
- case cm_arith_for:
-# endif
- reap_procsubs ();
- default:
- break;
- }
-# endif /* HAVE_DEV_FD */
#endif
/* Invert the return value if we have to */
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_ */
diff --git a/subst.c b/subst.c
index fd6db240..8884b487 100644
--- a/subst.c
+++ b/subst.c
@@ -5336,13 +5336,13 @@ clear_fifo_list ()
{
}
-char *
+void *
copy_fifo_list (sizep)
int *sizep;
{
if (sizep)
*sizep = 0;
- return (char *)NULL;
+ return (void *)NULL;
}
static void
@@ -5408,8 +5408,13 @@ unlink_fifo_list ()
for (i = j = 0; i < nfifo; i++)
if (fifo_list[i].file)
{
- fifo_list[j].file = fifo_list[i].file;
- fifo_list[j].proc = fifo_list[i].proc;
+ if (i != j)
+ {
+ fifo_list[j].file = fifo_list[i].file;
+ fifo_list[j].proc = fifo_list[i].proc;
+ fifo_list[i].file = (char *)NULL;
+ fifo_list[i].proc = 0;
+ }
j++;
}
nfifo = j;
@@ -5425,10 +5430,11 @@ unlink_fifo_list ()
case it's larger than fifo_list_size (size of fifo_list). */
void
close_new_fifos (list, lsize)
- char *list;
+ void *list;
int lsize;
{
int i;
+ char *plist;
if (list == 0)
{
@@ -5436,8 +5442,8 @@ close_new_fifos (list, lsize)
return;
}
- for (i = 0; i < lsize; i++)
- if (list[i] == 0 && i < fifo_list_size && fifo_list[i].proc != -1)
+ for (plist = (char *)list, i = 0; i < lsize; i++)
+ if (plist[i] == 0 && i < fifo_list_size && fifo_list[i].proc != -1)
unlink_fifo (i);
for (i = lsize; i < fifo_list_size; i++)
@@ -5559,22 +5565,22 @@ clear_fifo_list ()
nfds = 0;
}
-char *
+void *
copy_fifo_list (sizep)
int *sizep;
{
- char *ret;
+ void *ret;
if (nfds == 0 || totfds == 0)
{
if (sizep)
*sizep = 0;
- return (char *)NULL;
+ return (void *)NULL;
}
if (sizep)
*sizep = totfds;
- ret = (char *)xmalloc (totfds * sizeof (pid_t));
+ ret = xmalloc (totfds * sizeof (pid_t));
return (memcpy (ret, dev_fd_list, totfds * sizeof (pid_t)));
}
@@ -5647,10 +5653,11 @@ unlink_fifo_list ()
totfds (size of dev_fd_list). */
void
close_new_fifos (list, lsize)
- char *list;
+ void *list;
int lsize;
{
int i;
+ pid_t *plist;
if (list == 0)
{
@@ -5658,8 +5665,8 @@ close_new_fifos (list, lsize)
return;
}
- for (i = 0; i < lsize; i++)
- if (list[i] == 0 && i < totfds && dev_fd_list[i])
+ for (plist = (pid_t *)list, i = 0; i < lsize; i++)
+ if (plist[i] == 0 && i < totfds && dev_fd_list[i])
unlink_fifo (i);
for (i = lsize; i < totfds; i++)
diff --git a/subst.h b/subst.h
index 34763222..faf831bd 100644
--- a/subst.h
+++ b/subst.h
@@ -273,9 +273,8 @@ extern int num_fifos __P((void));
extern void unlink_fifo_list __P((void));
extern void unlink_fifo __P((int));
-extern char *copy_fifo_list __P((int *));
-extern void unlink_new_fifos __P((char *, int));
-extern void close_new_fifos __P((char *, int));
+extern void *copy_fifo_list __P((int *));
+extern void close_new_fifos __P((void *, int));
extern void clear_fifo_list __P((void));
--
2.25.1

96
bash-5.0-patch-2.patch Normal file
View File

@ -0,0 +1,96 @@
From ddf3f643cb9b9a2ca8e6d996c605e4332204874c Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Fri, 18 Jan 2019 15:13:57 -0500
Subject: [PATCH] Bash-5.0 patch 2: fix expansion of aliases whose value ends
with an unquoted tab
---
parse.y | 5 ++++-
parser.h | 1 +
patchlevel.h | 2 +-
y.tab.c | 5 ++++-
4 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/parse.y b/parse.y
index 3ff87bcc..07e6e3e4 100644
--- a/parse.y
+++ b/parse.y
@@ -2557,12 +2557,14 @@ next_alias_char:
if (uc == 0 && pushed_string_list && pushed_string_list->flags != PSH_SOURCE &&
pushed_string_list->flags != PSH_DPAREN &&
(parser_state & PST_COMMENT) == 0 &&
+ (parser_state & PST_ENDALIAS) == 0 && /* only once */
shell_input_line_index > 0 &&
- shell_input_line[shell_input_line_index-1] != ' ' &&
+ shellblank (shell_input_line[shell_input_line_index-1]) == 0 &&
shell_input_line[shell_input_line_index-1] != '\n' &&
shellmeta (shell_input_line[shell_input_line_index-1]) == 0 &&
(current_delimiter (dstack) != '\'' && current_delimiter (dstack) != '"'))
{
+ parser_state |= PST_ENDALIAS;
return ' '; /* END_ALIAS */
}
#endif
@@ -2571,6 +2573,7 @@ pop_alias:
/* This case works for PSH_DPAREN as well */
if (uc == 0 && pushed_string_list && pushed_string_list->flags != PSH_SOURCE)
{
+ parser_state &= ~PST_ENDALIAS;
pop_string ();
uc = shell_input_line[shell_input_line_index];
if (uc)
diff --git a/parser.h b/parser.h
index 54dd2c88..6d08915d 100644
--- a/parser.h
+++ b/parser.h
@@ -47,6 +47,7 @@
#define PST_REPARSE 0x040000 /* re-parsing in parse_string_to_word_list */
#define PST_REDIRLIST 0x080000 /* parsing a list of redirections preceding a simple command name */
#define PST_COMMENT 0x100000 /* parsing a shell comment; used by aliases */
+#define PST_ENDALIAS 0x200000 /* just finished expanding and consuming an alias */
/* Definition of the delimiter stack. Needed by parse.y and bashhist.c. */
struct dstack {
diff --git a/patchlevel.h b/patchlevel.h
index 40db1a32..a988d852 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/y.tab.c b/y.tab.c
index 1abe2c50..7efce3c8 100644
--- a/y.tab.c
+++ b/y.tab.c
@@ -4873,12 +4873,14 @@ next_alias_char:
if (uc == 0 && pushed_string_list && pushed_string_list->flags != PSH_SOURCE &&
pushed_string_list->flags != PSH_DPAREN &&
(parser_state & PST_COMMENT) == 0 &&
+ (parser_state & PST_ENDALIAS) == 0 && /* only once */
shell_input_line_index > 0 &&
- shell_input_line[shell_input_line_index-1] != ' ' &&
+ shellblank (shell_input_line[shell_input_line_index-1]) == 0 &&
shell_input_line[shell_input_line_index-1] != '\n' &&
shellmeta (shell_input_line[shell_input_line_index-1]) == 0 &&
(current_delimiter (dstack) != '\'' && current_delimiter (dstack) != '"'))
{
+ parser_state |= PST_ENDALIAS;
return ' '; /* END_ALIAS */
}
#endif
@@ -4887,6 +4889,7 @@ pop_alias:
/* This case works for PSH_DPAREN as well */
if (uc == 0 && pushed_string_list && pushed_string_list->flags != PSH_SOURCE)
{
+ parser_state &= ~PST_ENDALIAS;
pop_string ();
uc = shell_input_line[shell_input_line_index];
if (uc)
--
2.17.2

202
bash-5.0-patch-3.patch Normal file
View File

@ -0,0 +1,202 @@
From fcf6ae7d069a64741e9484cf219d7fe95de9e796 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Tue, 19 Mar 2019 10:05:39 -0400
Subject: [PATCH] Bash-5.0 patch 3: improvements when globbing directory names
containing backslashes
---
bashline.c | 2 +-
lib/glob/glob.c | 25 +++++++++++++++++++++----
lib/glob/glob.h | 1 +
lib/glob/glob_loop.c | 23 ++++++++++++++++-------
patchlevel.h | 2 +-
pathexp.c | 16 ++++++++++++----
6 files changed, 52 insertions(+), 17 deletions(-)
diff --git a/bashline.c b/bashline.c
index 75e79f1a..824ea9d9 100644
--- a/bashline.c
+++ b/bashline.c
@@ -3752,7 +3752,7 @@ completion_glob_pattern (string)
continue;
case '\\':
- if (*string == 0)
+ if (*string++ == 0)
return (0);
}
diff --git a/lib/glob/glob.c b/lib/glob/glob.c
index 22d90a5c..398253b5 100644
--- a/lib/glob/glob.c
+++ b/lib/glob/glob.c
@@ -1061,7 +1061,7 @@ glob_filename (pathname, flags)
char *directory_name, *filename, *dname, *fn;
unsigned int directory_len;
int free_dirname; /* flag */
- int dflags;
+ int dflags, hasglob;
result = (char **) malloc (sizeof (char *));
result_size = 1;
@@ -1110,9 +1110,12 @@ glob_filename (pathname, flags)
free_dirname = 1;
}
+ hasglob = 0;
/* If directory_name contains globbing characters, then we
- have to expand the previous levels. Just recurse. */
- if (directory_len > 0 && glob_pattern_p (directory_name))
+ have to expand the previous levels. Just recurse.
+ If glob_pattern_p returns != [0,1] we have a pattern that has backslash
+ quotes but no unquoted glob pattern characters. We dequote it below. */
+ if (directory_len > 0 && (hasglob = glob_pattern_p (directory_name)) == 1)
{
char **directories, *d, *p;
register unsigned int i;
@@ -1175,7 +1178,7 @@ glob_filename (pathname, flags)
if (d[directory_len - 1] == '/')
d[directory_len - 1] = '\0';
- directories = glob_filename (d, dflags);
+ directories = glob_filename (d, dflags|GX_RECURSE);
if (free_dirname)
{
@@ -1332,6 +1335,20 @@ only_filename:
free (directory_name);
return (NULL);
}
+ /* If we have a directory name with quoted characters, and we are
+ being called recursively to glob the directory portion of a pathname,
+ we need to dequote the directory name before returning it so the
+ caller can read the directory */
+ if (directory_len > 0 && hasglob == 2 && (flags & GX_RECURSE) != 0)
+ {
+ dequote_pathname (directory_name);
+ directory_len = strlen (directory_name);
+ }
+
+ /* We could check whether or not the dequoted directory_name is a
+ directory and return it here, returning the original directory_name
+ if not, but we don't do that yet. I'm not sure it matters. */
+
/* Handle GX_MARKDIRS here. */
result[0] = (char *) malloc (directory_len + 1);
if (result[0] == NULL)
diff --git a/lib/glob/glob.h b/lib/glob/glob.h
index b9462333..56ac08ba 100644
--- a/lib/glob/glob.h
+++ b/lib/glob/glob.h
@@ -30,6 +30,7 @@
#define GX_NULLDIR 0x100 /* internal -- no directory preceding pattern */
#define GX_ADDCURDIR 0x200 /* internal -- add passed directory name */
#define GX_GLOBSTAR 0x400 /* turn on special handling of ** */
+#define GX_RECURSE 0x800 /* internal -- glob_filename called recursively */
extern int glob_pattern_p __P((const char *));
extern char **glob_vector __P((char *, char *, int));
diff --git a/lib/glob/glob_loop.c b/lib/glob/glob_loop.c
index 7d6ae211..3a4f4f1e 100644
--- a/lib/glob/glob_loop.c
+++ b/lib/glob/glob_loop.c
@@ -26,10 +26,10 @@ INTERNAL_GLOB_PATTERN_P (pattern)
{
register const GCHAR *p;
register GCHAR c;
- int bopen;
+ int bopen, bsquote;
p = pattern;
- bopen = 0;
+ bopen = bsquote = 0;
while ((c = *p++) != L('\0'))
switch (c)
@@ -55,13 +55,22 @@ INTERNAL_GLOB_PATTERN_P (pattern)
case L('\\'):
/* Don't let the pattern end in a backslash (GMATCH returns no match
- if the pattern ends in a backslash anyway), but otherwise return 1,
- since the matching engine uses backslash as an escape character
- and it can be removed. */
- return (*p != L('\0'));
+ if the pattern ends in a backslash anyway), but otherwise note that
+ we have seen this, since the matching engine uses backslash as an
+ escape character and it can be removed. We return 2 later if we
+ have seen only backslash-escaped characters, so interested callers
+ know they can shortcut and just dequote the pathname. */
+ if (*p != L('\0'))
+ {
+ p++;
+ bsquote = 1;
+ continue;
+ }
+ else /* (*p == L('\0')) */
+ return 0;
}
- return 0;
+ return bsquote ? 2 : 0;
}
#undef INTERNAL_GLOB_PATTERN_P
diff --git a/patchlevel.h b/patchlevel.h
index a988d852..e7e960c1 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_ */
diff --git a/pathexp.c b/pathexp.c
index b51729a7..c1bf2d89 100644
--- a/pathexp.c
+++ b/pathexp.c
@@ -65,11 +65,11 @@ unquoted_glob_pattern_p (string)
{
register int c;
char *send;
- int open;
+ int open, bsquote;
DECLARE_MBSTATE;
- open = 0;
+ open = bsquote = 0;
send = string + strlen (string);
while (c = *string++)
@@ -100,7 +100,14 @@ unquoted_glob_pattern_p (string)
can be removed by the matching engine, so we have to run it through
globbing. */
case '\\':
- return (*string != 0);
+ if (*string != '\0' && *string != '/')
+ {
+ bsquote = 1;
+ string++;
+ continue;
+ }
+ else if (*string == 0)
+ return (0);
case CTLESC:
if (*string++ == '\0')
@@ -117,7 +124,8 @@ unquoted_glob_pattern_p (string)
ADVANCE_CHAR_P (string, send - string);
#endif
}
- return (0);
+
+ return (bsquote ? 2 : 0);
}
/* Return 1 if C is a character that is `special' in a POSIX ERE and needs to
--
2.17.2

42
bash-5.0-patch-4.patch Normal file
View File

@ -0,0 +1,42 @@
From 16c907aa3bb427618733e5a6f2f4e2fc5a3488d3 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Sat, 20 Apr 2019 14:24:28 -0400
Subject: [PATCH] Bash-5.0 patch 4: the wait builtin without arguments only
waits for known children the shell started
---
jobs.c | 4 +---
patchlevel.h | 2 +-
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/jobs.c b/jobs.c
index ce2bdf24..ae3c54c6 100644
--- a/jobs.c
+++ b/jobs.c
@@ -2488,10 +2488,8 @@ wait_for_background_pids ()
r = wait_for (last_procsub_child->pid);
wait_procsubs ();
reap_procsubs ();
-#if 1
+#if 0
/* We don't want to wait indefinitely if we have stopped children. */
- /* XXX - should add a loop that goes through the list of process
- substitutions and waits for each proc in turn before this code. */
if (any_stopped == 0)
{
/* Check whether or not we have any unreaped children. */
diff --git a/patchlevel.h b/patchlevel.h
index e7e960c1..c059f0bd 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_ */
--
2.17.2

102
bash-5.0-patch-5.patch Normal file
View File

@ -0,0 +1,102 @@
From 41f5420db7a911fb0833be693205f4db41f05434 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Sat, 20 Apr 2019 14:25:52 -0400
Subject: [PATCH] Bash-5.0 patch 5: prevent optimizing forks away too
aggressively
---
builtins/evalstring.c | 26 +++++++++++++++++++++++---
command.h | 1 +
execute_cmd.c | 2 ++
patchlevel.h | 2 +-
4 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/builtins/evalstring.c b/builtins/evalstring.c
index 1496eeec..cadc9bc0 100644
--- a/builtins/evalstring.c
+++ b/builtins/evalstring.c
@@ -100,12 +100,22 @@ should_suppress_fork (command)
((command->flags & CMD_INVERT_RETURN) == 0));
}
+int
+can_optimize_connection (command)
+ COMMAND *command;
+{
+ return (*bash_input.location.string == '\0' &&
+ (command->value.Connection->connector == AND_AND || command->value.Connection->connector == OR_OR || command->value.Connection->connector == ';') &&
+ command->value.Connection->second->type == cm_simple);
+}
+
void
optimize_fork (command)
COMMAND *command;
{
if (command->type == cm_connection &&
- (command->value.Connection->connector == AND_AND || command->value.Connection->connector == OR_OR) &&
+ (command->value.Connection->connector == AND_AND || command->value.Connection->connector == OR_OR || command->value.Connection->connector == ';') &&
+ (command->value.Connection->second->flags & CMD_TRY_OPTIMIZING) &&
should_suppress_fork (command->value.Connection->second))
{
command->value.Connection->second->flags |= CMD_NO_FORK;
@@ -412,8 +422,18 @@ parse_and_execute (string, from_file, flags)
command->flags |= CMD_NO_FORK;
command->value.Simple->flags |= CMD_NO_FORK;
}
- else if (command->type == cm_connection)
- optimize_fork (command);
+
+ /* Can't optimize forks out here execept for simple commands.
+ This knows that the parser sets up commands as left-side heavy
+ (&& and || are left-associative) and after the single parse,
+ 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))
+ {
+ command->value.Connection->second->flags |= CMD_TRY_OPTIMIZING;
+ command->value.Connection->second->value.Simple->flags |= CMD_TRY_OPTIMIZING;
+ }
#endif /* ONESHOT */
/* See if this is a candidate for $( <file ). */
diff --git a/command.h b/command.h
index 32495162..b9e9b669 100644
--- a/command.h
+++ b/command.h
@@ -186,6 +186,7 @@ typedef struct element {
#define CMD_COPROC_SUBSHELL 0x1000
#define CMD_LASTPIPE 0x2000
#define CMD_STDPATH 0x4000 /* use standard path for command lookup */
+#define CMD_TRY_OPTIMIZING 0x8000 /* try to optimize this simple command */
/* What a command looks like. */
typedef struct command {
diff --git a/execute_cmd.c b/execute_cmd.c
index 8b3c83aa..f1d74bfe 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -2767,6 +2767,8 @@ execute_connection (command, asynchronous, pipe_in, pipe_out, fds_to_close)
((command->value.Connection->connector == OR_OR) &&
(exec_result != EXECUTION_SUCCESS)))
{
+ optimize_fork (command);
+
second = command->value.Connection->second;
if (ignore_return && second)
second->flags |= CMD_IGNORE_RETURN;
diff --git a/patchlevel.h b/patchlevel.h
index c059f0bd..1bc098b8 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.17.2

39
bash-5.0-patch-6.patch Normal file
View File

@ -0,0 +1,39 @@
From dfd2cc6ac5558e252af0a7cb829a9629bf782e17 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Sat, 20 Apr 2019 14:27:00 -0400
Subject: [PATCH] Bash-5.0 patch 6: allow building with SYSLOG_HISTORY defined
without defining SYSLOG_SHOPT
---
builtins/shopt.def | 2 +-
patchlevel.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/builtins/shopt.def b/builtins/shopt.def
index f6dc6f97..1c485361 100644
--- a/builtins/shopt.def
+++ b/builtins/shopt.def
@@ -122,7 +122,7 @@ extern int assoc_expand_once;
extern int array_expand_once;
#endif
-#if defined (SYSLOG_HISTORY) && defined (SYSLOG_SHOPT)
+#if defined (SYSLOG_HISTORY)
extern int syslog_history;
#endif
diff --git a/patchlevel.h b/patchlevel.h
index 1bc098b8..14bff9fc 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.17.2

51
bash-5.0-patch-7.patch Normal file
View File

@ -0,0 +1,51 @@
From 3ba697465bc74fab513a26dea700cc82e9f4724e Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Sat, 20 Apr 2019 14:27:56 -0400
Subject: [PATCH] Bash-5.0 patch 7: fix exec builtin leaving the terminal in
the wrong process group
---
jobs.c | 12 +++++-------
patchlevel.h | 2 +-
2 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/jobs.c b/jobs.c
index ae3c54c6..6bc31dca 100644
--- a/jobs.c
+++ b/jobs.c
@@ -4837,15 +4837,13 @@ void
end_job_control ()
{
if (job_control)
- {
- terminate_stopped_jobs ();
+ terminate_stopped_jobs ();
- if (original_pgrp >= 0)
- give_terminal_to (original_pgrp, 1);
- }
+ if (original_pgrp >= 0 && terminal_pgrp != original_pgrp)
+ give_terminal_to (original_pgrp, 1);
- if (original_pgrp >= 0)
- setpgid (0, original_pgrp);
+ if (original_pgrp >= 0 && setpgid (0, original_pgrp) == 0)
+ shell_pgrp = original_pgrp;
}
/* Restart job control by closing shell tty and reinitializing. This is
diff --git a/patchlevel.h b/patchlevel.h
index 14bff9fc..deb9c5b7 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_ */
--
2.17.2

50
bash-5.0-patch-8.patch Normal file
View File

@ -0,0 +1,50 @@
From 01323582f773ef4d08fa26a90e9a21285a8405f5 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Wed, 14 Aug 2019 14:57:48 -0400
Subject: [PATCH] Bash-5.0 patch 8: fix history offset when HISTSIZE == 0 that
can lead to crashes
---
bashhist.c | 5 ++++-
patchlevel.h | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/bashhist.c b/bashhist.c
index 7912cce3..d2155dce 100644
--- a/bashhist.c
+++ b/bashhist.c
@@ -560,15 +560,18 @@ pre_process_line (line, print_changes, addit)
add that line to the history if ADDIT is non-zero. */
if (!history_expansion_inhibited && history_expansion && history_expansion_p (line))
{
+ int old_len;
+
/* If we are expanding the second or later line of a multi-line
command, decrease history_length so references to history expansions
in these lines refer to the previous history entry and not the
current command. */
+ old_len = history_length;
if (history_length > 0 && command_oriented_history && current_command_first_line_saved && current_command_line_count > 1)
history_length--;
expanded = history_expand (line, &history_value);
if (history_length >= 0 && command_oriented_history && current_command_first_line_saved && current_command_line_count > 1)
- history_length++;
+ history_length = old_len;
if (expanded)
{
diff --git a/patchlevel.h b/patchlevel.h
index deb9c5b7..16c87404 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.21.0

38
bash-5.0-patch-9.patch Normal file
View File

@ -0,0 +1,38 @@
From 9f597fd10993313262cab400bf3c46ffb3f6fd1e Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Wed, 14 Aug 2019 14:58:44 -0400
Subject: [PATCH] Bash-5.0 patch 9: fix file descriptor leak with zero-length
history file
---
lib/readline/histfile.c | 1 +
patchlevel.h | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/lib/readline/histfile.c b/lib/readline/histfile.c
index dc64bde1..a8a92aa3 100644
--- a/lib/readline/histfile.c
+++ b/lib/readline/histfile.c
@@ -305,6 +305,7 @@ read_history_range (const char *filename, int from, int to)
if (file_size == 0)
{
free (input);
+ close (file);
return 0; /* don't waste time if we don't have to */
}
diff --git a/patchlevel.h b/patchlevel.h
index 16c87404..02f1d606 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.21.0

26
bash-infotags.patch Normal file
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

312
bash-requires.patch Normal file
View File

@ -0,0 +1,312 @@
diff --git a/builtins.h b/builtins.h
index dac95fd..5b7e811 100644
--- a/builtins.h
+++ b/builtins.h
@@ -45,6 +45,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 LOCALVAR_BUILTIN 0x40 /* This builtin creates local variables */
+#define REQUIRES_BUILTIN 0x80 /* This builtin requires other files. */
#define BASE_INDENT 4
diff --git a/builtins/mkbuiltins.c b/builtins/mkbuiltins.c
index 4f51201..91c25db 100644
--- a/builtins/mkbuiltins.c
+++ b/builtins/mkbuiltins.c
@@ -69,10 +69,15 @@ extern char *strcpy ();
#define whitespace(c) (((c) == ' ') || ((c) == '\t'))
/* Flag values that builtins can have. */
+/* These flags are for the C code generator,
+ the C which is produced (./builtin.c)
+ includes the flags definitions found
+ in ../builtins.h */
#define BUILTIN_FLAG_SPECIAL 0x01
#define BUILTIN_FLAG_ASSIGNMENT 0x02
#define BUILTIN_FLAG_LOCALVAR 0x04
#define BUILTIN_FLAG_POSIX_BUILTIN 0x08
+#define BUILTIN_FLAG_REQUIRES 0x10
#define BASE_INDENT 4
@@ -173,11 +178,19 @@ char *posix_builtins[] =
(char *)NULL
};
+/* The builtin commands that cause requirements on other files. */
+static char *requires_builtins[] =
+{
+ ".", "command", "exec", "source", "inlib",
+ (char *)NULL
+};
+
/* Forward declarations. */
static int is_special_builtin ();
static int is_assignment_builtin ();
static int is_localvar_builtin ();
static int is_posix_builtin ();
+static int is_requires_builtin ();
#if !defined (HAVE_RENAME)
static int rename ();
@@ -831,6 +844,8 @@ builtin_handler (self, defs, arg)
new->flags |= BUILTIN_FLAG_LOCALVAR;
if (is_posix_builtin (name))
new->flags |= BUILTIN_FLAG_POSIX_BUILTIN;
+ if (is_requires_builtin (name))
+ new->flags |= BUILTIN_FLAG_REQUIRES;
array_add ((char *)new, defs->builtins);
building_builtin = 1;
@@ -1250,12 +1265,13 @@ write_builtins (defs, structfile, externfile)
else
fprintf (structfile, "(sh_builtin_func_t *)0x0, ");
- fprintf (structfile, "%s%s%s%s%s, %s_doc,\n",
+ fprintf (structfile, "%s%s%s%s%s%s, %s_doc,\n",
"BUILTIN_ENABLED | STATIC_BUILTIN",
(builtin->flags & BUILTIN_FLAG_SPECIAL) ? " | SPECIAL_BUILTIN" : "",
(builtin->flags & BUILTIN_FLAG_ASSIGNMENT) ? " | ASSIGNMENT_BUILTIN" : "",
(builtin->flags & BUILTIN_FLAG_LOCALVAR) ? " | LOCALVAR_BUILTIN" : "",
(builtin->flags & BUILTIN_FLAG_POSIX_BUILTIN) ? " | POSIX_BUILTIN" : "",
+ (builtin->flags & BUILTIN_FLAG_REQUIRES) ? " | REQUIRES_BUILTIN" : "",
document_name (builtin));
/* Don't translate short document summaries that are identical
@@ -1645,6 +1661,13 @@ is_posix_builtin (name)
return (_find_in_table (name, posix_builtins));
}
+static int
+is_requires_builtin (name)
+ char *name;
+{
+ return (_find_in_table (name, requires_builtins));
+}
+
#if !defined (HAVE_RENAME)
static int
rename (from, to)
diff --git a/doc/bash.1 b/doc/bash.1
index d91f1fd..111a66d 100644
--- a/doc/bash.1
+++ b/doc/bash.1
@@ -239,6 +239,14 @@ The shell becomes restricted (see
.B "RESTRICTED SHELL"
below).
.TP
+.B \-\-rpm-requires
+Produce the list of files that are required for the
+shell script to run. This implies '-n' and is subject
+to the same limitations as compile time error checking checking;
+Command substitutions, Conditional expressions and
+.BR eval
+builtin are not parsed so some dependencies may be missed.
+.TP
.B \-\-verbose
Equivalent to \fB\-v\fP.
.TP
diff --git a/doc/bashref.texi b/doc/bashref.texi
index d33cd57..6fc4d18 100644
--- a/doc/bashref.texi
+++ b/doc/bashref.texi
@@ -6453,6 +6453,13 @@ standard. @xref{Bash POSIX Mode}, for a description of the Bash
@item --restricted
Make the shell a restricted shell (@pxref{The Restricted Shell}).
+@item --rpm-requires
+Produce the list of files that are required for the
+shell script to run. This implies '-n' and is subject
+to the same limitations as compile time error checking checking;
+Command substitutions, Conditional expressions and @command{eval}
+are not parsed so some dependencies may be missed.
+
@item --verbose
Equivalent to @option{-v}. Print shell input lines as they're read.
diff --git a/eval.c b/eval.c
index f02d6e4..76c1e8d 100644
--- a/eval.c
+++ b/eval.c
@@ -142,7 +142,8 @@ reader_loop ()
if (read_command () == 0)
{
- if (interactive_shell == 0 && read_but_dont_execute)
+
+ if (interactive_shell == 0 && (read_but_dont_execute && !rpm_requires))
{
last_command_exit_value = EXECUTION_SUCCESS;
dispose_command (global_command);
diff --git a/execute_cmd.c b/execute_cmd.c
index 8b3c83a..4eae19c 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -542,6 +542,8 @@ async_redirect_stdin ()
#define DESCRIBE_PID(pid) do { if (interactive) describe_pid (pid); } while (0)
+extern int rpm_requires;
+
/* Execute the command passed in COMMAND, perhaps doing it asynchronously.
COMMAND is exactly what read_command () places into GLOBAL_COMMAND.
ASYNCHROUNOUS, if non-zero, says to do this command in the background.
@@ -573,7 +575,13 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
if (breaking || continuing)
return (last_command_exit_value);
- if (command == 0 || read_but_dont_execute)
+ if (command == 0 || (read_but_dont_execute && !rpm_requires))
+ return (EXECUTION_SUCCESS);
+ if (rpm_requires && command->type == cm_function_def)
+ return last_command_exit_value =
+ execute_intern_function (command->value.Function_def->name,
+ command->value.Function_def);
+ if (read_but_dont_execute)
return (EXECUTION_SUCCESS);
QUIT;
@@ -2819,7 +2827,7 @@ execute_for_command (for_command)
save_line_number = line_number;
if (check_identifier (for_command->name, 1) == 0)
{
- if (posixly_correct && interactive_shell == 0)
+ if (posixly_correct && interactive_shell == 0 && rpm_requires == 0)
{
last_command_exit_value = EX_BADUSAGE;
jump_to_top_level (ERREXIT);
diff --git a/execute_cmd.h b/execute_cmd.h
index dc2f15e..506fff4 100644
--- a/execute_cmd.h
+++ b/execute_cmd.h
@@ -22,6 +22,9 @@
#define _EXECUTE_CMD_H_
#include "stdc.h"
+#include "variables.h"
+#include "command.h"
+
#if defined (ARRAY_VARS)
struct func_array_state
diff --git a/make_cmd.c b/make_cmd.c
index ecbbfd6..3d8bfa4 100644
--- a/make_cmd.c
+++ b/make_cmd.c
@@ -35,6 +35,8 @@
#include "bashintl.h"
#include "shell.h"
+#include "builtins.h"
+#include "builtins/common.h"
#include "execute_cmd.h"
#include "parser.h"
#include "flags.h"
@@ -828,6 +830,30 @@ make_coproc_command (name, command)
return (make_command (cm_coproc, (SIMPLE_COM *)temp));
}
+static void
+output_requirement (deptype, filename)
+const char *deptype;
+char *filename;
+{
+ static char *alphabet_set = "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+ if (strchr(filename, '$') || (filename[0] != '/' && strchr(filename, '/')))
+ return;
+
+ /*
+ if the executable is called via variable substitution we can
+ not dermine what it is at compile time.
+
+ if the executable consists only of characters not in the
+ alphabet we do not consider it a dependency just an artifact
+ of shell parsing (ex "exec < ${infile}").
+ */
+
+ if (strpbrk(filename, alphabet_set))
+ printf ("%s(%s)\n", deptype, filename);
+}
+
/* Reverse the word list and redirection list in the simple command
has just been parsed. It seems simpler to do this here the one
time then by any other method that I can think of. */
@@ -845,6 +871,28 @@ clean_simple_command (command)
REVERSE_LIST (command->value.Simple->redirects, REDIRECT *);
}
+ if (rpm_requires && command->value.Simple->words)
+ {
+ char *cmd0;
+ char *cmd1;
+ struct builtin *b;
+
+ cmd0 = command->value.Simple->words->word->word;
+ b = builtin_address_internal (cmd0, 0);
+ cmd1 = 0;
+ if (command->value.Simple->words->next)
+ cmd1 = command->value.Simple->words->next->word->word;
+
+ if (b) {
+ if ( (b->flags & REQUIRES_BUILTIN) && cmd1)
+ output_requirement ("executable", cmd1);
+ } else {
+ if (!assignment(cmd0, 0))
+ output_requirement (find_function(cmd0) ? "function" : "executable", cmd0);
+ }
+ } /*rpm_requires*/
+
+
parser_state &= ~PST_REDIRLIST;
return (command);
}
diff --git a/shell.c b/shell.c
index a2b2a55..c5d99b3 100644
--- a/shell.c
+++ b/shell.c
@@ -193,6 +193,9 @@ int have_devfd = 0;
/* The name of the .(shell)rc file. */
static char *bashrc_file = DEFAULT_BASHRC;
+/* Non-zero if we are finding the scripts requirements. */
+int rpm_requires;
+
/* Non-zero means to act more like the Bourne shell on startup. */
static int act_like_sh;
@@ -259,6 +262,7 @@ static const struct {
{ "protected", Int, &protected_mode, (char **)0x0 },
#endif
{ "rcfile", Charp, (int *)0x0, &bashrc_file },
+ { "rpm-requires", Int, &rpm_requires, (char **)0x0 },
#if defined (RESTRICTED_SHELL)
{ "restricted", Int, &restricted, (char **)0x0 },
#endif
@@ -496,6 +500,12 @@ main (argc, argv, env)
if (dump_translatable_strings)
read_but_dont_execute = 1;
+ if (rpm_requires)
+ {
+ read_but_dont_execute = 1;
+ initialize_shell_builtins ();
+ }
+
if (running_setuid && privileged_mode == 0)
disable_priv_mode ();
diff --git a/shell.h b/shell.h
index 8072605..6c4149d 100644
--- a/shell.h
+++ b/shell.h
@@ -99,6 +99,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;

10
bash-setlocale.patch Normal file
View File

@ -0,0 +1,10 @@
--- bash-3.0/builtins/setattr.def.setlocale 2005-08-08 12:22:42.000000000 +0100
+++ bash-3.0/builtins/setattr.def 2005-08-08 12:25:16.000000000 +0100
@@ -423,4 +423,7 @@
if (var && (exported_p (var) || (attribute & att_exported)))
array_needs_making++; /* XXX */
+
+ if (var)
+ stupidly_hack_special_variables (name);
}

61
bash-tty-tests.patch Normal file
View File

@ -0,0 +1,61 @@
diff --git a/tests/exec.right b/tests/exec.right
index 6075cc8..0b3f02c 100644
--- a/tests/exec.right
+++ b/tests/exec.right
@@ -51,7 +51,6 @@ this is ohio-state
0
1
testb
-expand_aliases on
1
1
1
diff --git a/tests/execscript b/tests/execscript
index c1819de..9227a4a 100644
--- a/tests/execscript
+++ b/tests/execscript
@@ -108,8 +108,6 @@ ${THIS_SH} ./exec6.sub
# checks for properly deciding what constitutes an executable file
${THIS_SH} ./exec7.sub
-${THIS_SH} -i ${PWD}/exec8.sub
-
${THIS_SH} ./exec9.sub
${THIS_SH} ./exec10.sub
diff --git a/tests/read.right b/tests/read.right
index 73cb704..a92fe7f 100644
--- a/tests/read.right
+++ b/tests/read.right
@@ -33,14 +33,6 @@ a = abcdefg
a = xyz
a = -xyz 123-
a = abc
-timeout 1: ok
-
-timeout 2: ok
-
-./read2.sub: line 23: read: -3: invalid timeout specification
-1
-
-abcde
./read3.sub: line 4: read: -1: invalid number
abc
ab
diff --git a/tests/read.tests b/tests/read.tests
index f67cd00..083f4a4 100644
--- a/tests/read.tests
+++ b/tests/read.tests
@@ -82,9 +82,6 @@ echo " foo" | { IFS=$':' ; read line; recho "$line"; }
# test read -d delim behavior
${THIS_SH} ./read1.sub
-# test read -t timeout behavior
-${THIS_SH} ./read2.sub
-
# test read -n nchars behavior
${THIS_SH} ./read3.sub
--
2.17.2

1691
bash.spec Normal file

File diff suppressed because it is too large Load Diff

2
dot-bash_logout Normal file
View File

@ -0,0 +1,2 @@
# ~/.bash_logout

8
dot-bash_profile Normal file
View File

@ -0,0 +1,8 @@
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs

18
dot-bashrc Normal file
View File

@ -0,0 +1,18 @@
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
then
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
export PATH
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions

1
sources Normal file
View File

@ -0,0 +1 @@
SHA512 (bash-5.0.tar.gz) = bb4519f06e278f271d08722b531e49d2e842cc3e0b02a6b3eee422e2efcb5b6226111af43f5e5eae56beb85ac8bfebcd6a4aacbabb8f609e529aa4d571890864

29
tests/tests.yml Normal file
View File

@ -0,0 +1,29 @@
---
# Tests that run in classic context
- hosts: localhost
roles:
- role: standard-test-beakerlib
tags:
- classic
repositories:
- repo: "https://src.fedoraproject.org/tests/shell.git"
dest: "shell"
fmf_filter: "tier: 1, 2 & tags: classic"
required_packages:
- expect # login requires expect
- which # smoke requires which
# Tests that run in container and atomic contexts
- hosts: localhost
roles:
- role: standard-test-beakerlib
tags:
- container
- atomic
repositories:
- repo: "https://src.fedoraproject.org/tests/shell.git"
dest: "shell"
fmf_filter: "tier: 1, 2 & tags: container, atomic"
required_packages:
- which # smoke requires which