← Commit list

9c143ce52

Denys Vlasenko
Denys Vlasenko
2017-11-02
SUCCESS Duration: 142s

Subject

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

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

shell/ash.c+22 -4
@@ -10863,9 +10863,17 @@ showvars(const char *sep_prefix, int on, int off)
const char *p;
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;
- if (*p)
+ if (*p == '=')
q = single_quote(++p);
out1fmt("%s%s%.*s%s\n", sep_prefix, sep, (int)(p - *ep), *ep, q);
}
@@ -13639,8 +13647,18 @@ init(void)
initvar();
for (envp = environ; envp && *envp; envp++) {
- p = endofname(*envp);
- if (p != *envp && *p == '=') {
+/* Used to have
+ * 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);
}
}