chiark / gitweb /
Allow tabs in environment files
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 12 Sep 2013 01:50:16 +0000 (21:50 -0400)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 12 Sep 2013 01:58:22 +0000 (21:58 -0400)
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

src/hostname/hostnamed.c
src/shared/util.c
src/test/test-fileio.c

index 0437e33a664c18016ab0319552ebe088c15719a5..6a43aeb840c36ab8d2903ce86418b62c8cd1c10f 100644 (file)
@@ -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);
index 1dde8afcadfc3a24af14620219d148edba185e31..ad463e8399347fc26f5bef6bf72be0976a91c08d 100644 (file)
@@ -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;
 
index 76a43d9b6942d7233bdfbb74417b84049fdd701f..1184e7e02f5568c7e7656ebc9c81ac1bb0bba0f5 100644 (file)
@@ -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;
 }