The attached patch seems to take care of at least these two cases:
| dualbus@hp ...src/gnu/bash % ./bash --norc --noprofile -c 'r=@; declare -n r'
| ./bash: line 0: declare: @: invalid variable name for name reference
|
| dualbus@hp ...src/gnu/bash % ./bash --norc --noprofile -c 'declare -n r; r=@'
| ./bash: `@': not a valid identifier
|
| dualbus@hp ...src/gnu/bash % ./bash --norc --noprofile -c 'declare -n r;
r=$(echo @)'
| ./bash: `@': not a valid identifier
But I think Chet already considered this, given that the check in declare.def
was '#if 0'ed out.
--
Eduardo Bustamante
https://dualbus.me/
diff --git a/builtins/declare.def b/builtins/declare.def
index a1e9b4e..2ae12a8 100644
--- a/builtins/declare.def
+++ b/builtins/declare.def
@@ -570,7 +570,7 @@ declare_internal (list, local_var)
}
else if (flags_on & att_nameref)
{
-#if 0
+#if 1
if (nameref_p (var) == 0 && var_isset (var) && var_isnull (var)
== 0 && legal_identifier (value_cell (var)) == 0)
{
builtin_error (_("%s: invalid variable name for name
reference"), value_cell (var));
diff --git a/variables.c b/variables.c
index 69ed170..dd62d96 100644
--- a/variables.c
+++ b/variables.c
@@ -2628,9 +2628,13 @@ bind_variable_internal (name, value, table, hflags,
aflags)
}
/* The first clause handles `declare -n ref; ref=x;' */
- if (entry && invisible_p (entry) && nameref_p (entry))
+ if (entry && invisible_p (entry) && nameref_p (entry)) {
+ if(!legal_identifier(value)) {
+ internal_error (_("`%s': not a valid identifier"), value);
+ exit(1);
+ }
goto assign_value;
- else if (entry && nameref_p (entry))
+ } else if (entry && nameref_p (entry))
{
newval = nameref_cell (entry);
#if defined (ARRAY_VARS)