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)