Auto sync2gitlab import of bash-4.4.20-4.el8.src.rpm
This commit is contained in:
parent
cd45d3612c
commit
13e6c86239
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/bash-4.4.tar.gz
|
11
bash-2.02-security.patch
Normal file
11
bash-2.02-security.patch
Normal file
@ -0,0 +1,11 @@
|
||||
--- bash-2.02-orig/parse.y Wed Mar 25 18:16:23 1998
|
||||
+++ bash-2.02/parse.y Sun Apr 19 16:46:34 1998
|
||||
@@ -923,7 +923,7 @@
|
||||
|
||||
#if defined (READLINE)
|
||||
char *current_readline_prompt = (char *)NULL;
|
||||
-char *current_readline_line = (char *)NULL;
|
||||
+unsigned char *current_readline_line = (unsigned char *)NULL;
|
||||
int current_readline_line_index = 0;
|
||||
|
||||
static int
|
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
|
224
bash-2.05a-interpreter.patch
Normal file
224
bash-2.05a-interpreter.patch
Normal file
@ -0,0 +1,224 @@
|
||||
diff --git a/config.h.in b/config.h.in
|
||||
index a5ad9e7..62a6b32 100644
|
||||
--- a/config.h.in
|
||||
+++ b/config.h.in
|
||||
@@ -748,6 +748,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
|
||||
|
||||
@@ -946,6 +949,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 ce4e9b6..eda95d6 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -700,7 +700,7 @@ BASH_HEADER_INTTYPES
|
||||
AC_CHECK_HEADERS(unistd.h stdlib.h stdarg.h varargs.h limits.h string.h \
|
||||
memory.h locale.h termcap.h termio.h termios.h dlfcn.h \
|
||||
stdbool.h stddef.h stdint.h netdb.h pwd.h grp.h strings.h \
|
||||
- regex.h syslog.h ulimit.h)
|
||||
+ regex.h syslog.h ulimit.h elf.h)
|
||||
AC_CHECK_HEADERS(sys/pte.h sys/stream.h sys/select.h sys/file.h sys/ioctl.h \
|
||||
sys/param.h sys/socket.h sys/stat.h \
|
||||
sys/time.h sys/times.h sys/types.h sys/wait.h)
|
||||
@@ -771,7 +771,7 @@ dnl checks for system calls
|
||||
AC_CHECK_FUNCS(dup2 eaccess fcntl getdtablesize getgroups gethostname \
|
||||
getpagesize getpeername getrlimit getrusage gettimeofday \
|
||||
kill killpg lstat pselect readlink sbrk select setdtablesize \
|
||||
- setitimer tcgetpgrp uname ulimit waitpid)
|
||||
+ setitimer tcgetpgrp uname ulimit waitpid pread)
|
||||
AC_REPLACE_FUNCS(rename)
|
||||
|
||||
dnl checks for c library functions
|
||||
diff --git a/execute_cmd.c b/execute_cmd.c
|
||||
index 2a3df6d..b5cd405 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)
|
||||
@@ -5486,6 +5490,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)
|
||||
@@ -5495,6 +5507,7 @@ shell_execve (command, args, env)
|
||||
char *interp;
|
||||
int ilen;
|
||||
|
||||
+ close (fd);
|
||||
interp = getinterp (sample, sample_len, (int *)NULL);
|
||||
ilen = strlen (interp);
|
||||
errno = i;
|
||||
@@ -5510,6 +5523,136 @@ shell_execve (command, args, env)
|
||||
return (EX_NOEXEC);
|
||||
}
|
||||
#endif
|
||||
+#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);
|
||||
}
|
||||
--
|
||||
2.9.3
|
||||
|
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:
|
10
bash-2.05b-manso.patch
Normal file
10
bash-2.05b-manso.patch
Normal file
@ -0,0 +1,10 @@
|
||||
--- bash-2.05b/doc/builtins.1.manso 2003-02-10 18:58:21.000000000 +0000
|
||||
+++ bash-2.05b/doc/builtins.1 2003-02-10 18:58:28.000000000 +0000
|
||||
@@ -10,6 +10,6 @@
|
||||
ulimit, umask, unalias, unset, wait \- bash built-in commands, see \fBbash\fR(1)
|
||||
.SH BASH BUILTIN COMMANDS
|
||||
.nr zZ 1
|
||||
-.so bash.1
|
||||
+.so man1/bash.1
|
||||
.SH SEE ALSO
|
||||
bash(1), sh(1)
|
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])
|
||||
])
|
19
bash-2.05b-xcc.patch
Normal file
19
bash-2.05b-xcc.patch
Normal file
@ -0,0 +1,19 @@
|
||||
--- bash-3.1/Makefile.in.xcc 2005-10-25 19:37:52.000000000 +0100
|
||||
+++ bash-3.1/Makefile.in 2005-12-23 16:11:09.000000000 +0000
|
||||
@@ -68,6 +68,7 @@
|
||||
ARFLAGS = @ARFLAGS@
|
||||
RANLIB = @RANLIB@
|
||||
SIZE = @SIZE@
|
||||
+STRIP = strip
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
@@ -535,7 +536,7 @@
|
||||
@chmod a+rx bashbug
|
||||
|
||||
strip: $(Program) .made
|
||||
- strip $(Program)
|
||||
+ $(STRIP) $(Program)
|
||||
ls -l $(Program)
|
||||
-$(SIZE) $(Program)
|
||||
|
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
|
11
bash-4.1-defer-sigchld-trap.patch
Normal file
11
bash-4.1-defer-sigchld-trap.patch
Normal file
@ -0,0 +1,11 @@
|
||||
diff -pruN bash-4.1/jobs.c bash-4.1.patched/jobs.c
|
||||
--- bash-4.1/jobs.c 2009-11-30 03:42:05.000000000 +0530
|
||||
+++ bash-4.1.patched/jobs.c 2012-03-06 16:44:15.706595703 +0530
|
||||
@@ -3037,6 +3037,7 @@ waitchld (wpid, block)
|
||||
pid_t pid;
|
||||
|
||||
int call_set_current, last_stopped_job, job, children_exited, waitpid_flags;
|
||||
+ int called_from_sighand = sigchld;
|
||||
static int wcontinued = WCONTINUED; /* run-time fix for glibc problem */
|
||||
|
||||
call_set_current = children_exited = 0;
|
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.
|
99
bash-4.2-coverity.patch
Normal file
99
bash-4.2-coverity.patch
Normal file
@ -0,0 +1,99 @@
|
||||
diff -up bash-4.2/execute_cmd.c.coverity bash-4.2/execute_cmd.c
|
||||
--- bash-4.2/execute_cmd.c.coverity 2011-02-24 13:04:35.000000000 +0100
|
||||
+++ bash-4.2/execute_cmd.c 2011-02-24 13:49:13.000000000 +0100
|
||||
@@ -5036,7 +5036,7 @@ shell_execve (command, args, env)
|
||||
Elf32_Ehdr ehdr;
|
||||
Elf32_Phdr *phdr;
|
||||
Elf32_Shdr *shdr;
|
||||
- int nphdr, nshdr;
|
||||
+ Elf32_Half nphdr, nshdr;
|
||||
|
||||
/* We have to copy the data since the sample buffer
|
||||
might not be aligned correctly to be accessed as
|
||||
@@ -5044,12 +5044,12 @@ shell_execve (command, args, env)
|
||||
memcpy (&ehdr, sample, sizeof (Elf32_Ehdr));
|
||||
|
||||
nshdr = ehdr.e_shnum;
|
||||
- shdr = (Elf32_Shdr *) malloc (nshdr * ehdr.e_shentsize);
|
||||
+ shdr = (Elf32_Shdr *) malloc ((size_t)nshdr * (size_t)ehdr.e_shentsize);
|
||||
|
||||
if (shdr != NULL)
|
||||
{
|
||||
#ifdef HAVE_PREAD
|
||||
- sample_len = pread (fd, shdr, nshdr * ehdr.e_shentsize,
|
||||
+ sample_len = pread (fd, shdr, (size_t)nshdr * (size_t)ehdr.e_shentsize,
|
||||
ehdr.e_shoff);
|
||||
#else
|
||||
if (lseek (fd, ehdr.e_shoff, SEEK_SET) != -1)
|
||||
@@ -5091,11 +5091,11 @@ shell_execve (command, args, env)
|
||||
}
|
||||
|
||||
nphdr = ehdr.e_phnum;
|
||||
- phdr = (Elf32_Phdr *) malloc (nphdr * ehdr.e_phentsize);
|
||||
+ phdr = (Elf32_Phdr *) malloc ((size_t)nphdr * (size_t)ehdr.e_phentsize);
|
||||
if (phdr != NULL)
|
||||
{
|
||||
#ifdef HAVE_PREAD
|
||||
- sample_len = pread (fd, phdr, nphdr * ehdr.e_phentsize,
|
||||
+ sample_len = pread (fd, phdr, (size_t)nphdr * (size_t)ehdr.e_phentsize,
|
||||
ehdr.e_phoff);
|
||||
#else
|
||||
if (lseek (fd, ehdr.e_phoff, SEEK_SET) != -1)
|
||||
@@ -5120,7 +5120,7 @@ shell_execve (command, args, env)
|
||||
Elf64_Ehdr ehdr;
|
||||
Elf64_Phdr *phdr;
|
||||
Elf64_Shdr *shdr;
|
||||
- int nphdr, nshdr;
|
||||
+ Elf32_Half nphdr, nshdr;
|
||||
|
||||
/* We have to copy the data since the sample buffer
|
||||
might not be aligned correctly to be accessed as
|
||||
@@ -5128,11 +5128,11 @@ shell_execve (command, args, env)
|
||||
memcpy (&ehdr, sample, sizeof (Elf64_Ehdr));
|
||||
|
||||
nshdr = ehdr.e_shnum;
|
||||
- shdr = (Elf64_Shdr *) malloc (nshdr * ehdr.e_shentsize);
|
||||
+ shdr = (Elf64_Shdr *) malloc ((size_t)nshdr * (size_t)ehdr.e_shentsize);
|
||||
if (shdr != NULL)
|
||||
{
|
||||
#ifdef HAVE_PREAD
|
||||
- sample_len = pread (fd, shdr, nshdr * ehdr.e_shentsize,
|
||||
+ sample_len = pread (fd, shdr, (size_t)nshdr * (size_t)ehdr.e_shentsize,
|
||||
ehdr.e_shoff);
|
||||
#else
|
||||
if (lseek (fd, ehdr.e_shoff, SEEK_SET) != -1)
|
||||
@@ -5174,11 +5174,11 @@ shell_execve (command, args, env)
|
||||
}
|
||||
|
||||
nphdr = ehdr.e_phnum;
|
||||
- phdr = (Elf64_Phdr *) malloc (nphdr * ehdr.e_phentsize);
|
||||
+ phdr = (Elf64_Phdr *) malloc ((size_t)nphdr * (size_t)ehdr.e_phentsize);
|
||||
if (phdr != NULL)
|
||||
{
|
||||
#ifdef HAVE_PREAD
|
||||
- sample_len = pread (fd, phdr, nphdr * ehdr.e_phentsize,
|
||||
+ sample_len = pread (fd, phdr, (size_t)nphdr * (size_t)ehdr.e_phentsize,
|
||||
ehdr.e_phoff);
|
||||
#else
|
||||
if (lseek (fd, ehdr.e_phoff, SEEK_SET) != -1)
|
||||
@@ -5200,8 +5200,8 @@ shell_execve (command, args, env)
|
||||
|
||||
if (offset != -1)
|
||||
{
|
||||
- size_t maxlen = 0;
|
||||
- size_t actlen = 0;
|
||||
+ ssize_t maxlen = 0;
|
||||
+ ssize_t actlen = 0;
|
||||
char *interp = NULL;
|
||||
|
||||
do
|
||||
@@ -5250,7 +5250,8 @@ shell_execve (command, args, env)
|
||||
}
|
||||
#endif
|
||||
#if defined (HAVE_HASH_BANG_EXEC) || defined (HAVE_ELF_H)
|
||||
- close (fd);
|
||||
+ if (fd >= 0)
|
||||
+ close (fd);
|
||||
#endif
|
||||
errno = i;
|
||||
file_error (command);
|
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 30425a5..85f1c4f 100644
|
||||
--- a/parse.y
|
||||
+++ b/parse.y
|
||||
@@ -4228,6 +4228,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;
|
||||
|
||||
/*(*/
|
||||
parser_state |= PST_CMDSUBST|PST_EOFTOKEN; /* allow instant ')' */ /*(*/
|
||||
diff --git a/subst.c b/subst.c
|
||||
index f1a4df1..a93a4ce 100644
|
||||
--- a/subst.c
|
||||
+++ b/subst.c
|
||||
@@ -8513,6 +8513,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;
|
||||
@@ -8831,6 +8832,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);
|
||||
@@ -8843,6 +8847,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.9.3
|
||||
|
31
bash-4.4-assignment-error.patch
Normal file
31
bash-4.4-assignment-error.patch
Normal file
@ -0,0 +1,31 @@
|
||||
diff --git a/execute_cmd.h b/execute_cmd.h
|
||||
--- a/execute_cmd.h
|
||||
+++ b/execute_cmd.h
|
||||
@@ -37,6 +37,9 @@ struct func_array_state
|
||||
};
|
||||
#endif
|
||||
|
||||
+/* Variables delared in execute_cmd.c, used by many other files */
|
||||
+extern int executing_command_builtin;
|
||||
+
|
||||
extern struct fd_bitmap *new_fd_bitmap __P((int));
|
||||
extern void dispose_fd_bitmap __P((struct fd_bitmap *));
|
||||
extern void close_fd_bitmap __P((struct fd_bitmap *));
|
||||
diff --git a/subst.c b/subst.c
|
||||
--- a/subst.c
|
||||
+++ b/subst.c
|
||||
@@ -10676,11 +10676,12 @@ expand_word_list_internal (list, eflags)
|
||||
tint = do_word_assignment (temp_list->word, 0);
|
||||
this_command_name = savecmd;
|
||||
/* Variable assignment errors in non-interactive shells
|
||||
- running in Posix.2 mode cause the shell to exit. */
|
||||
+ running in Posix.2 mode cause the shell to exit, unless
|
||||
+ they are being run by the `command' builtin. */
|
||||
if (tint == 0)
|
||||
{
|
||||
last_command_exit_value = EXECUTION_FAILURE;
|
||||
- if (interactive_shell == 0 && posixly_correct)
|
||||
+ if (interactive_shell == 0 && posixly_correct && executing_command_builtin == 0)
|
||||
exp_jump_to_top_level (FORCE_EOF);
|
||||
else
|
||||
exp_jump_to_top_level (DISCARD);
|
18
bash-4.4-case-in-command-subst.patch
Normal file
18
bash-4.4-case-in-command-subst.patch
Normal file
@ -0,0 +1,18 @@
|
||||
diff --git a/parse.y b/parse.y
|
||||
--- a/parse.y
|
||||
+++ b/parse.y
|
||||
@@ -4011,11 +4011,13 @@ eof_error:
|
||||
tflags |= LEX_RESWDOK;
|
||||
lex_rwlen = 0;
|
||||
}
|
||||
- else
|
||||
+ else if (shellmeta (ch) == 0)
|
||||
{
|
||||
tflags &= ~LEX_RESWDOK;
|
||||
/*itrace("parse_comsub:%d: found `%.4s', lex_reswdok -> 0", line_number, ret+retind-4);*/
|
||||
}
|
||||
+ else /* can't be in a reserved word any more */
|
||||
+ lex_rwlen = 0;
|
||||
}
|
||||
else if MBTEST((tflags & LEX_CKCOMMENT) && ch == '#' && (lex_rwlen == 0 || ((tflags & LEX_INWORD) && lex_wlen == 0)))
|
||||
; /* don't modify LEX_RESWDOK if we're starting a comment */
|
203
bash-4.4-coverity.patch
Normal file
203
bash-4.4-coverity.patch
Normal file
@ -0,0 +1,203 @@
|
||||
diff --git a/builtins/fc.def b/builtins/fc.def
|
||||
index fe16471..98c53db 100644
|
||||
--- a/builtins/fc.def
|
||||
+++ b/builtins/fc.def
|
||||
@@ -423,6 +423,7 @@ fc_builtin (list)
|
||||
{
|
||||
sh_wrerror ();
|
||||
fclose (stream);
|
||||
+ FREE (fn);
|
||||
return (EXECUTION_FAILURE);
|
||||
}
|
||||
fclose (stream);
|
||||
diff --git a/execute_cmd.c b/execute_cmd.c
|
||||
index 63a332a..15b5e19 100644
|
||||
--- a/execute_cmd.c
|
||||
+++ b/execute_cmd.c
|
||||
@@ -2196,8 +2196,10 @@ coproc_setvars (cp)
|
||||
if (v == 0)
|
||||
{
|
||||
v = find_variable_nameref_for_create (cp->c_name, 1);
|
||||
- if (v == INVALID_NAMEREF_VALUE)
|
||||
- return;
|
||||
+ if (v == INVALID_NAMEREF_VALUE) {
|
||||
+ free (namevar);
|
||||
+ return;
|
||||
+ }
|
||||
if (v && nameref_p (v))
|
||||
{
|
||||
free (cp->c_name);
|
||||
@@ -2210,6 +2212,7 @@ coproc_setvars (cp)
|
||||
{
|
||||
if (readonly_p (v))
|
||||
err_readonly (cp->c_name);
|
||||
+ free (namevar);
|
||||
return;
|
||||
}
|
||||
if (v == 0)
|
||||
@@ -5528,7 +5531,6 @@ shell_execve (command, args, env)
|
||||
char *interp;
|
||||
int ilen;
|
||||
|
||||
- close (fd);
|
||||
interp = getinterp (sample, sample_len, (int *)NULL);
|
||||
ilen = strlen (interp);
|
||||
errno = i;
|
||||
diff --git a/expr.c b/expr.c
|
||||
index 172964a..5dc57c0 100644
|
||||
--- a/expr.c
|
||||
+++ b/expr.c
|
||||
@@ -207,7 +207,8 @@ static intmax_t exp5 __P((void));
|
||||
static intmax_t exp4 __P((void));
|
||||
static intmax_t expshift __P((void));
|
||||
static intmax_t exp3 __P((void));
|
||||
-static intmax_t exp2 __P((void));
|
||||
+/* Avoid name clash with standard exp2 */
|
||||
+static intmax_t bash_exp2 __P((void));
|
||||
static intmax_t exppower __P((void));
|
||||
static intmax_t exp1 __P((void));
|
||||
static intmax_t exp0 __P((void));
|
||||
@@ -809,14 +810,14 @@ exp3 ()
|
||||
{
|
||||
register intmax_t val1, val2;
|
||||
|
||||
- val1 = exp2 ();
|
||||
+ val1 = bash_exp2 ();
|
||||
|
||||
while ((curtok == PLUS) || (curtok == MINUS))
|
||||
{
|
||||
int op = curtok;
|
||||
|
||||
readtok ();
|
||||
- val2 = exp2 ();
|
||||
+ val2 = bash_exp2 ();
|
||||
|
||||
if (op == PLUS)
|
||||
val1 += val2;
|
||||
@@ -828,7 +829,7 @@ exp3 ()
|
||||
}
|
||||
|
||||
static intmax_t
|
||||
-exp2 ()
|
||||
+bash_exp2 ()
|
||||
{
|
||||
register intmax_t val1, val2;
|
||||
#if defined (HAVE_IMAXDIV)
|
||||
diff --git a/lib/glob/glob.c b/lib/glob/glob.c
|
||||
index 7f6eafe..c018e29 100644
|
||||
--- a/lib/glob/glob.c
|
||||
+++ b/lib/glob/glob.c
|
||||
@@ -576,7 +576,7 @@ glob_vector (pat, dir, flags)
|
||||
register char *nextname, *npat, *subdir;
|
||||
unsigned int count;
|
||||
int lose, skip, ndirs, isdir, sdlen, add_current, patlen;
|
||||
- register char **name_vector;
|
||||
+ register char **name_vector = NULL;
|
||||
register unsigned int i;
|
||||
int mflags; /* Flags passed to strmatch (). */
|
||||
int pflags; /* flags passed to sh_makepath () */
|
||||
@@ -894,7 +894,7 @@ glob_vector (pat, dir, flags)
|
||||
}
|
||||
|
||||
/* Don't call QUIT; here; let higher layers deal with it. */
|
||||
-
|
||||
+ FREE (name_vector);
|
||||
return ((char **)NULL);
|
||||
}
|
||||
|
||||
diff --git a/lib/sh/pathcanon.c b/lib/sh/pathcanon.c
|
||||
index f19bd55..2a565d6 100644
|
||||
--- a/lib/sh/pathcanon.c
|
||||
+++ b/lib/sh/pathcanon.c
|
||||
@@ -227,7 +227,7 @@ sh_canonpath (path, flags)
|
||||
if (result[2] == '\0') /* short-circuit for bare `//' */
|
||||
result[1] = '\0';
|
||||
else
|
||||
- strcpy (result, result + 1);
|
||||
+ memmove(result, result + 1, strlen(result + 1) + 1);
|
||||
}
|
||||
|
||||
return (result);
|
||||
diff --git a/lib/sh/pathphys.c b/lib/sh/pathphys.c
|
||||
index 26016b7..b64c4cd 100644
|
||||
--- a/lib/sh/pathphys.c
|
||||
+++ b/lib/sh/pathphys.c
|
||||
@@ -245,7 +245,7 @@ error:
|
||||
if (result[2] == '\0') /* short-circuit for bare `//' */
|
||||
result[1] = '\0';
|
||||
else
|
||||
- strcpy (result, result + 1);
|
||||
+ memmove(result, result + 1, strlen(result + 1) + 1);
|
||||
}
|
||||
|
||||
return (result);
|
||||
diff --git a/shell.c b/shell.c
|
||||
index b43de50..4aae182 100644
|
||||
--- a/shell.c
|
||||
+++ b/shell.c
|
||||
@@ -1948,8 +1948,10 @@ show_shell_usage (fp, extra)
|
||||
fputs (_("\t-ilrsD or -c command or -O shopt_option\t\t(invocation only)\n"), fp);
|
||||
|
||||
for (i = 0, set_opts = 0; shell_builtins[i].name; i++)
|
||||
- if (STREQ (shell_builtins[i].name, "set"))
|
||||
+ if (STREQ (shell_builtins[i].name, "set")) {
|
||||
set_opts = savestring (shell_builtins[i].short_doc);
|
||||
+ break;
|
||||
+ }
|
||||
if (set_opts)
|
||||
{
|
||||
s = strchr (set_opts, '[');
|
||||
diff --git a/subst.c b/subst.c
|
||||
index 5f3e41e..7574617 100644
|
||||
--- a/subst.c
|
||||
+++ b/subst.c
|
||||
@@ -5182,8 +5182,11 @@ parameter_list_transform (xc, itype, quoted)
|
||||
list = list_rest_of_args ();
|
||||
if (list == 0)
|
||||
return ((char *)NULL);
|
||||
- if (xc == 'A')
|
||||
- return (pos_params_assignment (list, itype, quoted));
|
||||
+ if (xc == 'A') {
|
||||
+ ret = pos_params_assignment (list, itype, quoted);
|
||||
+ dispose_words (list);
|
||||
+ return (ret);
|
||||
+ }
|
||||
ret = list_transform (xc, (SHELL_VAR *)0, list, itype, quoted);
|
||||
dispose_words (list);
|
||||
return (ret);
|
||||
@@ -6813,6 +6816,7 @@ parameter_brace_expand_rhs (name, value, c, quoted, pflags, qdollaratp, hasdolla
|
||||
{
|
||||
report_error (_("%s: invalid indirect expansion"), name);
|
||||
free (vname);
|
||||
+ free (t1);
|
||||
dispose_word (w);
|
||||
return &expand_wdesc_error;
|
||||
}
|
||||
@@ -6820,6 +6824,7 @@ parameter_brace_expand_rhs (name, value, c, quoted, pflags, qdollaratp, hasdolla
|
||||
{
|
||||
report_error (_("%s: invalid variable name"), vname);
|
||||
free (vname);
|
||||
+ free (t1);
|
||||
dispose_word (w);
|
||||
return &expand_wdesc_error;
|
||||
}
|
||||
diff --git a/support/man2html.c b/support/man2html.c
|
||||
index 6ba5061..1d9e376 100644
|
||||
--- a/support/man2html.c
|
||||
+++ b/support/man2html.c
|
||||
@@ -522,6 +522,7 @@ read_man_page(char *filename)
|
||||
man_buf[buf_size] = '\n';
|
||||
man_buf[buf_size + 1] = man_buf[buf_size + 2] = '\0';
|
||||
} else {
|
||||
+ free (man_buf);
|
||||
man_buf = NULL;
|
||||
}
|
||||
fclose(man_stream);
|
||||
@@ -2562,7 +2563,6 @@ scan_request(char *c)
|
||||
h = name;
|
||||
if (stat(h, &stbuf) != -1)
|
||||
l = stbuf.st_size;
|
||||
- buf = stralloc(l + 4);
|
||||
#if NOCGI
|
||||
if (!out_length) {
|
||||
char *t, *s;
|
23
bash-4.4-fix-buffered_getchar-crash.patch
Normal file
23
bash-4.4-fix-buffered_getchar-crash.patch
Normal file
@ -0,0 +1,23 @@
|
||||
diff -up bash-4.4/input.c.orig bash-4.4/input.c
|
||||
--- bash-4.4/input.c.orig 2022-03-10 10:50:40.046490589 -0300
|
||||
+++ bash-4.4/input.c 2022-03-10 10:51:48.659491601 -0300
|
||||
@@ -530,7 +530,7 @@ bufstream_ungetc(c, bp)
|
||||
int c;
|
||||
BUFFERED_STREAM *bp;
|
||||
{
|
||||
- if (c == EOF || bp->b_inputp == 0)
|
||||
+ if (c == EOF || bp == 0 || bp->b_inputp == 0)
|
||||
return (EOF);
|
||||
|
||||
bp->b_buffer[--bp->b_inputp] = c;
|
||||
@@ -561,6 +561,10 @@ buffered_getchar ()
|
||||
{
|
||||
CHECK_TERMSIG;
|
||||
|
||||
+ if (bash_input.location.buffered_fd < 0 ||
|
||||
+ buffers[bash_input.location.buffered_fd] == 0)
|
||||
+ return EOF;
|
||||
+
|
||||
#if !defined (DJGPP)
|
||||
return (bufstream_getc (buffers[bash_input.location.buffered_fd]));
|
||||
#else
|
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
|
||||
|
49
bash-4.4-patch-1.patch
Normal file
49
bash-4.4-patch-1.patch
Normal file
@ -0,0 +1,49 @@
|
||||
From 8ddc8d6e3a3d85eec6d4ba9b9ed2bc36bce56716 Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Mon, 14 Nov 2016 14:26:51 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 1
|
||||
|
||||
---
|
||||
lib/readline/history.c | 6 +++++-
|
||||
patchlevel.h | 2 +-
|
||||
2 files changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/lib/readline/history.c b/lib/readline/history.c
|
||||
index 3b8dbc5..9ff25a7 100644
|
||||
--- a/lib/readline/history.c
|
||||
+++ b/lib/readline/history.c
|
||||
@@ -57,6 +57,8 @@ extern int errno;
|
||||
/* How big to make the_history when we first allocate it. */
|
||||
#define DEFAULT_HISTORY_INITIAL_SIZE 502
|
||||
|
||||
+#define MAX_HISTORY_INITIAL_SIZE 8192
|
||||
+
|
||||
/* The number of slots to increase the_history by. */
|
||||
#define DEFAULT_HISTORY_GROW_SIZE 50
|
||||
|
||||
@@ -307,7 +309,9 @@ add_history (string)
|
||||
if (history_size == 0)
|
||||
{
|
||||
if (history_stifled && history_max_entries > 0)
|
||||
- history_size = history_max_entries + 2;
|
||||
+ history_size = (history_max_entries > MAX_HISTORY_INITIAL_SIZE)
|
||||
+ ? MAX_HISTORY_INITIAL_SIZE
|
||||
+ : history_max_entries + 2;
|
||||
else
|
||||
history_size = DEFAULT_HISTORY_INITIAL_SIZE;
|
||||
the_history = (HIST_ENTRY **)xmalloc (history_size * sizeof (HIST_ENTRY *));
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index 1cd7c96..40db1a3 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 0
|
||||
+#define PATCHLEVEL 1
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
--
|
||||
2.9.3
|
||||
|
39
bash-4.4-patch-10.patch
Normal file
39
bash-4.4-patch-10.patch
Normal file
@ -0,0 +1,39 @@
|
||||
From 5b9762d6f0cd36ff1b88bde22efa30ad0ed27ec6 Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Fri, 20 Jan 2017 15:38:38 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 10
|
||||
|
||||
---
|
||||
builtins/read.def | 3 ++-
|
||||
patchlevel.h | 2 +-
|
||||
2 files changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/builtins/read.def b/builtins/read.def
|
||||
index 48fda33..33821f3 100644
|
||||
--- a/builtins/read.def
|
||||
+++ b/builtins/read.def
|
||||
@@ -181,7 +181,8 @@ read_builtin (list)
|
||||
WORD_LIST *list;
|
||||
{
|
||||
register char *varname;
|
||||
- int size, i, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2;
|
||||
+ int size, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2;
|
||||
+ volatile int i;
|
||||
int input_is_tty, input_is_pipe, unbuffered_read, skip_ctlesc, skip_ctlnul;
|
||||
int raw, edit, nchars, silent, have_timeout, ignore_delim, fd, lastsig, t_errno;
|
||||
unsigned int tmsec, tmusec;
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index 02f1d60..8002af7 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 9
|
||||
+#define PATCHLEVEL 10
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
--
|
||||
2.9.3
|
||||
|
39
bash-4.4-patch-11.patch
Normal file
39
bash-4.4-patch-11.patch
Normal file
@ -0,0 +1,39 @@
|
||||
From 76bb456d8fcd870cd31b7bf9d90798cd97cee2ab Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Fri, 20 Jan 2017 15:38:49 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 11
|
||||
|
||||
---
|
||||
patchlevel.h | 2 +-
|
||||
sig.c | 3 ++-
|
||||
2 files changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index 8002af7..772676c 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 10
|
||||
+#define PATCHLEVEL 11
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
diff --git a/sig.c b/sig.c
|
||||
index ad01631..e5bb739 100644
|
||||
--- a/sig.c
|
||||
+++ b/sig.c
|
||||
@@ -585,7 +585,8 @@ termsig_handler (sig)
|
||||
#if defined (JOB_CONTROL)
|
||||
if (sig == SIGHUP && (interactive || (subshell_environment & (SUBSHELL_COMSUB|SUBSHELL_PROCSUB))))
|
||||
hangup_all_jobs ();
|
||||
- end_job_control ();
|
||||
+ if ((subshell_environment & (SUBSHELL_COMSUB|SUBSHELL_PROCSUB)) == 0)
|
||||
+ end_job_control ();
|
||||
#endif /* JOB_CONTROL */
|
||||
|
||||
#if defined (PROCESS_SUBSTITUTION)
|
||||
--
|
||||
2.9.3
|
||||
|
119
bash-4.4-patch-12.patch
Normal file
119
bash-4.4-patch-12.patch
Normal file
@ -0,0 +1,119 @@
|
||||
From bc007799f0e1362100375bb95d952d28de4c62fb Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Fri, 27 Jan 2017 11:25:44 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 12
|
||||
|
||||
---
|
||||
patchlevel.h | 2 +-
|
||||
subst.c | 32 ++++++++++++++++++++------------
|
||||
2 files changed, 21 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index 772676c..93dbe0d 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 11
|
||||
+#define PATCHLEVEL 12
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
diff --git a/subst.c b/subst.c
|
||||
index 027a13e..dbf0157 100644
|
||||
--- a/subst.c
|
||||
+++ b/subst.c
|
||||
@@ -2825,11 +2825,15 @@ list_string (string, separators, quoted)
|
||||
|
||||
/* Parse a single word from STRING, using SEPARATORS to separate fields.
|
||||
ENDPTR is set to the first character after the word. This is used by
|
||||
- the `read' builtin. This is never called with SEPARATORS != $IFS;
|
||||
- it should be simplified.
|
||||
+ the `read' builtin.
|
||||
+
|
||||
+ This is never called with SEPARATORS != $IFS, and takes advantage of that.
|
||||
|
||||
XXX - this function is very similar to list_string; they should be
|
||||
combined - XXX */
|
||||
+
|
||||
+#define islocalsep(c) (local_cmap[(unsigned char)(c)] != 0)
|
||||
+
|
||||
char *
|
||||
get_word_from_string (stringp, separators, endptr)
|
||||
char **stringp, *separators, **endptr;
|
||||
@@ -2837,6 +2841,7 @@ get_word_from_string (stringp, separators, endptr)
|
||||
register char *s;
|
||||
char *current_word;
|
||||
int sindex, sh_style_split, whitesep, xflags;
|
||||
+ unsigned char local_cmap[UCHAR_MAX+1]; /* really only need single-byte chars here */
|
||||
size_t slen;
|
||||
|
||||
if (!stringp || !*stringp || !**stringp)
|
||||
@@ -2846,20 +2851,23 @@ get_word_from_string (stringp, separators, endptr)
|
||||
separators[1] == '\t' &&
|
||||
separators[2] == '\n' &&
|
||||
separators[3] == '\0';
|
||||
- for (xflags = 0, s = ifs_value; s && *s; s++)
|
||||
+ memset (local_cmap, '\0', sizeof (local_cmap));
|
||||
+ for (xflags = 0, s = separators; s && *s; s++)
|
||||
{
|
||||
if (*s == CTLESC) xflags |= SX_NOCTLESC;
|
||||
if (*s == CTLNUL) xflags |= SX_NOESCCTLNUL;
|
||||
+ local_cmap[(unsigned char)*s] = 1; /* local charmap of separators */
|
||||
}
|
||||
|
||||
s = *stringp;
|
||||
slen = 0;
|
||||
|
||||
/* Remove sequences of whitespace at the beginning of STRING, as
|
||||
- long as those characters appear in IFS. */
|
||||
- if (sh_style_split || !separators || !*separators)
|
||||
+ long as those characters appear in SEPARATORS. This happens if
|
||||
+ SEPARATORS == $' \t\n' or if IFS is unset. */
|
||||
+ if (sh_style_split || separators == 0)
|
||||
{
|
||||
- for (; *s && spctabnl (*s) && isifs (*s); s++);
|
||||
+ for (; *s && spctabnl (*s) && islocalsep (*s); s++);
|
||||
|
||||
/* If the string is nothing but whitespace, update it and return. */
|
||||
if (!*s)
|
||||
@@ -2878,9 +2886,9 @@ get_word_from_string (stringp, separators, endptr)
|
||||
|
||||
This obeys the field splitting rules in Posix.2. */
|
||||
sindex = 0;
|
||||
- /* Don't need string length in ADVANCE_CHAR or string_extract_verbatim
|
||||
- unless multibyte chars are possible. */
|
||||
- slen = (MB_CUR_MAX > 1) ? STRLEN (s) : 1;
|
||||
+ /* Don't need string length in ADVANCE_CHAR unless multibyte chars are
|
||||
+ possible, but need it in string_extract_verbatim for bounds checking */
|
||||
+ slen = STRLEN (s);
|
||||
current_word = string_extract_verbatim (s, slen, &sindex, separators, xflags);
|
||||
|
||||
/* Set ENDPTR to the first character after the end of the word. */
|
||||
@@ -2899,19 +2907,19 @@ get_word_from_string (stringp, separators, endptr)
|
||||
|
||||
/* Now skip sequences of space, tab, or newline characters if they are
|
||||
in the list of separators. */
|
||||
- while (s[sindex] && spctabnl (s[sindex]) && isifs (s[sindex]))
|
||||
+ while (s[sindex] && spctabnl (s[sindex]) && islocalsep (s[sindex]))
|
||||
sindex++;
|
||||
|
||||
/* If the first separator was IFS whitespace and the current character is
|
||||
a non-whitespace IFS character, it should be part of the current field
|
||||
delimiter, not a separate delimiter that would result in an empty field.
|
||||
Look at POSIX.2, 3.6.5, (3)(b). */
|
||||
- if (s[sindex] && whitesep && isifs (s[sindex]) && !spctabnl (s[sindex]))
|
||||
+ if (s[sindex] && whitesep && islocalsep (s[sindex]) && !spctabnl (s[sindex]))
|
||||
{
|
||||
sindex++;
|
||||
/* An IFS character that is not IFS white space, along with any adjacent
|
||||
IFS white space, shall delimit a field. */
|
||||
- while (s[sindex] && spctabnl (s[sindex]) && isifs (s[sindex]))
|
||||
+ while (s[sindex] && spctabnl (s[sindex]) && islocalsep(s[sindex]))
|
||||
sindex++;
|
||||
}
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
38
bash-4.4-patch-13.patch
Normal file
38
bash-4.4-patch-13.patch
Normal file
@ -0,0 +1,38 @@
|
||||
From 1aef9c7b55dcef4af239caf93e01419e1c8e04ad Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Mon, 29 Jan 2018 16:03:33 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 13
|
||||
|
||||
---
|
||||
patchlevel.h | 2 +-
|
||||
redir.c | 2 ++
|
||||
2 files changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index 93dbe0db..779671cd 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 12
|
||||
+#define PATCHLEVEL 13
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
diff --git a/redir.c b/redir.c
|
||||
index 25488eaf..1858b0b0 100644
|
||||
--- a/redir.c
|
||||
+++ b/redir.c
|
||||
@@ -469,6 +469,8 @@ here_document_to_fd (redirectee, ri)
|
||||
return (fd);
|
||||
}
|
||||
|
||||
+ SET_CLOSE_ON_EXEC (fd);
|
||||
+
|
||||
errno = r = 0; /* XXX */
|
||||
/* write_here_document returns 0 on success, errno on failure. */
|
||||
if (redirectee->word)
|
||||
--
|
||||
2.13.6
|
||||
|
85
bash-4.4-patch-14.patch
Normal file
85
bash-4.4-patch-14.patch
Normal file
@ -0,0 +1,85 @@
|
||||
From 2fb21d75bfddd724b0e45d4a51455a166467e496 Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Mon, 29 Jan 2018 16:03:47 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 14
|
||||
|
||||
---
|
||||
execute_cmd.c | 19 ++++++++++++++++---
|
||||
patchlevel.h | 2 +-
|
||||
2 files changed, 17 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/execute_cmd.c b/execute_cmd.c
|
||||
index 2a3df6d6..76a80766 100644
|
||||
--- a/execute_cmd.c
|
||||
+++ b/execute_cmd.c
|
||||
@@ -726,6 +726,8 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
|
||||
{
|
||||
ofifo = num_fifos ();
|
||||
ofifo_list = copy_fifo_list ((int *)&osize);
|
||||
+ begin_unwind_frame ("internal_fifos");
|
||||
+ add_unwind_protect (xfree, ofifo_list);
|
||||
saved_fifo = 1;
|
||||
}
|
||||
else
|
||||
@@ -741,7 +743,10 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
|
||||
dispose_exec_redirects ();
|
||||
#if defined (PROCESS_SUBSTITUTION)
|
||||
if (saved_fifo)
|
||||
- free ((void *)ofifo_list);
|
||||
+ {
|
||||
+ free ((void *)ofifo_list);
|
||||
+ discard_unwind_frame ("internal_fifos");
|
||||
+ }
|
||||
#endif
|
||||
return (last_command_exit_value = EXECUTION_FAILURE);
|
||||
}
|
||||
@@ -1060,6 +1065,7 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
|
||||
if (nfifo > ofifo)
|
||||
close_new_fifos ((char *)ofifo_list, osize);
|
||||
free ((void *)ofifo_list);
|
||||
+ discard_unwind_frame ("internal_fifos");
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -4977,9 +4983,14 @@ execute_builtin_or_function (words, builtin, var, redirects,
|
||||
char *ofifo_list;
|
||||
#endif
|
||||
|
||||
-#if defined (PROCESS_SUBSTITUTION)
|
||||
+#if defined (PROCESS_SUBSTITUTION)
|
||||
+ begin_unwind_frame ("saved_fifos");
|
||||
+ /* If we return, we longjmp and don't get a chance to restore the old
|
||||
+ fifo list, so we add an unwind protect to free it */
|
||||
ofifo = num_fifos ();
|
||||
ofifo_list = copy_fifo_list (&osize);
|
||||
+ if (ofifo_list)
|
||||
+ add_unwind_protect (xfree, ofifo_list);
|
||||
#endif
|
||||
|
||||
if (do_redirections (redirects, RX_ACTIVE|RX_UNDOABLE) != 0)
|
||||
@@ -5063,7 +5074,9 @@ execute_builtin_or_function (words, builtin, var, redirects,
|
||||
nfifo = num_fifos ();
|
||||
if (nfifo > ofifo)
|
||||
close_new_fifos (ofifo_list, osize);
|
||||
- free (ofifo_list);
|
||||
+ if (ofifo_list)
|
||||
+ free (ofifo_list);
|
||||
+ discard_unwind_frame ("saved_fifos");
|
||||
#endif
|
||||
|
||||
return (result);
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index 779671cd..09a3cc84 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 13
|
||||
+#define PATCHLEVEL 14
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
--
|
||||
2.13.6
|
||||
|
38
bash-4.4-patch-15.patch
Normal file
38
bash-4.4-patch-15.patch
Normal file
@ -0,0 +1,38 @@
|
||||
From 9cce630e80008e74fa9a1d9408367341caf363f2 Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Mon, 29 Jan 2018 16:04:01 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 15
|
||||
|
||||
---
|
||||
patchlevel.h | 2 +-
|
||||
subst.c | 2 ++
|
||||
2 files changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index 09a3cc84..6e9ed3fc 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 14
|
||||
+#define PATCHLEVEL 15
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
diff --git a/subst.c b/subst.c
|
||||
index dbf0157e..fc00cab0 100644
|
||||
--- a/subst.c
|
||||
+++ b/subst.c
|
||||
@@ -5906,6 +5906,8 @@ process_substitute (string, open_for_read_in_child)
|
||||
parent. */
|
||||
expanding_redir = 0;
|
||||
|
||||
+ remove_quoted_escapes (string);
|
||||
+
|
||||
subshell_level++;
|
||||
result = parse_and_execute (string, "process substitution", (SEVAL_NONINT|SEVAL_NOHIST));
|
||||
subshell_level--;
|
||||
--
|
||||
2.13.6
|
||||
|
68
bash-4.4-patch-16.patch
Normal file
68
bash-4.4-patch-16.patch
Normal file
@ -0,0 +1,68 @@
|
||||
From c9f1b04651dae16e33f0aa8974c5122e26b362ae Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Mon, 29 Jan 2018 16:04:20 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 16
|
||||
|
||||
---
|
||||
lib/sh/zread.c | 23 +++++++++--------------
|
||||
patchlevel.h | 2 +-
|
||||
2 files changed, 10 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/lib/sh/zread.c b/lib/sh/zread.c
|
||||
index 868f9705..496f20b8 100644
|
||||
--- a/lib/sh/zread.c
|
||||
+++ b/lib/sh/zread.c
|
||||
@@ -37,7 +37,10 @@ extern int errno;
|
||||
# define SEEK_CUR 1
|
||||
#endif
|
||||
|
||||
+extern int executing_builtin;
|
||||
+
|
||||
extern void check_signals_and_traps (void);
|
||||
+extern void check_signals (void);
|
||||
extern int signal_is_trapped (int);
|
||||
|
||||
/* Read LEN bytes from FD into BUF. Retry the read on EINTR. Any other
|
||||
@@ -50,21 +53,13 @@ zread (fd, buf, len)
|
||||
{
|
||||
ssize_t r;
|
||||
|
||||
-#if 0
|
||||
-#if defined (HAVE_SIGINTERRUPT)
|
||||
- if (signal_is_trapped (SIGCHLD))
|
||||
- siginterrupt (SIGCHLD, 1);
|
||||
-#endif
|
||||
-#endif
|
||||
-
|
||||
while ((r = read (fd, buf, len)) < 0 && errno == EINTR)
|
||||
- check_signals_and_traps (); /* XXX - should it be check_signals()? */
|
||||
-
|
||||
-#if 0
|
||||
-#if defined (HAVE_SIGINTERRUPT)
|
||||
- siginterrupt (SIGCHLD, 0);
|
||||
-#endif
|
||||
-#endif
|
||||
+ /* XXX - bash-5.0 */
|
||||
+ /* We check executing_builtin and run traps here for backwards compatibility */
|
||||
+ if (executing_builtin)
|
||||
+ check_signals_and_traps (); /* XXX - should it be check_signals()? */
|
||||
+ else
|
||||
+ check_signals ();
|
||||
|
||||
return r;
|
||||
}
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index 6e9ed3fc..9074f4dd 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 15
|
||||
+#define PATCHLEVEL 16
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
--
|
||||
2.13.6
|
||||
|
41
bash-4.4-patch-17.patch
Normal file
41
bash-4.4-patch-17.patch
Normal file
@ -0,0 +1,41 @@
|
||||
From b3a5ec8dd510a68dc850f3f516c0cf9afd87451f Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Mon, 29 Jan 2018 16:04:37 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 17
|
||||
|
||||
---
|
||||
builtins/read.def | 5 +++++
|
||||
patchlevel.h | 2 +-
|
||||
2 files changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/builtins/read.def b/builtins/read.def
|
||||
index 33821f3f..803bea35 100644
|
||||
--- a/builtins/read.def
|
||||
+++ b/builtins/read.def
|
||||
@@ -690,6 +690,11 @@ add_char:
|
||||
input_string[i] = '\0';
|
||||
CHECK_ALRM;
|
||||
|
||||
+#if defined (READLINE)
|
||||
+ if (edit)
|
||||
+ free (rlbuf);
|
||||
+#endif
|
||||
+
|
||||
if (retval < 0)
|
||||
{
|
||||
t_errno = errno;
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index 9074f4dd..98e714da 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 16
|
||||
+#define PATCHLEVEL 17
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
--
|
||||
2.13.6
|
||||
|
38
bash-4.4-patch-18.patch
Normal file
38
bash-4.4-patch-18.patch
Normal file
@ -0,0 +1,38 @@
|
||||
From eb78197af36bb0fb95493ebf8fce104be6832ec9 Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Mon, 29 Jan 2018 16:04:56 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 18
|
||||
|
||||
---
|
||||
builtins/read.def | 2 +-
|
||||
patchlevel.h | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/builtins/read.def b/builtins/read.def
|
||||
index 803bea35..b54b3af6 100644
|
||||
--- a/builtins/read.def
|
||||
+++ b/builtins/read.def
|
||||
@@ -610,7 +610,7 @@ read_builtin (list)
|
||||
}
|
||||
|
||||
CHECK_ALRM;
|
||||
-
|
||||
+ QUIT; /* in case we didn't call check_signals() */
|
||||
#if defined (READLINE)
|
||||
}
|
||||
#endif
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index 98e714da..f0ee56e4 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 17
|
||||
+#define PATCHLEVEL 18
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
--
|
||||
2.13.6
|
||||
|
40
bash-4.4-patch-19.patch
Normal file
40
bash-4.4-patch-19.patch
Normal file
@ -0,0 +1,40 @@
|
||||
From b0776d8c49ab4310fa056ce1033985996c5b9807 Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Tue, 6 Feb 2018 16:22:34 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 19
|
||||
|
||||
---
|
||||
lib/readline/display.c | 4 +++-
|
||||
patchlevel.h | 2 +-
|
||||
2 files changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/lib/readline/display.c b/lib/readline/display.c
|
||||
index 41fb0531..2d2e768a 100644
|
||||
--- a/lib/readline/display.c
|
||||
+++ b/lib/readline/display.c
|
||||
@@ -771,7 +771,9 @@ rl_redisplay ()
|
||||
appear in the first and last lines of the prompt */
|
||||
wadjust = (newlines == 0)
|
||||
? prompt_invis_chars_first_line
|
||||
- : ((newlines == prompt_lines_estimate) ? wrap_offset : prompt_invis_chars_first_line);
|
||||
+ : ((newlines == prompt_lines_estimate)
|
||||
+ ? (wrap_offset - prompt_invis_chars_first_line)
|
||||
+ : 0);
|
||||
|
||||
/* fix from Darin Johnson <darin@acuson.com> for prompt string with
|
||||
invisible characters that is longer than the screen width. The
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index f0ee56e4..a711c495 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 18
|
||||
+#define PATCHLEVEL 19
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
--
|
||||
2.13.6
|
||||
|
59
bash-4.4-patch-2.patch
Normal file
59
bash-4.4-patch-2.patch
Normal file
@ -0,0 +1,59 @@
|
||||
From 280bd77d8d3e7f7c90c9fa07de3d1e8f8e18ac29 Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Mon, 14 Nov 2016 14:27:06 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 2
|
||||
|
||||
---
|
||||
patchlevel.h | 2 +-
|
||||
subst.c | 9 ++++++++-
|
||||
2 files changed, 9 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index 40db1a3..a988d85 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 1
|
||||
+#define PATCHLEVEL 2
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
diff --git a/subst.c b/subst.c
|
||||
index f1a4df1..4d498ef 100644
|
||||
--- a/subst.c
|
||||
+++ b/subst.c
|
||||
@@ -5931,6 +5931,7 @@ read_comsub (fd, quoted, rflag)
|
||||
char *istring, buf[128], *bufp, *s;
|
||||
int istring_index, istring_size, c, tflag, skip_ctlesc, skip_ctlnul;
|
||||
ssize_t bufn;
|
||||
+ int nullbyte;
|
||||
|
||||
istring = (char *)NULL;
|
||||
istring_index = istring_size = bufn = tflag = 0;
|
||||
@@ -5938,6 +5939,8 @@ read_comsub (fd, quoted, rflag)
|
||||
for (skip_ctlesc = skip_ctlnul = 0, s = ifs_value; s && *s; s++)
|
||||
skip_ctlesc |= *s == CTLESC, skip_ctlnul |= *s == CTLNUL;
|
||||
|
||||
+ nullbyte = 0;
|
||||
+
|
||||
/* Read the output of the command through the pipe. This may need to be
|
||||
changed to understand multibyte characters in the future. */
|
||||
while (1)
|
||||
@@ -5956,7 +5959,11 @@ read_comsub (fd, quoted, rflag)
|
||||
if (c == 0)
|
||||
{
|
||||
#if 1
|
||||
- internal_warning ("%s", _("command substitution: ignored null byte in input"));
|
||||
+ if (nullbyte == 0)
|
||||
+ {
|
||||
+ internal_warning ("%s", _("command substitution: ignored null byte in input"));
|
||||
+ nullbyte = 1;
|
||||
+ }
|
||||
#endif
|
||||
continue;
|
||||
}
|
||||
--
|
||||
2.9.3
|
||||
|
136
bash-4.4-patch-20.patch
Normal file
136
bash-4.4-patch-20.patch
Normal file
@ -0,0 +1,136 @@
|
||||
From 354efb96f1e4574f458e994163bbe31c76769573 Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Fri, 1 Jun 2018 10:19:56 -0400
|
||||
Subject: [PATCH] saved background process status hash table loop fixes
|
||||
|
||||
---
|
||||
jobs.c | 62 +++++++++++++++++++++++++++++++++++++++++-----------
|
||||
patchlevel.h | 2 +-
|
||||
2 files changed, 50 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/jobs.c b/jobs.c
|
||||
index fc966036..2684632d 100644
|
||||
--- a/jobs.c
|
||||
+++ b/jobs.c
|
||||
@@ -812,8 +812,22 @@ bgp_add (pid, status)
|
||||
ps_index_t *bucket, psi;
|
||||
struct pidstat *ps;
|
||||
|
||||
- bucket = pshash_getbucket (pid);
|
||||
- psi = bgp_getindex ();
|
||||
+ /* bucket == existing chain of pids hashing to same value
|
||||
+ psi = where were going to put this pid/status */
|
||||
+
|
||||
+ bucket = pshash_getbucket (pid); /* index into pidstat_table */
|
||||
+ psi = bgp_getindex (); /* bgpids.head, index into storage */
|
||||
+
|
||||
+ /* XXX - what if psi == *bucket? */
|
||||
+ if (psi == *bucket)
|
||||
+ {
|
||||
+#ifdef DEBUG
|
||||
+ internal_warning ("hashed pid %d (pid %d) collides with bgpids.head, skipping", psi, pid);
|
||||
+#endif
|
||||
+ bgpids.storage[psi].pid = NO_PID; /* make sure */
|
||||
+ psi = bgp_getindex (); /* skip to next one */
|
||||
+ }
|
||||
+
|
||||
ps = &bgpids.storage[psi];
|
||||
|
||||
ps->pid = pid;
|
||||
@@ -841,32 +855,47 @@ pshash_delindex (psi)
|
||||
ps_index_t psi;
|
||||
{
|
||||
struct pidstat *ps;
|
||||
+ ps_index_t *bucket;
|
||||
|
||||
ps = &bgpids.storage[psi];
|
||||
if (ps->pid == NO_PID)
|
||||
return;
|
||||
|
||||
- if (ps->bucket_next != NO_PID)
|
||||
+ if (ps->bucket_next != NO_PIDSTAT)
|
||||
bgpids.storage[ps->bucket_next].bucket_prev = ps->bucket_prev;
|
||||
- if (ps->bucket_prev != NO_PID)
|
||||
+ if (ps->bucket_prev != NO_PIDSTAT)
|
||||
bgpids.storage[ps->bucket_prev].bucket_next = ps->bucket_next;
|
||||
else
|
||||
- *(pshash_getbucket (ps->pid)) = ps->bucket_next;
|
||||
+ {
|
||||
+ bucket = pshash_getbucket (ps->pid);
|
||||
+ *bucket = ps->bucket_next; /* deleting chain head in hash table */
|
||||
+ }
|
||||
+
|
||||
+ /* clear out this cell, just in case */
|
||||
+ ps->pid = NO_PID;
|
||||
+ ps->bucket_next = ps->bucket_prev = NO_PIDSTAT;
|
||||
}
|
||||
|
||||
static int
|
||||
bgp_delete (pid)
|
||||
pid_t pid;
|
||||
{
|
||||
- ps_index_t psi;
|
||||
+ ps_index_t psi, orig_psi;
|
||||
|
||||
if (bgpids.storage == 0 || bgpids.nalloc == 0 || bgpids.npid == 0)
|
||||
return 0;
|
||||
|
||||
/* Search chain using hash to find bucket in pidstat_table */
|
||||
- for (psi = *(pshash_getbucket (pid)); psi != NO_PIDSTAT; psi = bgpids.storage[psi].bucket_next)
|
||||
- if (bgpids.storage[psi].pid == pid)
|
||||
- break;
|
||||
+ for (orig_psi = psi = *(pshash_getbucket (pid)); psi != NO_PIDSTAT; psi = bgpids.storage[psi].bucket_next)
|
||||
+ {
|
||||
+ if (bgpids.storage[psi].pid == pid)
|
||||
+ break;
|
||||
+ if (orig_psi == bgpids.storage[psi].bucket_next) /* catch reported bug */
|
||||
+ {
|
||||
+ internal_warning ("bgp_delete: LOOP: psi (%d) == storage[psi].bucket_next", psi);
|
||||
+ return 0;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
if (psi == NO_PIDSTAT)
|
||||
return 0; /* not found */
|
||||
@@ -904,15 +933,22 @@ static int
|
||||
bgp_search (pid)
|
||||
pid_t pid;
|
||||
{
|
||||
- ps_index_t psi;
|
||||
+ ps_index_t psi, orig_psi;
|
||||
|
||||
if (bgpids.storage == 0 || bgpids.nalloc == 0 || bgpids.npid == 0)
|
||||
return -1;
|
||||
|
||||
/* Search chain using hash to find bucket in pidstat_table */
|
||||
- for (psi = *(pshash_getbucket (pid)); psi != NO_PIDSTAT; psi = bgpids.storage[psi].bucket_next)
|
||||
- if (bgpids.storage[psi].pid == pid)
|
||||
- return (bgpids.storage[psi].status);
|
||||
+ for (orig_psi = psi = *(pshash_getbucket (pid)); psi != NO_PIDSTAT; psi = bgpids.storage[psi].bucket_next)
|
||||
+ {
|
||||
+ if (bgpids.storage[psi].pid == pid)
|
||||
+ return (bgpids.storage[psi].status);
|
||||
+ if (orig_psi == bgpids.storage[psi].bucket_next) /* catch reported bug */
|
||||
+ {
|
||||
+ internal_warning ("bgp_search: LOOP: psi (%d) == storage[psi].bucket_next", psi);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
return -1;
|
||||
}
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index a711c495..4a65dc0f 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 19
|
||||
+#define PATCHLEVEL 20
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
--
|
||||
2.29.2
|
||||
|
52
bash-4.4-patch-3.patch
Normal file
52
bash-4.4-patch-3.patch
Normal file
@ -0,0 +1,52 @@
|
||||
From 4f59a8babc53a9f975078c4a003bdc8831c5ee22 Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Mon, 14 Nov 2016 14:27:23 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 3
|
||||
|
||||
---
|
||||
lib/glob/sm_loop.c | 9 +++++++++
|
||||
patchlevel.h | 2 +-
|
||||
2 files changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/glob/sm_loop.c b/lib/glob/sm_loop.c
|
||||
index c3a2aa3..65179e2 100644
|
||||
--- a/lib/glob/sm_loop.c
|
||||
+++ b/lib/glob/sm_loop.c
|
||||
@@ -330,6 +330,12 @@ PARSE_COLLSYM (p, vp)
|
||||
for (pc = 0; p[pc]; pc++)
|
||||
if (p[pc] == L('.') && p[pc+1] == L(']'))
|
||||
break;
|
||||
+ if (p[pc] == 0)
|
||||
+ {
|
||||
+ if (vp)
|
||||
+ *vp = INVALID;
|
||||
+ return (p + pc);
|
||||
+ }
|
||||
val = COLLSYM (p, pc);
|
||||
if (vp)
|
||||
*vp = val;
|
||||
@@ -483,6 +489,9 @@ BRACKMATCH (p, test, flags)
|
||||
c = *p++;
|
||||
c = FOLD (c);
|
||||
|
||||
+ if (c == L('\0'))
|
||||
+ return ((test == L('[')) ? savep : (CHAR *)0);
|
||||
+
|
||||
if ((flags & FNM_PATHNAME) && c == L('/'))
|
||||
/* [/] can never match when matching a pathname. */
|
||||
return (CHAR *)0;
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index a988d85..e7e960c 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 2
|
||||
+#define PATCHLEVEL 3
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
--
|
||||
2.9.3
|
||||
|
81
bash-4.4-patch-4.patch
Normal file
81
bash-4.4-patch-4.patch
Normal file
@ -0,0 +1,81 @@
|
||||
From 2965eca924466a48c5597ac5c6c86d470e718908 Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Mon, 14 Nov 2016 14:27:35 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 4
|
||||
|
||||
---
|
||||
jobs.c | 15 +++++++++++++++
|
||||
jobs.h | 1 +
|
||||
patchlevel.h | 2 +-
|
||||
subst.c | 5 +----
|
||||
4 files changed, 18 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/jobs.c b/jobs.c
|
||||
index cef3c79..fc96603 100644
|
||||
--- a/jobs.c
|
||||
+++ b/jobs.c
|
||||
@@ -453,6 +453,21 @@ cleanup_the_pipeline ()
|
||||
discard_pipeline (disposer);
|
||||
}
|
||||
|
||||
+void
|
||||
+discard_last_procsub_child ()
|
||||
+{
|
||||
+ PROCESS *disposer;
|
||||
+ sigset_t set, oset;
|
||||
+
|
||||
+ BLOCK_CHILD (set, oset);
|
||||
+ disposer = last_procsub_child;
|
||||
+ last_procsub_child = (PROCESS *)NULL;
|
||||
+ UNBLOCK_CHILD (oset);
|
||||
+
|
||||
+ if (disposer)
|
||||
+ discard_pipeline (disposer);
|
||||
+}
|
||||
+
|
||||
struct pipeline_saver *
|
||||
alloc_pipeline_saver ()
|
||||
{
|
||||
diff --git a/jobs.h b/jobs.h
|
||||
index 4ba3513..6df0607 100644
|
||||
--- a/jobs.h
|
||||
+++ b/jobs.h
|
||||
@@ -190,6 +190,7 @@ extern JOB **jobs;
|
||||
extern void making_children __P((void));
|
||||
extern void stop_making_children __P((void));
|
||||
extern void cleanup_the_pipeline __P((void));
|
||||
+extern void discard_last_procsub_child __P((void));
|
||||
extern void save_pipeline __P((int));
|
||||
extern PROCESS *restore_pipeline __P((int));
|
||||
extern void start_pipeline __P((void));
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index e7e960c..c059f0b 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 3
|
||||
+#define PATCHLEVEL 4
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
diff --git a/subst.c b/subst.c
|
||||
index 4d498ef..298187d 100644
|
||||
--- a/subst.c
|
||||
+++ b/subst.c
|
||||
@@ -5808,10 +5808,7 @@ process_substitute (string, open_for_read_in_child)
|
||||
{
|
||||
#if defined (JOB_CONTROL)
|
||||
if (last_procsub_child)
|
||||
- {
|
||||
- discard_pipeline (last_procsub_child);
|
||||
- last_procsub_child = (PROCESS *)NULL;
|
||||
- }
|
||||
+ discard_last_procsub_child ();
|
||||
last_procsub_child = restore_pipeline (0);
|
||||
#endif
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
42
bash-4.4-patch-5.patch
Normal file
42
bash-4.4-patch-5.patch
Normal file
@ -0,0 +1,42 @@
|
||||
From f459cbd8be37b28be1dc90315e0ab51d7f211301 Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Mon, 14 Nov 2016 14:27:55 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 5
|
||||
|
||||
---
|
||||
builtins/evalstring.c | 3 ---
|
||||
patchlevel.h | 2 +-
|
||||
2 files changed, 1 insertion(+), 4 deletions(-)
|
||||
|
||||
diff --git a/builtins/evalstring.c b/builtins/evalstring.c
|
||||
index e221591..6dc756c 100644
|
||||
--- a/builtins/evalstring.c
|
||||
+++ b/builtins/evalstring.c
|
||||
@@ -104,12 +104,9 @@ should_suppress_fork (command)
|
||||
running_trap == 0 &&
|
||||
*bash_input.location.string == '\0' &&
|
||||
command->type == cm_simple &&
|
||||
-#if 0
|
||||
signal_is_trapped (EXIT_TRAP) == 0 &&
|
||||
signal_is_trapped (ERROR_TRAP) == 0 &&
|
||||
-#else
|
||||
any_signals_trapped () < 0 &&
|
||||
-#endif
|
||||
command->redirects == 0 && command->value.Simple->redirects == 0 &&
|
||||
((command->flags & CMD_TIME_PIPELINE) == 0) &&
|
||||
((command->flags & CMD_INVERT_RETURN) == 0));
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index c059f0b..1bc098b 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 4
|
||||
+#define PATCHLEVEL 5
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
--
|
||||
2.9.3
|
||||
|
50
bash-4.4-patch-6.patch
Normal file
50
bash-4.4-patch-6.patch
Normal file
@ -0,0 +1,50 @@
|
||||
From 44bfefc553993613c0aff992bc4f3078d738ee1d Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Fri, 20 Jan 2017 11:47:31 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 6
|
||||
|
||||
---
|
||||
builtins/pushd.def | 7 ++++++-
|
||||
patchlevel.h | 2 +-
|
||||
2 files changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/builtins/pushd.def b/builtins/pushd.def
|
||||
index 82653c4..6579e4c 100644
|
||||
--- a/builtins/pushd.def
|
||||
+++ b/builtins/pushd.def
|
||||
@@ -365,7 +365,7 @@ popd_builtin (list)
|
||||
break;
|
||||
}
|
||||
|
||||
- if (which > directory_list_offset || (directory_list_offset == 0 && which == 0))
|
||||
+ if (which > directory_list_offset || (which < -directory_list_offset) || (directory_list_offset == 0 && which == 0))
|
||||
{
|
||||
pushd_error (directory_list_offset, which_word ? which_word : "");
|
||||
return (EXECUTION_FAILURE);
|
||||
@@ -387,6 +387,11 @@ popd_builtin (list)
|
||||
remove that directory from the list and shift the remainder
|
||||
of the list into place. */
|
||||
i = (direction == '+') ? directory_list_offset - which : which;
|
||||
+ if (i < 0 || i > directory_list_offset)
|
||||
+ {
|
||||
+ pushd_error (directory_list_offset, which_word ? which_word : "");
|
||||
+ return (EXECUTION_FAILURE);
|
||||
+ }
|
||||
free (pushd_directory_list[i]);
|
||||
directory_list_offset--;
|
||||
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index 1bc098b..14bff9f 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 5
|
||||
+#define PATCHLEVEL 6
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
--
|
||||
2.9.3
|
||||
|
114
bash-4.4-patch-7.patch
Normal file
114
bash-4.4-patch-7.patch
Normal file
@ -0,0 +1,114 @@
|
||||
From 4f747edc625815f449048579f6e65869914dd715 Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Fri, 20 Jan 2017 11:47:55 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 7
|
||||
|
||||
---
|
||||
bashline.c | 22 ++++++++++++----------
|
||||
patchlevel.h | 2 +-
|
||||
subst.c | 4 ++++
|
||||
3 files changed, 17 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/bashline.c b/bashline.c
|
||||
index f4fe9f1..0275844 100644
|
||||
--- a/bashline.c
|
||||
+++ b/bashline.c
|
||||
@@ -142,7 +142,7 @@ static int executable_completion __P((const char *, int));
|
||||
static rl_icppfunc_t *save_directory_hook __P((void));
|
||||
static void restore_directory_hook __P((rl_icppfunc_t));
|
||||
|
||||
-static int directory_exists __P((const char *));
|
||||
+static int directory_exists __P((const char *, int));
|
||||
|
||||
static void cleanup_expansion_error __P((void));
|
||||
static void maybe_make_readline_line __P((char *));
|
||||
@@ -3102,18 +3102,20 @@ restore_directory_hook (hookf)
|
||||
rl_directory_rewrite_hook = hookf;
|
||||
}
|
||||
|
||||
-/* Check whether not the (dequoted) version of DIRNAME, with any trailing slash
|
||||
- removed, exists. */
|
||||
+/* Check whether not DIRNAME, with any trailing slash removed, exists. If
|
||||
+ SHOULD_DEQUOTE is non-zero, we dequote the directory name first. */
|
||||
static int
|
||||
-directory_exists (dirname)
|
||||
+directory_exists (dirname, should_dequote)
|
||||
const char *dirname;
|
||||
+ int should_dequote;
|
||||
{
|
||||
char *new_dirname;
|
||||
int dirlen, r;
|
||||
struct stat sb;
|
||||
|
||||
- /* First, dequote the directory name */
|
||||
- new_dirname = bash_dequote_filename ((char *)dirname, rl_completion_quote_character);
|
||||
+ /* We save the string and chop the trailing slash because stat/lstat behave
|
||||
+ inconsistently if one is present. */
|
||||
+ new_dirname = should_dequote ? bash_dequote_filename ((char *)dirname, rl_completion_quote_character) : savestring (dirname);
|
||||
dirlen = STRLEN (new_dirname);
|
||||
if (new_dirname[dirlen - 1] == '/')
|
||||
new_dirname[dirlen - 1] = '\0';
|
||||
@@ -3145,7 +3147,7 @@ bash_filename_stat_hook (dirname)
|
||||
else if (t = mbschr (local_dirname, '`')) /* XXX */
|
||||
should_expand_dirname = '`';
|
||||
|
||||
- if (should_expand_dirname && directory_exists (local_dirname))
|
||||
+ if (should_expand_dirname && directory_exists (local_dirname, 0))
|
||||
should_expand_dirname = 0;
|
||||
|
||||
if (should_expand_dirname)
|
||||
@@ -3155,7 +3157,7 @@ bash_filename_stat_hook (dirname)
|
||||
have to worry about restoring this setting. */
|
||||
global_nounset = unbound_vars_is_error;
|
||||
unbound_vars_is_error = 0;
|
||||
- wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_COMPLETE); /* does the right thing */
|
||||
+ wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_NOPROCSUB|W_COMPLETE); /* does the right thing */
|
||||
unbound_vars_is_error = global_nounset;
|
||||
if (wl)
|
||||
{
|
||||
@@ -3244,13 +3246,13 @@ bash_directory_completion_hook (dirname)
|
||||
should_expand_dirname = '`';
|
||||
}
|
||||
|
||||
- if (should_expand_dirname && directory_exists (local_dirname))
|
||||
+ if (should_expand_dirname && directory_exists (local_dirname, 1))
|
||||
should_expand_dirname = 0;
|
||||
|
||||
if (should_expand_dirname)
|
||||
{
|
||||
new_dirname = savestring (local_dirname);
|
||||
- wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_COMPLETE); /* does the right thing */
|
||||
+ wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB|W_NOPROCSUB|W_COMPLETE); /* does the right thing */
|
||||
if (wl)
|
||||
{
|
||||
*dirname = string_list (wl);
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index 14bff9f..deb9c5b 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 6
|
||||
+#define PATCHLEVEL 7
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
diff --git a/subst.c b/subst.c
|
||||
index 298187d..027a13e 100644
|
||||
--- a/subst.c
|
||||
+++ b/subst.c
|
||||
@@ -9458,6 +9458,10 @@ add_twochars:
|
||||
tword->flags |= word->flags & (W_ASSIGNARG|W_ASSIGNRHS); /* affects $@ */
|
||||
if (word->flags & W_COMPLETE)
|
||||
tword->flags |= W_COMPLETE; /* for command substitutions */
|
||||
+ if (word->flags & W_NOCOMSUB)
|
||||
+ tword->flags |= W_NOCOMSUB;
|
||||
+ if (word->flags & W_NOPROCSUB)
|
||||
+ tword->flags |= W_NOPROCSUB;
|
||||
|
||||
temp = (char *)NULL;
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
71
bash-4.4-patch-8.patch
Normal file
71
bash-4.4-patch-8.patch
Normal file
@ -0,0 +1,71 @@
|
||||
From b9f81c2977b82490cd4dc70b0bb292bfbf86bd2c Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Fri, 20 Jan 2017 15:38:10 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 8
|
||||
|
||||
---
|
||||
expr.c | 15 +++++++++------
|
||||
patchlevel.h | 2 +-
|
||||
2 files changed, 10 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/expr.c b/expr.c
|
||||
index 1ddb693..172964a 100644
|
||||
--- a/expr.c
|
||||
+++ b/expr.c
|
||||
@@ -578,24 +578,23 @@ expcond ()
|
||||
rval = cval = explor ();
|
||||
if (curtok == QUES) /* found conditional expr */
|
||||
{
|
||||
- readtok ();
|
||||
- if (curtok == 0 || curtok == COL)
|
||||
- evalerror (_("expression expected"));
|
||||
if (cval == 0)
|
||||
{
|
||||
set_noeval = 1;
|
||||
noeval++;
|
||||
}
|
||||
|
||||
+ readtok ();
|
||||
+ if (curtok == 0 || curtok == COL)
|
||||
+ evalerror (_("expression expected"));
|
||||
+
|
||||
val1 = EXP_HIGHEST ();
|
||||
|
||||
if (set_noeval)
|
||||
noeval--;
|
||||
if (curtok != COL)
|
||||
evalerror (_("`:' expected for conditional expression"));
|
||||
- readtok ();
|
||||
- if (curtok == 0)
|
||||
- evalerror (_("expression expected"));
|
||||
+
|
||||
set_noeval = 0;
|
||||
if (cval)
|
||||
{
|
||||
@@ -603,7 +602,11 @@ expcond ()
|
||||
noeval++;
|
||||
}
|
||||
|
||||
+ readtok ();
|
||||
+ if (curtok == 0)
|
||||
+ evalerror (_("expression expected"));
|
||||
val2 = expcond ();
|
||||
+
|
||||
if (set_noeval)
|
||||
noeval--;
|
||||
rval = cval ? val1 : val2;
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index deb9c5b..16c8740 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 7
|
||||
+#define PATCHLEVEL 8
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
--
|
||||
2.9.3
|
||||
|
80
bash-4.4-patch-9.patch
Normal file
80
bash-4.4-patch-9.patch
Normal file
@ -0,0 +1,80 @@
|
||||
From e59fb114e9c0436890d110cfdda4d794a63496e7 Mon Sep 17 00:00:00 2001
|
||||
From: Chet Ramey <chet.ramey@case.edu>
|
||||
Date: Fri, 20 Jan 2017 15:38:29 -0500
|
||||
Subject: [PATCH] Bash-4.4 patch 9
|
||||
|
||||
---
|
||||
lib/readline/history.c | 16 +++++++---------
|
||||
patchlevel.h | 2 +-
|
||||
2 files changed, 8 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/lib/readline/history.c b/lib/readline/history.c
|
||||
index 9ff25a7..129c57a 100644
|
||||
--- a/lib/readline/history.c
|
||||
+++ b/lib/readline/history.c
|
||||
@@ -279,6 +279,7 @@ add_history (string)
|
||||
const char *string;
|
||||
{
|
||||
HIST_ENTRY *temp;
|
||||
+ int new_length;
|
||||
|
||||
if (history_stifled && (history_length == history_max_entries))
|
||||
{
|
||||
@@ -295,13 +296,9 @@ add_history (string)
|
||||
|
||||
/* Copy the rest of the entries, moving down one slot. Copy includes
|
||||
trailing NULL. */
|
||||
-#if 0
|
||||
- for (i = 0; i < history_length; i++)
|
||||
- the_history[i] = the_history[i + 1];
|
||||
-#else
|
||||
memmove (the_history, the_history + 1, history_length * sizeof (HIST_ENTRY *));
|
||||
-#endif
|
||||
|
||||
+ new_length = history_length;
|
||||
history_base++;
|
||||
}
|
||||
else
|
||||
@@ -315,7 +312,7 @@ add_history (string)
|
||||
else
|
||||
history_size = DEFAULT_HISTORY_INITIAL_SIZE;
|
||||
the_history = (HIST_ENTRY **)xmalloc (history_size * sizeof (HIST_ENTRY *));
|
||||
- history_length = 1;
|
||||
+ new_length = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -325,14 +322,15 @@ add_history (string)
|
||||
the_history = (HIST_ENTRY **)
|
||||
xrealloc (the_history, history_size * sizeof (HIST_ENTRY *));
|
||||
}
|
||||
- history_length++;
|
||||
+ new_length = history_length + 1;
|
||||
}
|
||||
}
|
||||
|
||||
temp = alloc_history_entry ((char *)string, hist_inittime ());
|
||||
|
||||
- the_history[history_length] = (HIST_ENTRY *)NULL;
|
||||
- the_history[history_length - 1] = temp;
|
||||
+ the_history[new_length] = (HIST_ENTRY *)NULL;
|
||||
+ the_history[new_length - 1] = temp;
|
||||
+ history_length = new_length;
|
||||
}
|
||||
|
||||
/* Change the time stamp of the most recent history entry to STRING. */
|
||||
diff --git a/patchlevel.h b/patchlevel.h
|
||||
index 16c8740..02f1d60 100644
|
||||
--- a/patchlevel.h
|
||||
+++ b/patchlevel.h
|
||||
@@ -25,6 +25,6 @@
|
||||
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
|
||||
looks for to find the patch level (for the sccs version string). */
|
||||
|
||||
-#define PATCHLEVEL 8
|
||||
+#define PATCHLEVEL 9
|
||||
|
||||
#endif /* _PATCHLEVEL_H_ */
|
||||
--
|
||||
2.9.3
|
||||
|
11
bash-4.4-unset-nonblock-stdin.patch
Normal file
11
bash-4.4-unset-nonblock-stdin.patch
Normal file
@ -0,0 +1,11 @@
|
||||
diff --git a/parse.y b/parse.y
|
||||
index 85f1c4f..9d1cdf8 100644
|
||||
--- a/parse.y
|
||||
+++ b/parse.y
|
||||
@@ -1453,6 +1453,7 @@ yy_readline_get ()
|
||||
old_sigint = (SigHandler *)set_signal_handler (SIGINT, sigint_sighandler);
|
||||
}
|
||||
|
||||
+ sh_unset_nodelay_mode (fileno (rl_instream)); /* just in case */
|
||||
current_readline_line = readline (current_readline_prompt ?
|
||||
current_readline_prompt : "");
|
11
bash-4.5-test-modification-time.patch
Normal file
11
bash-4.5-test-modification-time.patch
Normal file
@ -0,0 +1,11 @@
|
||||
diff --git a/config.h.in b/config.h.in
|
||||
--- a/config.h.in
|
||||
+++ b/config.h.in
|
||||
@@ -449,6 +449,7 @@
|
||||
#undef SYS_TIME_H_DEFINES_STRUCT_TIMESPEC
|
||||
#undef PTHREAD_H_DEFINES_STRUCT_TIMESPEC
|
||||
|
||||
+#undef HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC
|
||||
#undef TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC
|
||||
#undef HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC
|
||||
#undef HAVE_STRUCT_STAT_ST_ATIMENSEC
|
95
bash-5.0-bgp-resize.patch
Normal file
95
bash-5.0-bgp-resize.patch
Normal file
@ -0,0 +1,95 @@
|
||||
diff --git a/include/typemax.h b/include/typemax.h
|
||||
--- a/include/typemax.h
|
||||
+++ b/include/typemax.h
|
||||
@@ -35,14 +35,23 @@
|
||||
# define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
|
||||
#endif
|
||||
|
||||
+#ifndef TYPE_SIGNED_MAGNITUDE
|
||||
+# define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
|
||||
+#endif
|
||||
+
|
||||
+#ifndef TYPE_WIDTH
|
||||
+# define TYPE_WIDTH(t) (sizeof (t) * CHAR_BIT)
|
||||
+#endif
|
||||
+
|
||||
#ifndef TYPE_MINIMUM
|
||||
-# define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \
|
||||
- ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) \
|
||||
- : (t) 0))
|
||||
+# define TYPE_MINIMUM(t) ((t) ~ TYPE_MAXIMUM (t))
|
||||
#endif
|
||||
|
||||
#ifndef TYPE_MAXIMUM
|
||||
-# define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t)))
|
||||
+# define TYPE_MAXIMUM(t) \
|
||||
+ ((t) (! TYPE_SIGNED (t) \
|
||||
+ ? (t) -1 \
|
||||
+ : ((((t) 1 << (TYPE_WIDTH (t) - 2)) - 1) * 2 + 1)))
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LONG_LONG
|
||||
diff --git a/jobs.c b/jobs.c
|
||||
--- a/jobs.c
|
||||
+++ b/jobs.c
|
||||
@@ -72,6 +72,8 @@
|
||||
#include "execute_cmd.h"
|
||||
#include "flags.h"
|
||||
|
||||
+#include "typemax.h"
|
||||
+
|
||||
#include "builtins/builtext.h"
|
||||
#include "builtins/common.h"
|
||||
|
||||
@@ -92,7 +94,7 @@ extern int killpg __P((pid_t, int));
|
||||
#endif
|
||||
|
||||
#if !MAX_CHILD_MAX
|
||||
-# define MAX_CHILD_MAX 8192
|
||||
+# define MAX_CHILD_MAX 32768
|
||||
#endif
|
||||
|
||||
#if !defined (DEBUG)
|
||||
@@ -751,7 +753,7 @@ stop_pipeline (async, deferred)
|
||||
static void
|
||||
bgp_resize ()
|
||||
{
|
||||
- ps_index_t nsize;
|
||||
+ ps_index_t nsize, nsize_cur, nsize_max;
|
||||
ps_index_t psi;
|
||||
|
||||
if (bgpids.nalloc == 0)
|
||||
@@ -765,11 +767,20 @@ bgp_resize ()
|
||||
else
|
||||
nsize = bgpids.nalloc;
|
||||
|
||||
- while (nsize < js.c_childmax)
|
||||
- nsize *= 2;
|
||||
+ nsize_max = TYPE_MAXIMUM (ps_index_t);
|
||||
+ nsize_cur = (ps_index_t)js.c_childmax;
|
||||
+ if (nsize_cur < 0) /* overflow */
|
||||
+ nsize_cur = MAX_CHILD_MAX;
|
||||
|
||||
- if (bgpids.nalloc < js.c_childmax)
|
||||
- {
|
||||
+ while (nsize > 0 && nsize < nsize_cur) /* > 0 should catch overflow */
|
||||
+ nsize <<= 1;
|
||||
+ if (nsize > nsize_max || nsize <= 0) /* overflow? */
|
||||
+ nsize = nsize_max;
|
||||
+ if (nsize > MAX_CHILD_MAX)
|
||||
+ nsize = nsize_max = MAX_CHILD_MAX; /* hard cap */
|
||||
+
|
||||
+ if (bgpids.nalloc < nsize_cur && bgpids.nalloc < nsize_max)
|
||||
+ {
|
||||
bgpids.storage = (struct pidstat *)xrealloc (bgpids.storage, nsize * sizeof (struct pidstat));
|
||||
|
||||
for (psi = bgpids.nalloc; psi < nsize; psi++)
|
||||
@@ -787,7 +798,7 @@ bgp_getindex ()
|
||||
{
|
||||
ps_index_t psi;
|
||||
|
||||
- if (bgpids.nalloc < js.c_childmax || bgpids.head >= bgpids.nalloc)
|
||||
+ if (bgpids.nalloc < (ps_index_t)js.c_childmax || bgpids.head >= bgpids.nalloc)
|
||||
bgp_resize ();
|
||||
|
||||
pshash_delindex (bgpids.head); /* XXX - clear before reusing */
|
41
bash-5.0-cve-2019-18276-2.patch
Normal file
41
bash-5.0-cve-2019-18276-2.patch
Normal file
@ -0,0 +1,41 @@
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index e5162c4..b82a33b 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -799,10 +799,13 @@ AC_CHECK_DECLS([confstr])
|
||||
AC_CHECK_DECLS([printf])
|
||||
AC_CHECK_DECLS([sbrk])
|
||||
AC_CHECK_DECLS([setregid])
|
||||
-AC_CHECK_DECLS[(setresuid, setresgid])
|
||||
+dnl AC_CHECK_DECLS[(setresuid])
|
||||
+dnl AC_CHECK_DECLS[(setresgid])
|
||||
AC_CHECK_DECLS([strcpy])
|
||||
AC_CHECK_DECLS([strsignal])
|
||||
|
||||
+AC_CHECK_FUNCS(setresuid setresgid)
|
||||
+
|
||||
dnl Extra test to detect the horribly broken HP/UX 11.00 strtold(3)
|
||||
AC_CHECK_DECLS([strtold], [
|
||||
AC_MSG_CHECKING([for broken strtold])
|
||||
diff --git a/shell.c b/shell.c
|
||||
index 484d8a9..5c24922 100644
|
||||
--- a/shell.c
|
||||
+++ b/shell.c
|
||||
@@ -1286,7 +1286,7 @@ disable_priv_mode ()
|
||||
{
|
||||
int e;
|
||||
|
||||
-#if HAVE_DECL_SETRESUID
|
||||
+#if HAVE_SETRESUID
|
||||
if (setresuid (current_user.uid, current_user.uid, current_user.uid) < 0)
|
||||
#else
|
||||
if (setuid (current_user.uid) < 0)
|
||||
@@ -1299,7 +1299,7 @@ disable_priv_mode ()
|
||||
exit (e);
|
||||
#endif
|
||||
}
|
||||
-#if HAVE_DECL_SETRESGID
|
||||
+#if HAVE_SETRESGID
|
||||
if (setresgid (current_user.gid, current_user.gid, current_user.gid) < 0)
|
||||
#else
|
||||
if (setgid (current_user.gid) < 0)
|
61
bash-5.0-cve-2019-18276.patch
Normal file
61
bash-5.0-cve-2019-18276.patch
Normal file
@ -0,0 +1,61 @@
|
||||
diff --git a/config.h.in b/config.h.in
|
||||
index 1a89e85..2df4786 100644
|
||||
--- a/config.h.in
|
||||
+++ b/config.h.in
|
||||
@@ -801,6 +801,14 @@
|
||||
#undef HAVE_SETREGID
|
||||
#undef HAVE_DECL_SETREGID
|
||||
|
||||
+/* Define if you have the setregid function. */
|
||||
+#undef HAVE_SETRESGID
|
||||
+#undef HAVE_DECL_SETRESGID
|
||||
+
|
||||
+/* Define if you have the setresuid function. */
|
||||
+#undef HAVE_SETRESUID
|
||||
+#undef HAVE_DECL_SETRESUID
|
||||
+
|
||||
/* Define if you have the setvbuf function. */
|
||||
#undef HAVE_SETVBUF
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index a3f6d8f..e5162c4 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -799,6 +799,7 @@ AC_CHECK_DECLS([confstr])
|
||||
AC_CHECK_DECLS([printf])
|
||||
AC_CHECK_DECLS([sbrk])
|
||||
AC_CHECK_DECLS([setregid])
|
||||
+AC_CHECK_DECLS[(setresuid, setresgid])
|
||||
AC_CHECK_DECLS([strcpy])
|
||||
AC_CHECK_DECLS([strsignal])
|
||||
|
||||
diff --git a/shell.c b/shell.c
|
||||
index 4aae182..484d8a9 100644
|
||||
--- a/shell.c
|
||||
+++ b/shell.c
|
||||
@@ -1286,7 +1286,11 @@ disable_priv_mode ()
|
||||
{
|
||||
int e;
|
||||
|
||||
+#if HAVE_DECL_SETRESUID
|
||||
+ if (setresuid (current_user.uid, current_user.uid, current_user.uid) < 0)
|
||||
+#else
|
||||
if (setuid (current_user.uid) < 0)
|
||||
+#endif
|
||||
{
|
||||
e = errno;
|
||||
sys_error (_("cannot set uid to %d: effective uid %d"), current_user.uid, current_user.euid);
|
||||
@@ -1295,7 +1299,11 @@ disable_priv_mode ()
|
||||
exit (e);
|
||||
#endif
|
||||
}
|
||||
+#if HAVE_DECL_SETRESGID
|
||||
+ if (setresgid (current_user.gid, current_user.gid, current_user.gid) < 0)
|
||||
+#else
|
||||
if (setgid (current_user.gid) < 0)
|
||||
+#endif
|
||||
sys_error (_("cannot set gid to %d: effective gid %d"), current_user.gid, current_user.egid);
|
||||
|
||||
current_user.euid = current_user.uid;
|
||||
--
|
||||
2.25.4
|
19
bash-5.0-histtimeformat-segfault.patch
Normal file
19
bash-5.0-histtimeformat-segfault.patch
Normal file
@ -0,0 +1,19 @@
|
||||
diff --git a/builtins/history.def b/builtins/history.def
|
||||
--- a/builtins/history.def
|
||||
+++ b/builtins/history.def
|
||||
@@ -256,10 +256,13 @@ histtime (hlist, histtimefmt)
|
||||
{
|
||||
static char timestr[128];
|
||||
time_t t;
|
||||
+ struct tm *tm;
|
||||
|
||||
t = history_get_time (hlist);
|
||||
- if (t)
|
||||
- strftime (timestr, sizeof (timestr), histtimefmt, localtime (&t));
|
||||
+
|
||||
+ tm = t ? localtime (&t) : 0;
|
||||
+ if (t && tm)
|
||||
+ strftime (timestr, sizeof (timestr), histtimefmt, tm);
|
||||
else if (hlist->timestamp && hlist->timestamp[0])
|
||||
snprintf (timestr, sizeof (timestr), _("%s: invalid timestamp"),
|
||||
(hlist->timestamp[0] == '#') ? hlist->timestamp + 1: hlist->timestamp);
|
12
bash-5.0-shellpid-subshell.patch
Normal file
12
bash-5.0-shellpid-subshell.patch
Normal file
@ -0,0 +1,12 @@
|
||||
diff --git a/parse.y b/parse.y
|
||||
--- a/parse.y
|
||||
+++ b/parse.y
|
||||
@@ -4193,7 +4193,7 @@ eof_error:
|
||||
|
||||
FREE (nestret);
|
||||
}
|
||||
- if MBTEST(ch == '$')
|
||||
+ if MBTEST(ch == '$' && (tflags & LEX_WASDOL) == 0)
|
||||
tflags |= LEX_WASDOL;
|
||||
else
|
||||
tflags &= ~LEX_WASDOL;
|
84
bash-5.0-syslog-history.patch
Normal file
84
bash-5.0-syslog-history.patch
Normal file
@ -0,0 +1,84 @@
|
||||
diff --git a/bashhist.c b/bashhist.c
|
||||
index 9979f99..793c81f 100644
|
||||
--- a/bashhist.c
|
||||
+++ b/bashhist.c
|
||||
@@ -754,6 +754,12 @@ extern char *shell_name;
|
||||
#define OPENLOG_OPTS 0
|
||||
#endif
|
||||
|
||||
+#if defined (SYSLOG_SHOPT)
|
||||
+int syslog_history = SYSLOG_SHOPT;
|
||||
+#else
|
||||
+int syslog_history = 1;
|
||||
+#endif
|
||||
+
|
||||
void
|
||||
bash_syslog_history (line)
|
||||
const char *line;
|
||||
@@ -851,7 +857,8 @@ bash_add_history (line)
|
||||
really_add_history (line);
|
||||
|
||||
#if defined (SYSLOG_HISTORY)
|
||||
- bash_syslog_history (line);
|
||||
+ if (syslog_history)
|
||||
+ bash_syslog_history (line);
|
||||
#endif
|
||||
|
||||
using_history ();
|
||||
diff --git a/builtins/shopt.def b/builtins/shopt.def
|
||||
index 2febb7e..38c398e 100644
|
||||
--- a/builtins/shopt.def
|
||||
+++ b/builtins/shopt.def
|
||||
@@ -118,6 +118,10 @@ extern char *shell_name;
|
||||
extern int debugging_mode;
|
||||
#endif
|
||||
|
||||
+#if defined (SYSLOG_HISTORY) && defined (SYSLOG_SHOPT)
|
||||
+extern int syslog_history;
|
||||
+#endif
|
||||
+
|
||||
static void shopt_error __P((char *));
|
||||
|
||||
static int set_shellopts_after_change __P((char *, int));
|
||||
@@ -223,6 +227,9 @@ static struct {
|
||||
#endif
|
||||
{ "shift_verbose", &print_shift_error, (shopt_set_func_t *)NULL },
|
||||
{ "sourcepath", &source_uses_path, (shopt_set_func_t *)NULL },
|
||||
+#if defined (SYSLOG_HISTORY) && defined (SYSLOG_SHOPT)
|
||||
+ { "syslog_history", &syslog_history, (shopt_set_func_t *)NULL },
|
||||
+#endif
|
||||
{ "xpg_echo", &xpg_echo, (shopt_set_func_t *)NULL },
|
||||
{ (char *)0, (int *)0, (shopt_set_func_t *)NULL }
|
||||
};
|
||||
diff --git a/config-top.h b/config-top.h
|
||||
index cb0e002..39cf6b5 100644
|
||||
--- a/config-top.h
|
||||
+++ b/config-top.h
|
||||
@@ -122,6 +122,13 @@
|
||||
# define OPENLOG_OPTS LOG_PID
|
||||
#endif
|
||||
|
||||
+/* Define if you want syslogging history to be controllable at runtime via a
|
||||
+ shell option; if defined, the value is the default for the syslog_history
|
||||
+ shopt option */
|
||||
+#if defined (SYSLOG_HISTORY)
|
||||
+#define SYSLOG_SHOPT 0
|
||||
+#endif
|
||||
+
|
||||
/* Define if you want to include code in shell.c to support wordexp(3) */
|
||||
/* #define WORDEXP_OPTION */
|
||||
|
||||
diff --git a/doc/bash.1 b/doc/bash.1
|
||||
index d6cee1d..9dfa0b3 100644
|
||||
--- a/doc/bash.1
|
||||
+++ b/doc/bash.1
|
||||
@@ -9889,6 +9889,9 @@ If set, the
|
||||
to find the directory containing the file supplied as an argument.
|
||||
This option is enabled by default.
|
||||
.TP 8
|
||||
+.B syslog_history
|
||||
+If set, command history is logged to syslog.
|
||||
+.TP 8
|
||||
.B xpg_echo
|
||||
If set, the \fBecho\fP builtin expands backslash-escape sequences
|
||||
by default.
|
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
|
||||
|
325
bash-requires.patch
Normal file
325
bash-requires.patch
Normal file
@ -0,0 +1,325 @@
|
||||
diff --git a/builtins.h b/builtins.h
|
||||
index 0cfea18..a6ef958 100644
|
||||
--- a/builtins.h
|
||||
+++ b/builtins.h
|
||||
@@ -42,6 +42,7 @@
|
||||
#define ASSIGNMENT_BUILTIN 0x10 /* This builtin takes assignment statements. */
|
||||
#define POSIX_BUILTIN 0x20 /* This builtins is special in the Posix command search order. */
|
||||
#define 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..283bfea 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,20 @@ 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 +845,9 @@ 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 +1267,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 +1663,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 c21e877..04ce845 100644
|
||||
--- a/doc/bash.1
|
||||
+++ b/doc/bash.1
|
||||
@@ -238,6 +238,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 06957b6..e3fe925 100644
|
||||
--- a/doc/bashref.texi
|
||||
+++ b/doc/bashref.texi
|
||||
@@ -6243,6 +6243,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 db863e7..5a5af32 100644
|
||||
--- a/eval.c
|
||||
+++ b/eval.c
|
||||
@@ -56,6 +56,7 @@ extern int need_here_doc;
|
||||
extern int current_command_number, current_command_line_count, line_number;
|
||||
extern int expand_aliases;
|
||||
extern char *ps0_prompt;
|
||||
+extern int rpm_requires;
|
||||
|
||||
#if defined (HAVE_POSIX_SIGNALS)
|
||||
extern sigset_t top_level_mask;
|
||||
@@ -148,7 +149,7 @@ reader_loop ()
|
||||
|
||||
if (read_command () == 0)
|
||||
{
|
||||
- if (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 b5cd405..88c7a5c 100644
|
||||
--- a/execute_cmd.c
|
||||
+++ b/execute_cmd.c
|
||||
@@ -533,6 +533,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.
|
||||
@@ -565,7 +567,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;
|
||||
@@ -5752,7 +5760,7 @@ execute_intern_function (name, funcdef)
|
||||
|
||||
if (check_identifier (name, posixly_correct) == 0)
|
||||
{
|
||||
- if (posixly_correct && interactive_shell == 0)
|
||||
+ if (posixly_correct && interactive_shell == 0 && 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 62bec82..d42dc85 100644
|
||||
--- a/execute_cmd.h
|
||||
+++ b/execute_cmd.h
|
||||
@@ -22,6 +22,8 @@
|
||||
#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 b42e9ff..a982fe0 100644
|
||||
--- a/make_cmd.c
|
||||
+++ b/make_cmd.c
|
||||
@@ -42,11 +42,15 @@
|
||||
#include "flags.h"
|
||||
#include "make_cmd.h"
|
||||
#include "dispose_cmd.h"
|
||||
+#include "execute_cmd.h"
|
||||
#include "variables.h"
|
||||
#include "subst.h"
|
||||
#include "input.h"
|
||||
#include "ocache.h"
|
||||
#include "externs.h"
|
||||
+#include "builtins.h"
|
||||
+
|
||||
+#include "builtins/common.h"
|
||||
|
||||
#if defined (JOB_CONTROL)
|
||||
#include "jobs.h"
|
||||
@@ -57,6 +61,10 @@
|
||||
extern int line_number, current_command_line_count, parser_state;
|
||||
extern int last_command_exit_value;
|
||||
extern int shell_initialized;
|
||||
+extern int rpm_requires;
|
||||
+
|
||||
+static char *alphabet_set = "abcdefghijklmnopqrstuvwxyz"
|
||||
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
|
||||
int here_doc_first_line = 0;
|
||||
|
||||
@@ -839,6 +847,27 @@ make_coproc_command (name, command)
|
||||
return (make_command (cm_coproc, (SIMPLE_COM *)temp));
|
||||
}
|
||||
|
||||
+static void
|
||||
+output_requirement (deptype, filename)
|
||||
+const char *deptype;
|
||||
+char *filename;
|
||||
+{
|
||||
+ 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. */
|
||||
@@ -856,6 +885,27 @@ 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 7f63969..a0fb7ce 100644
|
||||
--- a/shell.c
|
||||
+++ b/shell.c
|
||||
@@ -201,6 +201,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;
|
||||
|
||||
@@ -264,6 +267,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
|
||||
@@ -500,6 +504,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 ();
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
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 81224fa..ff77f09 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 3415ae3..75c48a4 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 ./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 fe27dae..10346f7 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.9.3
|
||||
|
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
|
Loading…
Reference in New Issue
Block a user