Commit d215265f authored by Rocky Automation's avatar Rocky Automation 📺
Browse files

import bash-5.1.8-2.el9

parents
063019501ef1f30fad99d2b735a7ae2ce1d11423 SOURCES/bash-5.1.tar.gz
SOURCES/bash-5.1.tar.gz
--- 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. */
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
diff --git a/config.h.in b/config.h.in
index ab316d4..11d1d68 100644
--- a/config.h.in
+++ b/config.h.in
@@ -775,6 +775,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
@@ -981,6 +984,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 2fe3e7d..f1b7f1b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -827,7 +827,7 @@ dnl checks for system calls
AC_CHECK_FUNCS(dup2 eaccess fcntl getdtablesize getentropy getgroups \
gethostname getpagesize getpeername getrandom getrlimit \
getrusage gettimeofday kill killpg lstat pselect readlink \
- select setdtablesize setitimer tcgetpgrp uname ulimit waitpid)
+ select setdtablesize 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 d2a0dd7..d2555ad 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)
@@ -5832,6 +5836,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)
@@ -5841,6 +5853,7 @@ shell_execve (command, args, env)
char *interp;
int ilen;
+ close (fd);
interp = getinterp (sample, sample_len, (int *)NULL);
ilen = strlen (interp);
errno = i;
@@ -5856,7 +5869,138 @@ shell_execve (command, args, env)
return (EX_NOEXEC);
}
#endif
- errno = i;
+#if defined (HAVE_ELF_H)
+ if (i == ENOENT
+ && sample_len > EI_NIDENT
+ && memcmp (sample, ELFMAG, SELFMAG) == 0)
+ {
+ off_t offset = -1;
+
+ /* It is an ELF file. Now determine whether it is dynamically
+ linked and if yes, get the offset of the interpreter
+ string. */
+ if (sample[EI_CLASS] == ELFCLASS32
+ && sample_len > sizeof (Elf32_Ehdr))
+ {
+ Elf32_Ehdr ehdr;
+ Elf32_Phdr *phdr;
+ int nphdr;
+
+ /* We have to copy the data since the sample buffer
+ might not be aligned correctly to be accessed as
+ an Elf32_Ehdr struct. */
+ memcpy (&ehdr, sample, sizeof (Elf32_Ehdr));
+
+ nphdr = ehdr.e_phnum;
+ phdr = (Elf32_Phdr *) malloc (nphdr * ehdr.e_phentsize);
+ if (phdr != NULL)
+ {
+#ifdef HAVE_PREAD
+ sample_len = pread (fd, phdr, nphdr * ehdr.e_phentsize,
+ ehdr.e_phoff);
+#else
+ if (lseek (fd, ehdr.e_phoff, SEEK_SET) != -1)
+ sample_len = read (fd, phdr,
+ nphdr * ehdr.e_phentsize);
+ else
+ sample_len = -1;
+#endif
+ if (sample_len == nphdr * ehdr.e_phentsize)
+ while (nphdr-- > 0)
+ if (phdr[nphdr].p_type == PT_INTERP)
+ {
+ offset = phdr[nphdr].p_offset;
+ break;
+ }
+ free (phdr);
+ }
+ }
+ else if (sample[EI_CLASS] == ELFCLASS64
+ && sample_len > sizeof (Elf64_Ehdr))
+ {
+ Elf64_Ehdr ehdr;
+ Elf64_Phdr *phdr;
+ int nphdr;
+
+ /* We have to copy the data since the sample buffer
+ might not be aligned correctly to be accessed as
+ an Elf64_Ehdr struct. */
+ memcpy (&ehdr, sample, sizeof (Elf64_Ehdr));
+
+ nphdr = ehdr.e_phnum;
+ phdr = (Elf64_Phdr *) malloc (nphdr * ehdr.e_phentsize);
+ if (phdr != NULL)
+ {
+#ifdef HAVE_PREAD
+ sample_len = pread (fd, phdr, nphdr * ehdr.e_phentsize,
+ ehdr.e_phoff);
+#else
+ if (lseek (fd, ehdr.e_phoff, SEEK_SET) != -1)
+ sample_len = read (fd, phdr,
+ nphdr * ehdr.e_phentsize);
+ else
+ sample_len = -1;
+#endif
+ if (sample_len == nphdr * ehdr.e_phentsize)
+ while (nphdr-- > 0)
+ if (phdr[nphdr].p_type == PT_INTERP)
+ {
+ offset = phdr[nphdr].p_offset;
+ break;
+ }
+ free (phdr);
+ }
+ }
+
+ if (offset != -1)
+ {
+ size_t maxlen = 0;
+ size_t actlen = 0;
+ char *interp = NULL;
+
+ do
+ {
+ if (actlen == maxlen)
+ {
+ char *newinterp = realloc (interp, maxlen += 200);
+ if (newinterp == NULL)
+ {
+ actlen = 0;
+ break;
+ }
+ interp = newinterp;
+
+#ifdef HAVE_PREAD
+ actlen = pread (fd, interp, maxlen, offset);
+#else
+ if (lseek (fd, offset, SEEK_SET) != -1)
+ actlen = read (fd, interp, maxlen);
+ else
+ actlen = -1;
+#endif
+ }
+ }
+ while (actlen > 0 && memchr (interp, '\0', actlen) == NULL);
+
+ if (actlen > 0)
+ {
+ close (fd);
+ errno = i;
+ sys_error ("%s: %s: bad ELF interpreter", command,
+ interp);
+ free (interp);
+ return (EX_NOEXEC);
+ }
+
+ free (interp);
+ }
+ }
+#endif
+#if defined (HAVE_HASH_BANG_EXEC) || defined (HAVE_ELF_H)
+ close (fd);
+#endif
+
+ errno = i;
file_error (command);
}
return (last_command_exit_value);
--- 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:
--- 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])
])
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 *
diff --git a/config-top.h b/config-top.h
index e5cc147..f5e0a52 100644
--- a/config-top.h
+++ b/config-top.h
@@ -106,7 +106,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-toggling operators (~[~]) and the
`capcase' variable attribute (declare -c). */
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);
}
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
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.
diff --git a/execute_cmd.c b/execute_cmd.c
index a988400..412128c 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -5760,7 +5760,7 @@ shell_execve (command, args, env)
Elf32_Ehdr ehdr;
Elf32_Phdr *phdr;
Elf32_Shdr *shdr;
- int nphdr, nshdr;
+ Elf32_Half nphdr, nshdr;
/* We have to copy the data since the sample buffer
might not be aligned correctly to be accessed as
@@ -5768,12 +5768,12 @@ shell_execve (command, args, env)
memcpy (&ehdr, sample, sizeof (Elf32_Ehdr));
nshdr = ehdr.e_shnum;
- shdr = (Elf32_Shdr *) malloc (nshdr * ehdr.e_shentsize);
+ shdr = (Elf32_Shdr *) malloc ((size_t)nshdr * (size_t)ehdr.e_shentsize);
if (shdr != NULL)
{
#ifdef HAVE_PREAD
- sample_len = pread (fd, shdr, nshdr * ehdr.e_shentsize,
+ sample_len = pread (fd, shdr, (size_t)nshdr * (size_t)ehdr.e_shentsize,
ehdr.e_shoff);
#else
if (lseek (fd, ehdr.e_shoff, SEEK_SET) != -1)
@@ -5815,11 +5815,11 @@ shell_execve (command, args, env)
}
nphdr = ehdr.e_phnum;
- phdr = (Elf32_Phdr *) malloc (nphdr * ehdr.e_phentsize);
+ phdr = (Elf32_Phdr *) malloc ((size_t)nphdr * (size_t)ehdr.e_phentsize);
if (phdr != NULL)
{
#ifdef HAVE_PREAD
- sample_len = pread (fd, phdr, nphdr * ehdr.e_phentsize,
+ sample_len = pread (fd, phdr, (size_t)nphdr * (size_t)ehdr.e_phentsize,
ehdr.e_phoff);
#else
if (lseek (fd, ehdr.e_phoff, SEEK_SET) != -1)
@@ -5844,7 +5844,7 @@ shell_execve (command, args, env)
Elf64_Ehdr ehdr;
Elf64_Phdr *phdr;
Elf64_Shdr *shdr;
- int nphdr, nshdr;
+ Elf32_Half nphdr, nshdr;
/* We have to copy the data since the sample buffer
might not be aligned correctly to be accessed as
@@ -5852,11 +5852,11 @@ shell_execve (command, args, env)
memcpy (&ehdr, sample, sizeof (Elf64_Ehdr));
nshdr = ehdr.e_shnum;
- shdr = (Elf64_Shdr *) malloc (nshdr * ehdr.e_shentsize);
+ shdr = (Elf64_Shdr *) malloc ((size_t)nshdr * (size_t)ehdr.e_shentsize);
if (shdr != NULL)
{