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:
parent
d5c1482fba
commit
9c143ce52d
26
shell/ash.c
26
shell/ash.c
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user