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)

Reply via email to