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:
parent
de226a4903
commit
33fc6cffab
6
.gitignore
vendored
6
.gitignore
vendored
@ -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
16
STAGE1-bash
Normal 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
11
bash-2.03-paths.patch
Normal 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
12
bash-2.03-profile.patch
Normal 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
|
218
bash-2.05a-interpreter.patch
Normal file
218
bash-2.05a-interpreter.patch
Normal 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
|
||||||
|
|
10
bash-2.05b-debuginfo.patch
Normal file
10
bash-2.05b-debuginfo.patch
Normal 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:
|
11
bash-2.05b-pgrp_sync.patch
Normal file
11
bash-2.05b-pgrp_sync.patch
Normal 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
96
bash-3.2-audit.patch
Normal 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 *
|
12
bash-3.2-ssh_source_bash.patch
Normal file
12
bash-3.2-ssh_source_bash.patch
Normal 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
154
bash-4.0-nobits.patch
Normal 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);
|
||||||
|
}
|
12
bash-4.1-broken_pipe.patch
Normal file
12
bash-4.1-broken_pipe.patch
Normal 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
24
bash-4.1-examples.patch
Normal 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
103
bash-4.2-coverity.patch
Normal 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
|
||||||
|
|
12
bash-4.2-manpage_trap.patch
Normal file
12
bash-4.2-manpage_trap.patch
Normal 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
41
bash-4.2-rc2-logout.patch
Normal 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
14
bash-4.2-size_type.patch
Normal 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
15
bash-4.3-man-ulimit.patch
Normal 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
|
||||||
|
|
12
bash-4.3-memleak-lc_all.patch
Normal file
12
bash-4.3-memleak-lc_all.patch
Normal 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
46
bash-4.3-noecho.patch
Normal 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
|
||||||
|
|
15
bash-4.4-no-loadable-builtins.patch
Normal file
15
bash-4.4-no-loadable-builtins.patch
Normal 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
150
bash-5.0-patch-1.patch
Normal 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
116
bash-5.0-patch-10.patch
Normal 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
50
bash-5.0-patch-11.patch
Normal 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
56
bash-5.0-patch-12.patch
Normal 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
62
bash-5.0-patch-13.patch
Normal 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
44
bash-5.0-patch-14.patch
Normal 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
64
bash-5.0-patch-15.patch
Normal 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
53
bash-5.0-patch-16.patch
Normal 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
213
bash-5.0-patch-17.patch
Normal 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
96
bash-5.0-patch-2.patch
Normal 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
202
bash-5.0-patch-3.patch
Normal 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
42
bash-5.0-patch-4.patch
Normal 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
102
bash-5.0-patch-5.patch
Normal 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
39
bash-5.0-patch-6.patch
Normal 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
51
bash-5.0-patch-7.patch
Normal 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
50
bash-5.0-patch-8.patch
Normal 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
38
bash-5.0-patch-9.patch
Normal 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
26
bash-infotags.patch
Normal 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
312
bash-requires.patch
Normal 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
10
bash-setlocale.patch
Normal 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
61
bash-tty-tests.patch
Normal 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
|
||||||
|
|
2
dot-bash_logout
Normal file
2
dot-bash_logout
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# ~/.bash_logout
|
||||||
|
|
8
dot-bash_profile
Normal file
8
dot-bash_profile
Normal 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
18
dot-bashrc
Normal 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
1
sources
Normal file
@ -0,0 +1 @@
|
|||||||
|
SHA512 (bash-5.0.tar.gz) = bb4519f06e278f271d08722b531e49d2e842cc3e0b02a6b3eee422e2efcb5b6226111af43f5e5eae56beb85ac8bfebcd6a4aacbabb8f609e529aa4d571890864
|
29
tests/tests.yml
Normal file
29
tests/tests.yml
Normal 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
|
Loading…
Reference in New Issue
Block a user