From 8bf3cfef2d6e2897d341a98200605a4e95a505a0 Mon Sep 17 00:00:00 2001 From: Chet Ramey Date: Fri, 14 Dec 2018 09:19:57 -0500 Subject: [PATCH] commit bash-20181210 snapshot --- CWRU/CWRU.chlog | 7 +++++++ po/zh_CN.po | 6 +++--- variables.c | 31 ++++++++++++++++++++++++++----- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog index 855e7e0e..7361e05d 100644 --- a/CWRU/CWRU.chlog +++ b/CWRU/CWRU.chlog @@ -4868,3 +4868,10 @@ parse.y - select_command: add two additional productions to support select commands without a word_list following the `in'. Fixes omission reported by Martijn Dekker + + 12/11 + ----- +variables.c + - assign_in_env: don't allow namerefs in temporary environment + assignments to create variables with invalid names for export. Fixes + bug reported by Grisha Levit diff --git a/po/zh_CN.po b/po/zh_CN.po index 4c69976e..104415bf 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -40,7 +40,7 @@ msgstr "" "Project-Id-Version: bash 5.0-beta2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-11-16 15:54-0500\n" -"PO-Revision-Date: 2018-12-08 14:10-0500\n" +"PO-Revision-Date: 2018-12-13 13:27-0500\n" "Last-Translator: Boyuan Yang <073plan@gmail.com>\n" "Language-Team: Chinese (simplified) \n" "Language: zh_CN\n" @@ -2536,9 +2536,9 @@ msgstr "" "从别名定义列表中删除每一个“名字”。\n" " \n" " 选项:\n" -" -a\t删除所有的别名定义。\n" +" -a\t删除所有的别名定义\n" " \n" -" 返回成功,除非“名字“不是一个已存在的别名。" +" 返回成功,除非“名字”不是一个已存在的别名。" #: builtins.c:291 msgid "" diff --git a/variables.c b/variables.c index 638d6ecd..60e62267 100644 --- a/variables.c +++ b/variables.c @@ -169,6 +169,7 @@ SHELL_VAR nameref_invalid_value; static SHELL_VAR nameref_maxloop_value; static HASH_TABLE *last_table_searched; /* hash_lookup sets this */ +static VAR_CONTEXT *last_context_searched; /* Some forward declarations. */ static void create_variable_tables __P((void)); @@ -2607,6 +2608,17 @@ make_local_variable (name, flags) if (was_tmpvar && old_var->context == variable_context && last_table_searched != temporary_env) { VUNSETATTR (old_var, att_invisible); /* XXX */ +#if 0 /* TAG:bash-5.1 */ + /* We still want to flag this variable as local, though, and set things + up so that it gets treated as a local variable. */ + new_var = old_var; + /* Since we found the variable in a temporary environment, this will + succeed. */ + for (vc = shell_variables; vc; vc = vc->down) + if (vc_isfuncenv (vc) && vc->scope == variable_context) + break; + goto set_local_var_flags; +#endif return (old_var); } @@ -2694,6 +2706,7 @@ make_local_variable (name, flags) new_var->attributes = exported_p (old_var) ? att_exported : 0; } +set_local_var_flags: vc->flags |= VC_HASLOCAL; new_var->context = variable_context; @@ -3213,6 +3226,9 @@ bind_variable (name, value, flags) nvc = vc; if (v && nameref_p (v)) { + /* This starts at the context where we found the nameref. If we + want to start the name resolution over again at the original + context, this is where we need to change it */ nv = find_variable_nameref_context (v, vc, &nvc); if (nv == 0) { @@ -3234,8 +3250,9 @@ bind_variable (name, value, flags) else if (nv == &nameref_maxloop_value) { internal_warning (_("%s: circular name reference"), v->name); -#if 0 - return (bind_variable_value (v, value, flags|ASS_NAMEREF)); +#if 1 + /* TAG:bash-5.1 */ + return (bind_global_variable (v->name, value, flags)); #else v = 0; /* backwards compat */ #endif @@ -3246,8 +3263,9 @@ bind_variable (name, value, flags) else if (nv == &nameref_maxloop_value) { internal_warning (_("%s: circular name reference"), v->name); -#if 0 - return (bind_variable_value (v, value, flags|ASS_NAMEREF)); +#if 1 + /* TAG:bash-5.1 */ + return (bind_global_variable (v->name, value, flags)); #else v = 0; /* backwards compat */ #endif @@ -3557,7 +3575,10 @@ assign_in_env (word, flags) but the variable does not already exist, assign to the nameref target and add the target to the temporary environment. This is what ksh93 does */ - if (var && nameref_p (var) && valid_nameref_value (nameref_cell (var), 1)) + /* We use 2 in the call to valid_nameref_value because we don't want + to allow array references here at all (newname will be used to + create a variable directly below) */ + if (var && nameref_p (var) && valid_nameref_value (nameref_cell (var), 2)) { newname = nameref_cell (var); var = 0; /* don't use it for append */