!109 sync patches from bash community and del doesn't exist PATH dirs in bashrc

From: @wangyuhang27 
Reviewed-by: @licunlong 
Signed-off-by: @licunlong
This commit is contained in:
openeuler-ci-bot 2023-10-17 09:09:32 +00:00 committed by Gitee
commit d7f5e5330c
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
5 changed files with 433 additions and 10 deletions

View File

@ -0,0 +1,81 @@
From 7f7ee0e9c6766ff5d3de542d03c59590c4a5a44a Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Mon, 17 Jul 2023 17:35:59 -0400
Subject: [PATCH] fix for leak when completing command word with glob pattern
that matches multiple files; preserve export attribute when unsetting local
variable in case it is reset; fix for using nl_langinfo when performing
charset conversions
Conflict:delete modify in MANIFEST and CWRU.chlog
Reference:https://git.savannah.gnu.org/cgit/bash.git/commit/?id=7f7ee0e9c6766ff5d3de542d03c59590c4a5a44a
---
bashline.c | 6 +++++-
lib/sh/unicode.c | 6 +++++-
variables.c | 6 ++++++
3 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/bashline.c b/bashline.c
index c69c0c5..a0e9044 100644
--- a/bashline.c
+++ b/bashline.c
@@ -2125,7 +2125,11 @@ globword:
local_index = 0;
if (glob_matches[1] && rl_completion_type == TAB) /* multiple matches are bad */
- return ((char *)NULL);
+ {
+ strvec_dispose (glob_matches);
+ glob_matches = (char **)NULL;
+ return ((char *)NULL);
+ }
}
while (val = glob_matches[local_index++])
diff --git a/lib/sh/unicode.c b/lib/sh/unicode.c
index d95d1e2..6c1a06f 100644
--- a/lib/sh/unicode.c
+++ b/lib/sh/unicode.c
@@ -35,6 +35,10 @@
# include <iconv.h>
#endif
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+
#include <xmalloc.h>
#ifndef USHORT_MAX
@@ -277,7 +281,7 @@ u32cconv (c, s)
{
#if HAVE_LOCALE_CHARSET
charset = locale_charset ();
-#elif HAVE_NL_LANGINFO
+#elif HAVE_LANGINFO_CODESET
charset = nl_langinfo (CODESET);
#else
charset = stub_charset ();
diff --git a/variables.c b/variables.c
index 2529afb..82f8311 100644
--- a/variables.c
+++ b/variables.c
@@ -3995,10 +3995,16 @@ makunbound (name, vc)
FREE (nameref_cell (old_var));
else
FREE (value_cell (old_var));
+#if 0
/* Reset the attributes. Preserve the export attribute if the variable
came from a temporary environment. Make sure it stays local, and
make it invisible. */
old_var->attributes = (exported_p (old_var) && tempvar_p (old_var)) ? att_exported : 0;
+#else /* TAG:bash-5.3 look at this again */
+ /* Reset the attributes, but preserve the export attribute.
+ Make sure it stays local, and make it invisible. */
+ old_var->attributes = exported_p (old_var) ? att_exported : 0;
+#endif
VSETATTR (old_var, att_local);
VSETATTR (old_var, att_invisible);
var_setvalue (old_var, (char *)NULL);
--
2.33.0

View File

@ -0,0 +1,277 @@
From 4e4cebb6dcf4522243b5b9e87918789aea8f73a1 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Tue, 20 Jun 2023 11:10:39 -0400
Subject: [PATCH] fix for nofork comsub command printing; fix for crash caused
by tempvar assignment converted to an array in a function
Conflict:code context adaptation and delete modify in CWRU.chlog
Reference:https://git.savannah.gnu.org/cgit/bash.git/commit/?id=4e4cebb6dcf4522243b5b9e87918789aea8f73a1
---
arrayfunc.c | 13 ++++++++++
arrayfunc.h | 2 ++
builtins/declare.def | 14 ++++++++---
print_cmd.c | 12 +++++----
shell.h | 2 ++
subst.h | 1 +
variables.c | 60 ++++++++++++++++++++++++++++++--------------
7 files changed, 76 insertions(+), 28 deletions(-)
diff --git a/arrayfunc.c b/arrayfunc.c
index 58d0222..687b7ab 100644
--- a/arrayfunc.c
+++ b/arrayfunc.c
@@ -147,6 +147,19 @@ convert_var_to_assoc (var)
return var;
}
+/* Copy the array (ARRAY *) or assoc (HASH_TABLE *) from variable V1 to V2,
+ and return V2. */
+SHELL_VAR *
+arrayvar_copyval (SHELL_VAR *v1, SHELL_VAR *v2)
+{
+ FREE (value_cell (v2));
+ if (array_p (v1))
+ var_setarray (v2, array_copy (array_cell (v1)));
+ else if (assoc_p (v1))
+ var_setassoc (v2, assoc_copy (assoc_cell (v1)));
+ return v2;
+}
+
char *
make_array_variable_value (entry, ind, key, value, flags)
SHELL_VAR *entry;
diff --git a/arrayfunc.h b/arrayfunc.h
index 838e76d..ec455fa 100644
--- a/arrayfunc.h
+++ b/arrayfunc.h
@@ -47,6 +47,8 @@ extern int array_expand_once;
extern SHELL_VAR *convert_var_to_array PARAMS((SHELL_VAR *));
extern SHELL_VAR *convert_var_to_assoc PARAMS((SHELL_VAR *));
+extern SHELL_VAR *arrayvar_copyval (SHELL_VAR *, SHELL_VAR *);
+
extern char *make_array_variable_value PARAMS((SHELL_VAR *, arrayind_t, char *, char *, int));
extern SHELL_VAR *bind_array_variable PARAMS((char *, arrayind_t, char *, int));
diff --git a/builtins/declare.def b/builtins/declare.def
index 21e4516..13f20de 100644
--- a/builtins/declare.def
+++ b/builtins/declare.def
@@ -952,20 +952,26 @@ restart_new_var_name:
if ((flags_on & (att_exported|att_readonly)) && tempvar_p (var))
{
SHELL_VAR *tv;
- char *tvalue;
tv = find_tempenv_variable (var->name);
if (tv)
{
- tvalue = var_isset (var) ? savestring (value_cell (var)) : savestring ("");
- tv = bind_variable (var->name, tvalue, 0);
+ /* We don't bother with modifying the temporary env because
+ we're already using it. */
+ tv = bind_variable (name_cell (var), value_cell (var), ASS_NOTEMPENV);
+
if (tv)
{
+#if defined (ARRAY_VARS)
+ /* copy array value if array variable */
+ if ((array_p (var) || assoc_p (var)))
+ arrayvar_copyval (var, tv);
+#endif
+ /* then copy attributes */
tv->attributes |= var->attributes & ~att_tempvar;
if (tv->context > 0)
VSETATTR (tv, att_propagate);
}
- free (tvalue);
}
VSETATTR (var, att_propagate);
}
diff --git a/print_cmd.c b/print_cmd.c
index 3c8c2d8..d497418 100644
--- a/print_cmd.c
+++ b/print_cmd.c
@@ -666,7 +666,7 @@ print_group_command (group_command)
group_command_nesting++;
cprintf ("{ ");
- if (inside_function_def == 0)
+ if (inside_function_def == 0 /* && pretty_print_mode == 0 */)
skip_this_indent++;
else
{
@@ -680,7 +680,7 @@ print_group_command (group_command)
make_command_string_internal (group_command->command);
PRINT_DEFERRED_HEREDOCS ("");
- if (inside_function_def)
+ if (inside_function_def /* || pretty_print_mode */)
{
cprintf ("\n");
indentation -= indentation_amount;
@@ -1459,9 +1459,11 @@ indent (amount)
static void
semicolon ()
{
- if (command_string_index > 0 &&
- (the_printed_command[command_string_index - 1] == '&' ||
- the_printed_command[command_string_index - 1] == '\n'))
+ if ((command_string_index > 0 &&
+ the_printed_command[command_string_index - 1] == '\n') ||
+ (command_string_index > 1 &&
+ the_printed_command[command_string_index - 1] == '&' &&
+ the_printed_command[command_string_index - 2] == ' '))
return;
cprintf (";");
}
diff --git a/shell.h b/shell.h
index 91b31ac..ebc2a26 100644
--- a/shell.h
+++ b/shell.h
@@ -106,6 +106,8 @@ extern int indirection_level;
extern int shell_compatibility_level;
extern int running_under_emacs;
+extern int pretty_print_mode;
+
extern int posixly_correct;
extern int no_line_editing;
diff --git a/subst.h b/subst.h
index 1347651..a5a5fae 100644
--- a/subst.h
+++ b/subst.h
@@ -55,6 +55,7 @@
#define ASS_NOEVAL 0x0100 /* don't evaluate value as expression */
#define ASS_NOLONGJMP 0x0200 /* don't longjmp on fatal assignment error */
#define ASS_NOINVIS 0x0400 /* don't resolve local invisible variables */
+#define ASS_NOTEMPENV 0x2000 /* don't assign into temporary environment */
/* Flags for the string extraction functions. */
#define SX_NOALLOC 0x0001 /* just skip; don't return substring */
diff --git a/variables.c b/variables.c
index 73f157f..2529afb 100644
--- a/variables.c
+++ b/variables.c
@@ -266,6 +266,8 @@ static SHELL_VAR *new_shell_variable PARAMS((const char *));
static SHELL_VAR *make_new_variable PARAMS((const char *, HASH_TABLE *));
static SHELL_VAR *bind_variable_internal PARAMS((const char *, char *, HASH_TABLE *, int, int));
+static void init_shell_variable (SHELL_VAR *);
+
static void dispose_variable_value PARAMS((SHELL_VAR *));
static void free_variable_hash_data PARAMS((PTR_T));
@@ -2702,6 +2704,21 @@ make_local_variable (name, flags)
new_var = make_new_variable (name, vc->table);
else
{
+#if 0
+ /* This handles the case where a variable is found in both the temporary
+ environment *and* declared as a local variable. If we want to avoid
+ multiple entries with the same name in VC->table (that might mess up
+ unset), we need to use the existing variable entry and destroy the
+ current value. Currently disabled because it doesn't matter -- the
+ right things happen. */
+ new_var = 0;
+ if (was_tmpvar && (new_var = hash_lookup (name, vc->table)))
+ {
+ dispose_variable_value (new_var);
+ init_variable (new_var);
+ }
+ if (new_var == 0)
+#endif
new_var = make_new_variable (name, vc->table);
/* If we found this variable in one of the temporary environments,
@@ -2761,16 +2778,9 @@ set_local_var_flags:
return (new_var);
}
-/* Create a new shell variable with name NAME. */
-static SHELL_VAR *
-new_shell_variable (name)
- const char *name;
+static void
+init_variable (SHELL_VAR *entry)
{
- SHELL_VAR *entry;
-
- entry = (SHELL_VAR *)xmalloc (sizeof (SHELL_VAR));
-
- entry->name = savestring (name);
var_setvalue (entry, (char *)NULL);
CLEAR_EXPORTSTR (entry);
@@ -2783,7 +2793,18 @@ new_shell_variable (name)
make_local_variable has the responsibility of changing the
variable context. */
entry->context = 0;
+}
+
+/* Create a new shell variable with name NAME. */
+static SHELL_VAR *
+new_shell_variable (const char *name)
+{
+ SHELL_VAR *entry;
+ entry = (SHELL_VAR *)xmalloc (sizeof (SHELL_VAR));
+
+ entry->name = savestring (name);
+ init_variable (entry);
return (entry);
}
@@ -3265,8 +3286,9 @@ bind_variable (name, value, flags)
and, if found, modify the value there before modifying it in the
shell_variables table. This allows sourced scripts to modify values
given to them in a temporary environment while modifying the variable
- value that the caller sees. */
- if (temporary_env && value) /* XXX - can value be null here? */
+ value that the caller sees. The caller can inhibit this by setting
+ ASS_NOTEMPENV in FLAGS. */
+ if (temporary_env && value && (flags & ASS_NOTEMPENV) == 0) /* XXX - can value be null here? */
bind_tempenv_variable (name, value);
/* XXX -- handle local variables here. */
@@ -4581,6 +4603,11 @@ push_temp_var (data)
v = bind_variable_internal (var->name, value_cell (var), binding_table, 0, ASS_FORCE|ASS_NOLONGJMP);
+#if defined (ARRAY_VARS)
+ if (v && (array_p (var) || assoc_p (var)))
+ arrayvar_copyval (var, v);
+#endif
+
/* XXX - should we set the context here? It shouldn't matter because of how
assign_in_env works, but we do it anyway. */
if (v)
@@ -5245,6 +5272,7 @@ push_posix_tempvar_internal (var, isbltin)
set_current_options (value_cell (var));
set_shellopts ();
}
+
/* This takes variable assignments preceding special builtins that can execute
multiple commands (source, eval, etc.) and performs the equivalent of
an assignment statement to modify the closest enclosing variable (the
@@ -5286,14 +5314,8 @@ push_posix_tempvar_internal (var, isbltin)
#if defined (ARRAY_VARS)
if (v && (array_p (var) || assoc_p (var)))
- {
- FREE (value_cell (v));
- if (array_p (var))
- var_setarray (v, array_copy (array_cell (var)));
- else
- var_setassoc (v, assoc_copy (assoc_cell (var)));
- }
-#endif
+ arrayvar_copyval (var, v);
+#endif
dispose_variable (var);
}
--
2.33.0

View File

@ -0,0 +1,31 @@
From 829aad36dbbeee462fa142fe2c571fd7ab735ba8 Mon Sep 17 00:00:00 2001
From: Chet Ramey <chet.ramey@case.edu>
Date: Mon, 26 Jun 2023 17:09:08 -0400
Subject: [PATCH] backport part of patch to fix small memleak in globbing
Conflict:backport part of patch to fix small memleak in globbing
Reference:https://git.savannah.gnu.org/cgit/bash.git/commit/?id=829aad36dbbeee462fa142fe2c571fd7ab735ba8
---
lib/glob/glob.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/lib/glob/glob.c b/lib/glob/glob.c
index eb6277f..6475814 100644
--- a/lib/glob/glob.c
+++ b/lib/glob/glob.c
@@ -1392,6 +1392,12 @@ glob_filename (pathname, flags)
free ((char *) array);
else if ((dflags & GX_ALLDIRS) && filename[0] == '*' && filename[1] == '*' && filename[2] == '\0')
free (temp_results); /* expanding ** case above */
+ else if (array == temp_results)
+ /* If array == temp_results, either we assigned it above or
+ glob_dir_to_array returned temp_results because the dirname
+ was the empty string. In any case, we assume temp_results
+ has not been freed, and free it here. */
+ free (temp_results);
if (shouldbreak)
break;
--
2.33.0

View File

@ -1,6 +1,14 @@
%if %{?openEuler:1}0
%global ENABLE_RELOC 0
%endif
%if %{ENABLE_RELOC}
%global ldflags_options -Wl,--emit-relocs
%endif
Name: bash Name: bash
Version: 5.1.8 Version: 5.1.8
Release: 9 Release: 11
Summary: It is the Bourne Again Shell Summary: It is the Bourne Again Shell
License: GPLv3 License: GPLv3
URL: https://www.gnu.org/software/bash URL: https://www.gnu.org/software/bash
@ -34,9 +42,11 @@ Patch6003: backport-Bash-5.1-patch-13-fix-tilde-expansion-after-unquoted.patch
Patch6004: backport-Bash-5.1-patch-14-fix-off-by-one-error-when-reading-.patch Patch6004: backport-Bash-5.1-patch-14-fix-off-by-one-error-when-reading-.patch
Patch6005: backport-Bash-5.1-patch-15-fix-readline-display-of-some-chara.patch Patch6005: backport-Bash-5.1-patch-15-fix-readline-display-of-some-chara.patch
Patch6006: backport-Bash-5.1-patch-16-fix-interpretation-of-multiple-ins.patch Patch6006: backport-Bash-5.1-patch-16-fix-interpretation-of-multiple-ins.patch
Patch6007: backport-changes-to-documentation-to-reduce-gender-specific-l.patch Patch6007: backport-changes-to-documentation-to-reduce-gender-specific-l.patch
Patch6008: backport-fixes-for-array-subscripts-and-values-containing-0x0.patch Patch6008: backport-fixes-for-array-subscripts-and-values-containing-0x0.patch
Patch6009: backport-fix-for-nofork-comsub-command-printing-fix-for-crash.patch
Patch6010: backport-fix-small-memleak-in-globbing.patch
Patch6011: backport-fix-for-leak-when-completing-command-word-with-glob-.patch
BuildRequires: gcc bison texinfo autoconf ncurses-devel BuildRequires: gcc bison texinfo autoconf ncurses-devel
# Required for bash tests # Required for bash tests
@ -61,13 +71,15 @@ Requires: pkgconf-pkg-config
%description devel %description devel
This package contains development files for %{name}. This package contains development files for %{name}.
%package reloc %if %{?ENABLE_RELOC}
%package relocation
Summary: Relocations for %{name} Summary: Relocations for %{name}
Requires: %{name} = %{version}-%{release} Requires: %{name} = %{version}-%{release}
BuildRequires: sysboost-devel BuildRequires: sysboost-devel
%description reloc %description relocation
This package contains relocations for %{name}. This package contains relocations for %{name}.
%endif
%package help %package help
Summary: Documents for %{name} Summary: Documents for %{name}
@ -84,13 +96,16 @@ Man pages and other related documents for %{name}.
%build %build
autoconf autoconf
%configure --with-bash-malloc=no --with-afs LDFLAGS="-Wl,--emit-relocs" %configure --with-bash-malloc=no --with-afs LDFLAGS="%{?ldflags_options}"
MFLAGS="CPPFLAGS=-D_GNU_SOURCE -DRECYCLES_PIDS -DDEFAULT_PATH_VALUE='\"/usr/local/bin:/usr/bin\"' `getconf LFS_CFLAGS`" MFLAGS="CPPFLAGS=-D_GNU_SOURCE -DRECYCLES_PIDS -DDEFAULT_PATH_VALUE='\"/usr/local/bin:/usr/bin\"' `getconf LFS_CFLAGS`"
make "$MFLAGS" version.h make "$MFLAGS" version.h
make "$MFLAGS" -C builtins make "$MFLAGS" -C builtins
%make_build "$MFLAGS" %make_build "$MFLAGS"
%if %{?ENABLE_RELOC}
objreloc $RPM_BUILD_DIR/%{name}-%{version}/bash objreloc $RPM_BUILD_DIR/%{name}-%{version}/bash
rm -rf $RPM_BUILD_DIR/%{name}-%{version}/bash.prim
%endif
%install %install
%make_install install-headers %make_install install-headers
@ -100,7 +115,10 @@ install -pDm 644 %SOURCE2 %{buildroot}/etc/skel/.bash_profile
install -pDm 644 %SOURCE3 %{buildroot}/etc/skel/.bash_logout install -pDm 644 %SOURCE3 %{buildroot}/etc/skel/.bash_logout
install -pDm 644 ./configs/alias.sh %{buildroot}%{_sysconfdir}/profile.d/alias.sh install -pDm 644 ./configs/alias.sh %{buildroot}%{_sysconfdir}/profile.d/alias.sh
install -pDm 750 $RPM_BUILD_DIR/%{name}-%{version}/bash.relocation %{buildroot}%{_bindir}/bash.relocation %if %{?ENABLE_RELOC}
mkdir -p ${RPM_BUILD_ROOT}/usr/lib/relocation/%{_bindir}
install -pDm 400 $RPM_BUILD_DIR/%{name}-%{version}/bash.relocation ${RPM_BUILD_ROOT}/usr/lib/relocation/%{_bindir}/bash.relocation
%endif
# bug #820192, need to add execable alternatives for regular built-ins # bug #820192, need to add execable alternatives for regular built-ins
for ea in alias bg cd command fc fg getopts hash jobs read type ulimit umask unalias wait for ea in alias bg cd command fc fg getopts hash jobs read type ulimit umask unalias wait
@ -125,9 +143,11 @@ make check
%{_bindir}/{hash,getopts,jobs,read,type,ulimit,umask,unalias} %{_bindir}/{hash,getopts,jobs,read,type,ulimit,umask,unalias}
%config(noreplace) %{_sysconfdir}/profile.d/alias.sh %config(noreplace) %{_sysconfdir}/profile.d/alias.sh
%files reloc %if %{ENABLE_RELOC}
%defattr(744,root,root) %files relocation
%{_bindir}/bash.relocation %defattr(-,root,root)
/usr/lib/relocation/%{_bindir}/bash.relocation
%endif
%files devel %files devel
%defattr(-,root,root) %defattr(-,root,root)
@ -146,6 +166,21 @@ make check
%exclude %{_infodir}/dir %exclude %{_infodir}/dir
%changelog %changelog
* Tue Oct 17 2023 wangyuhang <wangyuhang27@huawei.com> -5.1.8-11
- Type:bugfix
- ID:NA
- SUG:NA
- DESC: add backport-fix-for-nofork-comsub-command-printing-fix-for-crash.patch
backport-fix-small-memleak-in-globbing.patch
backport-fix-for-leak-when-completing-command-word-with-glob-.patch
del doesn't exist PATH dirs in bashrc
* Tue Oct 17 2023 wangyuhang <wangyuhang27@huawei.com> - 5.1.8-10
- Type:enhancement
- ID:NA
- SUG:NA
- DESC: Fixed the issue of not stripped
* Thu Jun 15 2023 wangyuhang <wangyuhang27@huawei.com> -5.1.8-9 * Thu Jun 15 2023 wangyuhang <wangyuhang27@huawei.com> -5.1.8-9
- Type:bugfix - Type:bugfix
- ID:NA - ID:NA

View File

@ -2,5 +2,4 @@
[ -f /etc/bashrc ] && . /etc/bashrc [ -f /etc/bashrc ] && . /etc/bashrc
# User environment PATH # User environment PATH
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
export PATH export PATH