Zbigniew Jędrzejewski-Szmek 43ff24
From 15dbdbd90db21bea19e48194a485bbaaa9501b9b Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 43ff24
From: Lennart Poettering <lennart@poettering.net>
Zbigniew Jędrzejewski-Szmek 43ff24
Date: Mon, 7 Jul 2014 12:04:55 +0200
Zbigniew Jędrzejewski-Szmek 43ff24
Subject: [PATCH] util: don't consider tabs special in string_has_cc() anymore
Zbigniew Jędrzejewski-Szmek 43ff24
Zbigniew Jędrzejewski-Szmek 43ff24
Instead, take a list of exceptions to our usual CC check
Zbigniew Jędrzejewski-Szmek 43ff24
Zbigniew Jędrzejewski-Szmek 43ff24
(cherry picked from commit 6294aa76d818e831de4592b41a37e225fd0871f9)
Zbigniew Jędrzejewski-Szmek 43ff24
---
Zbigniew Jędrzejewski-Szmek 43ff24
 src/hostname/hostnamed.c |  3 +--
Zbigniew Jędrzejewski-Szmek 43ff24
 src/shared/env-util.c    |  4 +++-
Zbigniew Jędrzejewski-Szmek 43ff24
 src/shared/fileio.c      |  2 +-
Zbigniew Jędrzejewski-Szmek 43ff24
 src/shared/util.c        | 19 ++++++++++---------
Zbigniew Jędrzejewski-Szmek 43ff24
 src/shared/util.h        |  2 +-
Zbigniew Jędrzejewski-Szmek 43ff24
 5 files changed, 16 insertions(+), 14 deletions(-)
