[systemd-commits] src/hostname src/shared src/test

Zbigniew Jędrzejewski-Szmek zbyszek at kemper.freedesktop.org
Wed Sep 11 19:00:07 PDT 2013


 src/hostname/hostnamed.c |    3 +-
 src/shared/util.c        |    4 +++
 src/test/test-fileio.c   |   54 +++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 60 insertions(+), 1 deletion(-)

New commits:
commit ac4c8d6da8b5ebc35f02c9c6cb7595be7b134a05
Author: Zbigniew Jędrzejewski-Szmek <zbyszek at in.waw.pl>
Date:   Wed Sep 11 21:50:16 2013 -0400

    Allow tabs in environment files
    
    bash allows them, and so should we.
    
    string_has_cc is changed to allow tabs, and if they are not wanted,
    they must be now checked for explicitly. There are two other callers,
    apart from the env file loaders, and one already checked anyway, and
    the other is changed to check.
    
    https://bugs.freedesktop.org/show_bug.cgi?id=68592
    https://bugs.gentoo.org/show_bug.cgi?id=481554

diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c
index 0437e33..6a43aeb 100644
--- a/src/hostname/hostnamed.c
+++ b/src/hostname/hostnamed.c
@@ -553,7 +553,8 @@ static DBusHandlerResult hostname_message_handler(
                                  * safe than sorry */
                                 if (k == PROP_ICON_NAME && !filename_is_safe(name))
                                         return bus_send_error_reply(connection, message, NULL, -EINVAL);
-                                if (k == PROP_PRETTY_HOSTNAME && string_has_cc(name))
+                                if (k == PROP_PRETTY_HOSTNAME &&
+                                    (string_has_cc(name) || chars_intersect(name, "\t")))
                                         return bus_send_error_reply(connection, message, NULL, -EINVAL);
                                 if (k == PROP_CHASSIS && !valid_chassis(name))
                                         return bus_send_error_reply(connection, message, NULL, -EINVAL);
diff --git a/src/shared/util.c b/src/shared/util.c
index 1dde8af..ad463e8 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -5311,6 +5311,10 @@ bool string_is_safe(const char *p) {
         return true;
 }
 
+/**
+ * Check if a string contains control characters.
+ * Spaces and tabs are not considered control characters.
+ */
 bool string_has_cc(const char *p) {
         const char *t;
 
diff --git a/src/test/test-fileio.c b/src/test/test-fileio.c
index 76a43d9..1184e7e 100644
--- a/src/test/test-fileio.c
+++ b/src/test/test-fileio.c
@@ -142,6 +142,59 @@ static void test_parse_env_file(void) {
         unlink(p);
 }
 
+static void test_parse_multiline_env_file(void) {
+        char    t[] = "/tmp/test-fileio-in-XXXXXX",
+                p[] = "/tmp/test-fileio-out-XXXXXX";
+        int fd, r;
+        FILE *f;
+        _cleanup_strv_free_ char **a = NULL, **b = NULL;
+        char **i;
+
+        assert_se(mktemp(p));
+
+        fd = mkostemp(t, O_CLOEXEC);
+        assert_se(fd >= 0);
+
+        f = fdopen(fd, "w");
+        assert_se(f);
+
+        fputs("one=BAR\\\n"
+              "    VAR\\\n"
+              "\tGAR\n"
+              "#comment\n"
+              "two=\"bar\\\n"
+              "    var\\\n"
+              "\tgar\"\n"
+              "#comment\n"
+              "tri=\"bar \\\n"
+              "    var \\\n"
+              "\tgar \"\n", f);
+
+        fflush(f);
+        fclose(f);
+
+        r = load_env_file(t, NULL, &a);
+        assert_se(r >= 0);
+
+        STRV_FOREACH(i, a)
+                log_info("Got: <%s>", *i);
+
+        assert_se(streq(a[0], "one=BAR    VAR\tGAR"));
+        assert_se(streq(a[1], "two=bar    var\tgar"));
+        assert_se(streq(a[2], "tri=bar     var \tgar "));
+        assert_se(a[3] == NULL);
+
+        r = write_env_file(p, a);
+        assert_se(r >= 0);
+
+        r = load_env_file(p, NULL, &b);
+        assert_se(r >= 0);
+
+        unlink(t);
+        unlink(p);
+}
+
+
 static void test_executable_is_script(void) {
         char t[] = "/tmp/test-executable-XXXXXX";
         int fd, r;
@@ -178,6 +231,7 @@ static void test_executable_is_script(void) {
 
 int main(int argc, char *argv[]) {
         test_parse_env_file();
+        test_parse_multiline_env_file();
         test_executable_is_script();
         return 0;
 }



More information about the systemd-commits mailing list