Zbigniew Jędrzejewski-Szmek 43ff24
From b91985eca0db632daecf6e20b1d3718f0f884389 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 43ff24
From: =?UTF-8?q?Mantas=20Mikul=C4=97nas?= <grawity@gmail.com>
Zbigniew Jędrzejewski-Szmek 43ff24
Date: Sun, 13 Jul 2014 18:49:00 +0300
Zbigniew Jędrzejewski-Szmek 43ff24
Subject: [PATCH] fileio: quote more shell characters in envfiles
Zbigniew Jędrzejewski-Szmek 43ff24
Zbigniew Jędrzejewski-Szmek 43ff24
Turns out, making strings shell-proof is harder than expected:
Zbigniew Jędrzejewski-Szmek 43ff24
Zbigniew Jędrzejewski-Szmek 43ff24
    # machinectl set-hostname "foo|poweroff" && . /etc/machine-info
Zbigniew Jędrzejewski-Szmek 43ff24
Zbigniew Jędrzejewski-Szmek 43ff24
(This could be simplified by quoting *and* escaping all characters,
Zbigniew Jędrzejewski-Szmek 43ff24
which is harmless in shell but unnecessary.)
Zbigniew Jędrzejewski-Szmek 43ff24
Zbigniew Jędrzejewski-Szmek 43ff24
(cherry picked from commit 0ce5a80601597fe4d1a715a8f70ce8d5ccaa2d86)
Zbigniew Jędrzejewski-Szmek 43ff24
---
Zbigniew Jędrzejewski-Szmek 43ff24
 src/shared/fileio.c | 4 ++--
Zbigniew Jędrzejewski-Szmek 43ff24
 src/shared/util.h   | 6 ++++++
Zbigniew Jędrzejewski-Szmek 43ff24
 2 files changed, 8 insertions(+), 2 deletions(-)
Zbigniew Jędrzejewski-Szmek 43ff24
Zbigniew Jędrzejewski-Szmek 43ff24
diff --git a/src/shared/fileio.c b/src/shared/fileio.c
Zbigniew Jędrzejewski-Szmek 43ff24
index b1de5908c5..d22770b772 100644
Zbigniew Jędrzejewski-Szmek 43ff24
--- a/src/shared/fileio.c
Zbigniew Jędrzejewski-Szmek 43ff24
+++ b/src/shared/fileio.c
Zbigniew Jędrzejewski-Szmek 43ff24
@@ -738,11 +738,11 @@ static void write_env_var(FILE *f, const char *v) {
Zbigniew Jędrzejewski-Szmek 43ff24
         p++;
Zbigniew Jędrzejewski-Szmek 43ff24
         fwrite(v, 1, p-v, f);
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
-        if (string_has_cc(p, NULL) || chars_intersect(p, WHITESPACE "\'\"\\`$")) {
Zbigniew Jędrzejewski-Szmek 43ff24
+        if (string_has_cc(p, NULL) || chars_intersect(p, WHITESPACE SHELL_NEED_QUOTES)) {
Zbigniew Jędrzejewski-Szmek 43ff24
                 fputc('\"', f);
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
                 for (; *p; p++) {
Zbigniew Jędrzejewski-Szmek 43ff24
-                        if (strchr("\'\"\\`$", *p))
Zbigniew Jędrzejewski-Szmek 43ff24
+                        if (strchr(SHELL_NEED_ESCAPE, *p))
Zbigniew Jędrzejewski-Szmek 43ff24
                                 fputc('\\', f);
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
                         fputc(*p, f);
Zbigniew Jędrzejewski-Szmek 43ff24
diff --git a/src/shared/util.h b/src/shared/util.h
Zbigniew Jędrzejewski-Szmek 43ff24
index 7124e51d90..64b9fc6884 100644
Zbigniew Jędrzejewski-Szmek 43ff24
--- a/src/shared/util.h
Zbigniew Jędrzejewski-Szmek 43ff24
+++ b/src/shared/util.h
Zbigniew Jędrzejewski-Szmek 43ff24
@@ -93,6 +93,12 @@
Zbigniew Jędrzejewski-Szmek 43ff24
 #define COMMENTS   "#;"
Zbigniew Jędrzejewski-Szmek 43ff24
 #define GLOB_CHARS "*?["
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
+/* What characters are special in the shell? */
Zbigniew Jędrzejewski-Szmek 43ff24
+/* must be escaped outside and inside double-quotes */
Zbigniew Jędrzejewski-Szmek 43ff24
+#define SHELL_NEED_ESCAPE "\"\\`$"
Zbigniew Jędrzejewski-Szmek 43ff24
+/* can be escaped or double-quoted */
Zbigniew Jędrzejewski-Szmek 43ff24
+#define SHELL_NEED_QUOTES SHELL_NEED_ESCAPE GLOB_CHARS "'()<>|&;"
Zbigniew Jędrzejewski-Szmek 43ff24
+
Zbigniew Jędrzejewski-Szmek 43ff24
 #define FORMAT_BYTES_MAX 8
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
 #define ANSI_HIGHLIGHT_ON "\x1B[1;39m"