Zbigniew Jędrzejewski-Szmek 43ff24
Zbigniew Jędrzejewski-Szmek 43ff24
diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c
Zbigniew Jędrzejewski-Szmek 43ff24
index 8127b688c4..eaae1139fa 100644
Zbigniew Jędrzejewski-Szmek 43ff24
--- a/src/hostname/hostnamed.c
Zbigniew Jędrzejewski-Szmek 43ff24
+++ b/src/hostname/hostnamed.c
Zbigniew Jędrzejewski-Szmek 43ff24
@@ -551,8 +551,7 @@ static int set_machine_info(Context *c, sd_bus *bus, sd_bus_message *m, int prop
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
                 if (prop == PROP_ICON_NAME && !filename_is_safe(name))
Zbigniew Jędrzejewski-Szmek 43ff24
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid icon name '%s'", name);
Zbigniew Jędrzejewski-Szmek 43ff24
-                if (prop == PROP_PRETTY_HOSTNAME &&
Zbigniew Jędrzejewski-Szmek 43ff24
-                    (string_has_cc(name) || chars_intersect(name, "\t")))
Zbigniew Jędrzejewski-Szmek 43ff24
+                if (prop == PROP_PRETTY_HOSTNAME && string_has_cc(name, NULL))
Zbigniew Jędrzejewski-Szmek 43ff24
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid pretty host name '%s'", name);
Zbigniew Jędrzejewski-Szmek 43ff24
                 if (prop == PROP_CHASSIS && !valid_chassis(name))
Zbigniew Jędrzejewski-Szmek 43ff24
                         return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid chassis '%s'", name);
Zbigniew Jędrzejewski-Szmek 43ff24
diff --git a/src/shared/env-util.c b/src/shared/env-util.c
Zbigniew Jędrzejewski-Szmek 43ff24
index b2e45531ab..20b208f63c 100644
Zbigniew Jędrzejewski-Szmek 43ff24
--- a/src/shared/env-util.c
Zbigniew Jędrzejewski-Szmek 43ff24
+++ b/src/shared/env-util.c
Zbigniew Jędrzejewski-Szmek 43ff24
@@ -78,7 +78,9 @@ bool env_value_is_valid(const char *e) {
Zbigniew Jędrzejewski-Szmek 43ff24
         if (!utf8_is_valid(e))
Zbigniew Jędrzejewski-Szmek 43ff24
                 return false;
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
-        if (string_has_cc(e))
Zbigniew Jędrzejewski-Szmek 43ff24
+        /* bash allows tabs in environment variables, and so should
Zbigniew Jędrzejewski-Szmek 43ff24
+         * we */
Zbigniew Jędrzejewski-Szmek 43ff24
+        if (string_has_cc(e, "\t"))
Zbigniew Jędrzejewski-Szmek 43ff24
                 return false;
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
         /* POSIX says the overall size of the environment block cannot
Zbigniew Jędrzejewski-Szmek 43ff24
diff --git a/src/shared/fileio.c b/src/shared/fileio.c
Zbigniew Jędrzejewski-Szmek 43ff24
index fb1c1bcf9f..b1de5908c5 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,7 +738,7 @@ 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) || chars_intersect(p, WHITESPACE "\'\"\\`$")) {
Zbigniew Jędrzejewski-Szmek 43ff24
+        if (string_has_cc(p, NULL) || chars_intersect(p, WHITESPACE "\'\"\\`$")) {
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
diff --git a/src/shared/util.c b/src/shared/util.c
Zbigniew Jędrzejewski-Szmek 43ff24
index d25ee6652f..d223ecf711 100644
Zbigniew Jędrzejewski-Szmek 43ff24
--- a/src/shared/util.c
Zbigniew Jędrzejewski-Szmek 43ff24
+++ b/src/shared/util.c
Zbigniew Jędrzejewski-Szmek 43ff24
@@ -5350,16 +5350,14 @@ bool filename_is_safe(const char *p) {
Zbigniew Jędrzejewski-Szmek 43ff24
 bool string_is_safe(const char *p) {
Zbigniew Jędrzejewski-Szmek 43ff24
         const char *t;
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
-        assert(p);
Zbigniew Jędrzejewski-Szmek 43ff24
+        if (!p)
Zbigniew Jędrzejewski-Szmek 43ff24
+                return false;
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
         for (t = p; *t; t++) {
Zbigniew Jędrzejewski-Szmek 43ff24
                 if (*t > 0 && *t < ' ')
Zbigniew Jędrzejewski-Szmek 43ff24
                         return false;
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
-                if (*t == 127)
Zbigniew Jędrzejewski-Szmek 43ff24
-                        return false;
Zbigniew Jędrzejewski-Szmek 43ff24
-
Zbigniew Jędrzejewski-Szmek 43ff24
-                if (strchr("\\\"\'", *t))
Zbigniew Jędrzejewski-Szmek 43ff24
+                if (strchr("\\\"\'\0x7f", *t))
Zbigniew Jędrzejewski-Szmek 43ff24
                         return false;
Zbigniew Jędrzejewski-Szmek 43ff24
         }
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
@@ -5367,16 +5365,19 @@ bool string_is_safe(const char *p) {
Zbigniew Jędrzejewski-Szmek 43ff24
 }
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
 /**
Zbigniew Jędrzejewski-Szmek 43ff24
- * Check if a string contains control characters.
Zbigniew Jędrzejewski-Szmek 43ff24
- * Spaces and tabs are not considered control characters.
Zbigniew Jędrzejewski-Szmek 43ff24
+ * Check if a string contains control characters. If 'ok' is non-NULL
Zbigniew Jędrzejewski-Szmek 43ff24
+ * it may be a string containing additional CCs to be considered OK.
Zbigniew Jędrzejewski-Szmek 43ff24
  */
Zbigniew Jędrzejewski-Szmek 43ff24
-bool string_has_cc(const char *p) {
Zbigniew Jędrzejewski-Szmek 43ff24
+bool string_has_cc(const char *p, const char *ok) {
Zbigniew Jędrzejewski-Szmek 43ff24
         const char *t;
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
         assert(p);
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
         for (t = p; *t; t++) {
Zbigniew Jędrzejewski-Szmek 43ff24
-                if (*t > 0 && *t < ' ' && *t != '\t')
Zbigniew Jędrzejewski-Szmek 43ff24
+                if (ok && strchr(ok, *t))
Zbigniew Jędrzejewski-Szmek 43ff24
+                        return false;
Zbigniew Jędrzejewski-Szmek 43ff24
+
Zbigniew Jędrzejewski-Szmek 43ff24
+                if (*t > 0 && *t < ' ')
Zbigniew Jędrzejewski-Szmek 43ff24
                         return true;
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
                 if (*t == 127)
Zbigniew Jędrzejewski-Szmek 43ff24
diff --git a/src/shared/util.h b/src/shared/util.h
Zbigniew Jędrzejewski-Szmek 43ff24
index e23069c016..7124e51d90 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
@@ -692,7 +692,7 @@ _alloc_(2, 3) static inline void *memdup_multiply(const void *p, size_t a, size_
Zbigniew Jędrzejewski-Szmek 43ff24
 bool filename_is_safe(const char *p) _pure_;
Zbigniew Jędrzejewski-Szmek 43ff24
 bool path_is_safe(const char *p) _pure_;
Zbigniew Jędrzejewski-Szmek 43ff24
 bool string_is_safe(const char *p) _pure_;
Zbigniew Jędrzejewski-Szmek 43ff24
-bool string_has_cc(const char *p) _pure_;
Zbigniew Jędrzejewski-Szmek 43ff24
+bool string_has_cc(const char *p, const char *ok) _pure_;
Zbigniew Jędrzejewski-Szmek 43ff24
 
Zbigniew Jędrzejewski-Szmek 43ff24
 /**
Zbigniew Jędrzejewski-Szmek 43ff24
  * Check if a string contains any glob patterns.