ash: retain envvars with bad names in initial environment. Closes 10231

Reworks "ash: [VAR] Sanitise environment variable names on entry"
commit.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2017-11-02 12:56:24 +01:00
parent d5c1482fba
commit 9c143ce52d

View File

@ -10863,9 +10863,17 @@ showvars(const char *sep_prefix, int on, int off)
const char *p; const char *p;
const char *q; const char *q;
p = strchrnul(*ep, '='); p = endofname(*ep);
/* Used to have simple "p = strchrnul(*ep, '=')" here instead, but this
* makes "export -p" to have output not suitable for "eval":
* import os
* os.environ["test-test"]="test"
* if os.fork() == 0:
* os.execv("ash", [ 'ash', '-c', 'eval $(export -p); echo OK' ]) # fixes this
* os.execv("ash", [ 'ash', '-c', 'env | grep test-test' ])
*/
q = nullstr; q = nullstr;
if (*p) if (*p == '=')
q = single_quote(++p); q = single_quote(++p);
out1fmt("%s%s%.*s%s\n", sep_prefix, sep, (int)(p - *ep), *ep, q); out1fmt("%s%s%.*s%s\n", sep_prefix, sep, (int)(p - *ep), *ep, q);
} }
@ -13639,8 +13647,18 @@ init(void)
initvar(); initvar();
for (envp = environ; envp && *envp; envp++) { for (envp = environ; envp && *envp; envp++) {
p = endofname(*envp); /* Used to have
if (p != *envp && *p == '=') { * p = endofname(*envp);
* if (p != *envp && *p == '=') {
* here to weed out badly-named variables, but this breaks
* scenarios where people do want them passed to children:
* import os
* os.environ["test-test"]="test"
* if os.fork() == 0:
* os.execv("ash", [ 'ash', '-c', 'eval $(export -p); echo OK' ]) # fixes this
* os.execv("ash", [ 'ash', '-c', 'env | grep test-test' ]) # breaks this
*/
if (strchr(*envp, '=')) {
setvareq(*envp, VEXPORT|VTEXTFIXED); setvareq(*envp, VEXPORT|VTEXTFIXED);
} }
} }