[systemd/f18] Pick fileio fixes for environment files (#964132). Drop isdn.service from default preset (Lennart, #

Michal Schmidt michich at fedoraproject.org
Fri May 17 12:09:17 UTC 2013


commit b356b73f5c5162e8539026b4fdda50d148c127f1
Author: Michal Schmidt <mschmidt at redhat.com>
Date:   Fri May 17 13:45:28 2013 +0200

    Pick fileio fixes for environment files (#964132).
    Drop isdn.service from default preset (Lennart, #959793).

 ...also-escape-and-when-writing-out-env-vars.patch |   29 ++
 ...e_env_file_internal-fix-environment-file-.patch |  105 +++++++
 ...e-report-invalid-environment-variables-fr.patch |  292 ++++++++++++++++++++
 ...-not-parse-comments-after-non-whitespace-.patch |  134 +++++++++
 ...y-how-we-chop-off-whitespace-from-key-and.patch |  127 +++++++++
 ...e-only-clean-the-environment-if-we-have-o.patch |   24 ++
 systemd.spec                                       |   12 +-
 7 files changed, 722 insertions(+), 1 deletions(-)
---
diff --git a/0053-fileio-also-escape-and-when-writing-out-env-vars.patch b/0053-fileio-also-escape-and-when-writing-out-env-vars.patch
new file mode 100644
index 0000000..2d8a5a2
--- /dev/null
+++ b/0053-fileio-also-escape-and-when-writing-out-env-vars.patch
@@ -0,0 +1,29 @@
+From c79393bba5b039537870f421d65cd0625e135149 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Mantas=20Mikul=C4=97nas?= <grawity at gmail.com>
+Date: Sun, 14 Apr 2013 14:54:09 +0300
+Subject: [PATCH] fileio: also escape $ and ` when writing out env vars
+
+These are also considered special by sh and bash.
+(cherry picked from commit ced2d10a28cff3bab6fb613652db5abde8ed940e)
+---
+ src/shared/fileio.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/shared/fileio.c b/src/shared/fileio.c
+index 400a416..617afea 100644
+--- a/src/shared/fileio.c
++++ b/src/shared/fileio.c
+@@ -529,11 +529,11 @@ static void write_env_var(FILE *f, const char *v) {
+         p++;
+         fwrite(v, 1, p-v, f);
+ 
+-        if (string_has_cc(p) || chars_intersect(p, WHITESPACE "\'\"\\")) {
++        if (string_has_cc(p) || chars_intersect(p, WHITESPACE "\'\"\\`$")) {
+                 fputc('\"', f);
+ 
+                 for (; *p; p++) {
+-                        if (strchr("\'\"\\", *p))
++                        if (strchr("\'\"\\`$", *p))
+                                 fputc('\\', f);
+ 
+                         fputc(*p, f);
diff --git a/0054-fileio-parse_env_file_internal-fix-environment-file-.patch b/0054-fileio-parse_env_file_internal-fix-environment-file-.patch
new file mode 100644
index 0000000..4262bb1
--- /dev/null
+++ b/0054-fileio-parse_env_file_internal-fix-environment-file-.patch
@@ -0,0 +1,105 @@
+From 9ef15e237b8fda40d1a40d0cc8a25e99358bd163 Mon Sep 17 00:00:00 2001
+From: Harald Hoyer <harald at redhat.com>
+Date: Wed, 17 Apr 2013 11:02:56 +0200
+Subject: [PATCH] fileio:parse_env_file_internal() fix environment file parsing
+
+parse_env_file_internal() could not parse the following lines correctly:
+
+export key="val"
+key="val"#comment
+(cherry picked from commit db5372091664c977a937f6bc0fe4484363be0669)
+---
+ src/shared/fileio.c    |  6 ++++--
+ src/test/test-fileio.c | 20 +++++++++++++++-----
+ 2 files changed, 19 insertions(+), 7 deletions(-)
+
+diff --git a/src/shared/fileio.c b/src/shared/fileio.c
+index 617afea..3f242ed 100644
+--- a/src/shared/fileio.c
++++ b/src/shared/fileio.c
+@@ -209,7 +209,9 @@ static int parse_env_file_internal(
+                 switch (state) {
+ 
+                 case PRE_KEY:
+-                        if (strchr(COMMENTS, c))
++                        if (startswith(p, "export "))
++                                p+=6;
++                        else if (strchr(COMMENTS, c))
+                                 state = COMMENT;
+                         else if (!strchr(WHITESPACE, c)) {
+                                 state = KEY;
+@@ -255,7 +257,7 @@ static int parse_env_file_internal(
+                         break;
+ 
+                 case PRE_VALUE:
+-                        if (strchr(newline, c)) {
++                        if (strchr(newline, c) || strchr(COMMENTS, c)) {
+                                 state = PRE_KEY;
+                                 key[n_key] = 0;
+ 
+diff --git a/src/test/test-fileio.c b/src/test/test-fileio.c
+index 7adf2ef..994b89b 100644
+--- a/src/test/test-fileio.c
++++ b/src/test/test-fileio.c
+@@ -31,7 +31,7 @@ static void test_parse_env_file(void) {
+         char t[] = "/tmp/test-parse-env-file-XXXXXX";
+         int fd, r;
+         FILE *f;
+-        _cleanup_free_ char *one = NULL, *two = NULL, *three = NULL, *four = NULL, *five = NULL, *six = NULL, *seven = NULL;
++        _cleanup_free_ char *one = NULL, *two = NULL, *three = NULL, *four = NULL, *five = NULL, *six = NULL, *seven = NULL, *eight = NULL, *nine = NULL;
+         _cleanup_strv_free_ char **a = NULL, **b = NULL;
+         char **i;
+         unsigned k;
+@@ -53,7 +53,9 @@ static void test_parse_env_file(void) {
+               "five = \'55\\\'55\' \"FIVE\" cinco   \n"
+               "six = seis sechs\\\n"
+               " sis\n"
+-              "seven=", f);
++              "export seven=\"sevenval\"#comment\n"
++              "eight=#comment\n"
++              "nine=", f);
+ 
+         fflush(f);
+         fclose(f);
+@@ -67,6 +69,8 @@ static void test_parse_env_file(void) {
+                        "five", &five,
+                        "six", &six,
+                        "seven", &seven,
++                       "eight", &eight,
++                       "nine", &nine,
+                        NULL);
+ 
+         assert_se(r >= 0);
+@@ -78,6 +82,8 @@ static void test_parse_env_file(void) {
+         log_info("five=[%s]", strna(five));
+         log_info("six=[%s]", strna(six));
+         log_info("seven=[%s]", strna(seven));
++        log_info("eight=[%s]", strna(eight));
++        log_info("nine=[%s]", strna(nine));
+ 
+         assert_se(streq(one, "BAR"));
+         assert_se(streq(two, "bar"));
+@@ -85,7 +91,9 @@ static void test_parse_env_file(void) {
+         assert_se(streq(four, "44\"44"));
+         assert_se(streq(five, "55\'55FIVEcinco"));
+         assert_se(streq(six, "seis sechs sis"));
+-        assert_se(seven == NULL);
++        assert_se(streq(seven, "sevenval"));
++        assert_se(eight == NULL);
++        assert_se(nine == NULL);
+ 
+         r = load_env_file(t, NULL, &a);
+         assert_se(r >= 0);
+@@ -99,8 +107,10 @@ static void test_parse_env_file(void) {
+         assert_se(streq(a[3], "four=44\"44"));
+         assert_se(streq(a[4], "five=55\'55FIVEcinco"));
+         assert_se(streq(a[5], "six=seis sechs sis"));
+-        assert_se(streq(a[6], "seven="));
+-        assert_se(a[7] == NULL);
++        assert_se(streq(a[6], "seven=sevenval"));
++        assert_se(streq(a[7], "eight="));
++        assert_se(streq(a[8], "nine="));
++        assert_se(a[9] == NULL);
+ 
+         r = write_env_file("/tmp/test-fileio", a);
+         assert_se(r >= 0);
diff --git a/0055-core-execute-report-invalid-environment-variables-fr.patch b/0055-core-execute-report-invalid-environment-variables-fr.patch
new file mode 100644
index 0000000..5581567
--- /dev/null
+++ b/0055-core-execute-report-invalid-environment-variables-fr.patch
@@ -0,0 +1,292 @@
+From 66435e2e05c4e9a7570ac245cdbd064edf88b1ba Mon Sep 17 00:00:00 2001
+From: Harald Hoyer <harald at redhat.com>
+Date: Wed, 17 Apr 2013 15:25:02 +0200
+Subject: [PATCH] core/execute: report invalid environment variables from files
+
+Because "export key=val" is not supported by systemd, an error is logged
+where the invalid assignment is coming from.
+
+Introduce strv_env_clean_log() to log invalid environment assignments,
+where logging is possible and allowed.
+
+parse_env_file_internal() is modified to allow WHITESPACE in keys, to
+report the issues later on.
+(cherry picked from commit ebc05a09ad6d1672cf4f426ee4252cf495daa139)
+---
+ src/core/execute.c     |  2 ++
+ src/shared/env-util.c  |  8 ++++-
+ src/shared/env-util.h  |  1 +
+ src/shared/fileio.c    | 34 +++++++++-------------
+ src/test/test-fileio.c | 79 ++++++++++++++++++++++++++++----------------------
+ 5 files changed, 68 insertions(+), 56 deletions(-)
+
+diff --git a/src/core/execute.c b/src/core/execute.c
+index 5083af9..4b29d8e 100644
+--- a/src/core/execute.c
++++ b/src/core/execute.c
+@@ -1756,6 +1756,8 @@ int exec_context_load_environment(const ExecContext *c, char ***l) {
+                                 strv_free(r);
+                                 return k;
+                          }
++                        /* Log invalid environment variables with filename */
++                        p = strv_env_clean_log(p, pglob.gl_pathv[n]);
+ 
+                         if (r == NULL)
+                                 r = p;
+diff --git a/src/shared/env-util.c b/src/shared/env-util.c
+index 54988e6..d3d4c59 100644
+--- a/src/shared/env-util.c
++++ b/src/shared/env-util.c
+@@ -376,7 +376,7 @@ char *strv_env_get(char **l, const char *name) {
+         return strv_env_get_n(l, name, strlen(name));
+ }
+ 
+-char **strv_env_clean(char **e) {
++char **strv_env_clean_log(char **e, const char *message) {
+         char **p, **q;
+         int k = 0;
+ 
+@@ -385,6 +385,8 @@ char **strv_env_clean(char **e) {
+                 bool duplicate = false;
+ 
+                 if (!env_assignment_is_valid(*p)) {
++                        if (message)
++                                log_error("Ignoring invalid environment '%s': %s", *p, message);
+                         free(*p);
+                         continue;
+                 }
+@@ -407,3 +409,7 @@ char **strv_env_clean(char **e) {
+         e[k] = NULL;
+         return e;
+ }
++
++char **strv_env_clean(char **e) {
++        return strv_env_clean_log(e, NULL);
++}
+diff --git a/src/shared/env-util.h b/src/shared/env-util.h
+index 9449576..b2e520c 100644
+--- a/src/shared/env-util.h
++++ b/src/shared/env-util.h
+@@ -30,6 +30,7 @@ bool env_assignment_is_valid(const char *e);
+ 
+ bool strv_env_is_valid(char **e);
+ char **strv_env_clean(char **l);
++char **strv_env_clean_log(char **e, const char *message);
+ 
+ bool strv_env_name_or_assignment_is_valid(char **l);
+ 
+diff --git a/src/shared/fileio.c b/src/shared/fileio.c
+index 3f242ed..4390726 100644
+--- a/src/shared/fileio.c
++++ b/src/shared/fileio.c
+@@ -184,7 +184,6 @@ static int parse_env_file_internal(
+         enum {
+                 PRE_KEY,
+                 KEY,
+-                PRE_EQUAL,
+                 PRE_VALUE,
+                 VALUE,
+                 VALUE_ESCAPE,
+@@ -209,9 +208,7 @@ static int parse_env_file_internal(
+                 switch (state) {
+ 
+                 case PRE_KEY:
+-                        if (startswith(p, "export "))
+-                                p+=6;
+-                        else if (strchr(COMMENTS, c))
++                        if (strchr(COMMENTS, c))
+                                 state = COMMENT;
+                         else if (!strchr(WHITESPACE, c)) {
+                                 state = KEY;
+@@ -228,9 +225,7 @@ static int parse_env_file_internal(
+                         if (strchr(newline, c)) {
+                                 state = PRE_KEY;
+                                 n_key = 0;
+-                        } else if (strchr(WHITESPACE, c))
+-                                state = PRE_EQUAL;
+-                        else if (c == '=')
++                        } else if (c == '=')
+                                 state = PRE_VALUE;
+                         else {
+                                 if (!greedy_realloc((void**) &key, &key_alloc, n_key+2)) {
+@@ -243,19 +238,6 @@ static int parse_env_file_internal(
+ 
+                         break;
+ 
+-                case PRE_EQUAL:
+-                        if (strchr(newline, c)) {
+-                                state = PRE_KEY;
+-                                n_key = 0;
+-                        } else if (c == '=')
+-                                state = PRE_VALUE;
+-                        else if (!strchr(WHITESPACE, c)) {
+-                                n_key = 0;
+-                                state = COMMENT;
+-                        }
+-
+-                        break;
+-
+                 case PRE_VALUE:
+                         if (strchr(newline, c) || strchr(COMMENTS, c)) {
+                                 state = PRE_KEY;
+@@ -264,6 +246,10 @@ static int parse_env_file_internal(
+                                 if (value)
+                                         value[n_value] = 0;
+ 
++                                /* strip trailing whitespace from key */
++                                while(strchr(WHITESPACE, key[--n_key]))
++                                        key[n_key]=0;
++
+                                 r = push(key, value, userdata);
+                                 if (r < 0)
+                                         goto fail;
+@@ -302,6 +288,10 @@ static int parse_env_file_internal(
+                                 if (last_whitespace != (size_t) -1)
+                                         value[last_whitespace] = 0;
+ 
++                                /* strip trailing whitespace from key */
++                                while(strchr(WHITESPACE, key[--n_key]))
++                                        key[n_key]=0;
++
+                                 r = push(key, value, userdata);
+                                 if (r < 0)
+                                         goto fail;
+@@ -426,6 +416,10 @@ static int parse_env_file_internal(
+                 if (value)
+                         value[n_value] = 0;
+ 
++                /* strip trailing whitespace from key */
++                while(strchr(WHITESPACE, key[--n_key]))
++                        key[n_key]=0;
++
+                 r = push(key, value, userdata);
+                 if (r < 0)
+                         goto fail;
+diff --git a/src/test/test-fileio.c b/src/test/test-fileio.c
+index 994b89b..2a74104 100644
+--- a/src/test/test-fileio.c
++++ b/src/test/test-fileio.c
+@@ -26,12 +26,14 @@
+ #include "util.h"
+ #include "fileio.h"
+ #include "strv.h"
++#include "env-util.h"
+ 
+ static void test_parse_env_file(void) {
+         char t[] = "/tmp/test-parse-env-file-XXXXXX";
+         int fd, r;
+         FILE *f;
+-        _cleanup_free_ char *one = NULL, *two = NULL, *three = NULL, *four = NULL, *five = NULL, *six = NULL, *seven = NULL, *eight = NULL, *nine = NULL;
++        _cleanup_free_ char *one = NULL, *two = NULL, *three = NULL, *four = NULL, *five = NULL,
++                        *six = NULL, *seven = NULL, *eight = NULL, *nine = NULL, *ten = NULL;
+         _cleanup_strv_free_ char **a = NULL, **b = NULL;
+         char **i;
+         unsigned k;
+@@ -53,13 +55,46 @@ static void test_parse_env_file(void) {
+               "five = \'55\\\'55\' \"FIVE\" cinco   \n"
+               "six = seis sechs\\\n"
+               " sis\n"
+-              "export seven=\"sevenval\"#comment\n"
++              "seven=\"sevenval\"#comment\n"
+               "eight=#comment\n"
+-              "nine=", f);
++              "export nine=nineval\n"
++              "ten=", 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"));
++        assert_se(streq(a[1], "two=bar"));
++        assert_se(streq(a[2], "three=333\nxxxx"));
++        assert_se(streq(a[3], "four=44\"44"));
++        assert_se(streq(a[4], "five=55\'55FIVEcinco"));
++        assert_se(streq(a[5], "six=seis sechs sis"));
++        assert_se(streq(a[6], "seven=sevenval"));
++        assert_se(streq(a[7], "eight="));
++        assert_se(streq(a[8], "export nine=nineval"));
++        assert_se(streq(a[9], "ten="));
++        assert_se(a[10] == NULL);
++
++        strv_env_clean_log(a, "/tmp/test-fileio");
++
++        r = write_env_file("/tmp/test-fileio", a);
++        assert_se(r >= 0);
++
++        r = load_env_file("/tmp/test-fileio", NULL, &b);
++        assert_se(r >= 0);
++
++        k = 0;
++        STRV_FOREACH(i, b) {
++                log_info("Got2: <%s>", *i);
++                assert_se(streq(*i, a[k++]));
++        }
++
+         r = parse_env_file(
+                         t, NULL,
+                        "one", &one,
+@@ -70,7 +105,8 @@ static void test_parse_env_file(void) {
+                        "six", &six,
+                        "seven", &seven,
+                        "eight", &eight,
+-                       "nine", &nine,
++                       "export nine", &nine,
++                       "ten", &ten,
+                        NULL);
+ 
+         assert_se(r >= 0);
+@@ -83,7 +119,8 @@ static void test_parse_env_file(void) {
+         log_info("six=[%s]", strna(six));
+         log_info("seven=[%s]", strna(seven));
+         log_info("eight=[%s]", strna(eight));
+-        log_info("nine=[%s]", strna(nine));
++        log_info("export nine=[%s]", strna(nine));
++        log_info("ten=[%s]", strna(nine));
+ 
+         assert_se(streq(one, "BAR"));
+         assert_se(streq(two, "bar"));
+@@ -93,36 +130,8 @@ static void test_parse_env_file(void) {
+         assert_se(streq(six, "seis sechs sis"));
+         assert_se(streq(seven, "sevenval"));
+         assert_se(eight == NULL);
+-        assert_se(nine == NULL);
+-
+-        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"));
+-        assert_se(streq(a[1], "two=bar"));
+-        assert_se(streq(a[2], "three=333\nxxxx"));
+-        assert_se(streq(a[3], "four=44\"44"));
+-        assert_se(streq(a[4], "five=55\'55FIVEcinco"));
+-        assert_se(streq(a[5], "six=seis sechs sis"));
+-        assert_se(streq(a[6], "seven=sevenval"));
+-        assert_se(streq(a[7], "eight="));
+-        assert_se(streq(a[8], "nine="));
+-        assert_se(a[9] == NULL);
+-
+-        r = write_env_file("/tmp/test-fileio", a);
+-        assert_se(r >= 0);
+-
+-        r = load_env_file("/tmp/test-fileio", NULL, &b);
+-        assert_se(r >= 0);
+-
+-        k = 0;
+-        STRV_FOREACH(i, b) {
+-                log_info("Got2: <%s>", *i);
+-                assert_se(streq(*i, a[k++]));
+-        }
++        assert_se(streq(nine, "nineval"));
++        assert_se(ten == NULL);
+ 
+         unlink(t);
+         unlink("/tmp/test-fileio");
diff --git a/0056-fileio.c-do-not-parse-comments-after-non-whitespace-.patch b/0056-fileio.c-do-not-parse-comments-after-non-whitespace-.patch
new file mode 100644
index 0000000..8a2f087
--- /dev/null
+++ b/0056-fileio.c-do-not-parse-comments-after-non-whitespace-.patch
@@ -0,0 +1,134 @@
+From a422a32de4fa85c5cdbd20a8be0c963e4904cb7a Mon Sep 17 00:00:00 2001
+From: Harald Hoyer <harald at redhat.com>
+Date: Thu, 18 Apr 2013 10:15:25 +0200
+Subject: [PATCH] fileio.c: do not parse comments after non-whitespace chars
+
+systemd does not want to understand comments after the first
+non-whitespace char occured.
+
+key=foo #comment  will result into key == "foo #comment"
+key="foo" #comment  will result into key == "foo#comment"
+"key= #comment" will result into key == "#comment"
+"key #comment" is an invalid line
+(cherry picked from commit 98f59e59e0c31ffcb953d3a7dba0da5e6f2f55f7)
+---
+ src/shared/fileio.c    |  9 +++++----
+ src/test/test-fileio.c | 26 ++++++++++++++------------
+ 2 files changed, 19 insertions(+), 16 deletions(-)
+
+diff --git a/src/shared/fileio.c b/src/shared/fileio.c
+index 4390726..f654af7 100644
+--- a/src/shared/fileio.c
++++ b/src/shared/fileio.c
+@@ -239,7 +239,7 @@ static int parse_env_file_internal(
+                         break;
+ 
+                 case PRE_VALUE:
+-                        if (strchr(newline, c) || strchr(COMMENTS, c)) {
++                        if (strchr(newline, c)) {
+                                 state = PRE_KEY;
+                                 key[n_key] = 0;
+ 
+@@ -247,7 +247,7 @@ static int parse_env_file_internal(
+                                         value[n_value] = 0;
+ 
+                                 /* strip trailing whitespace from key */
+-                                while(strchr(WHITESPACE, key[--n_key]))
++                                while(n_key && strchr(WHITESPACE, key[--n_key]))
+                                         key[n_key]=0;
+ 
+                                 r = push(key, value, userdata);
+@@ -279,6 +279,7 @@ static int parse_env_file_internal(
+                 case VALUE:
+                         if (strchr(newline, c)) {
+                                 state = PRE_KEY;
++
+                                 key[n_key] = 0;
+ 
+                                 if (value)
+@@ -289,7 +290,7 @@ static int parse_env_file_internal(
+                                         value[last_whitespace] = 0;
+ 
+                                 /* strip trailing whitespace from key */
+-                                while(strchr(WHITESPACE, key[--n_key]))
++                                while(n_key && strchr(WHITESPACE, key[--n_key]))
+                                         key[n_key]=0;
+ 
+                                 r = push(key, value, userdata);
+@@ -417,7 +418,7 @@ static int parse_env_file_internal(
+                         value[n_value] = 0;
+ 
+                 /* strip trailing whitespace from key */
+-                while(strchr(WHITESPACE, key[--n_key]))
++                while(n_key && strchr(WHITESPACE, key[--n_key]))
+                         key[n_key]=0;
+ 
+                 r = push(key, value, userdata);
+diff --git a/src/test/test-fileio.c b/src/test/test-fileio.c
+index 2a74104..d56f7cc 100644
+--- a/src/test/test-fileio.c
++++ b/src/test/test-fileio.c
+@@ -47,16 +47,18 @@ static void test_parse_env_file(void) {
+         fputs("one=BAR   \n"
+               "# comment\n"
+               " # comment \n"
++              " ; comment \n"
+               "  two   =   bar    \n"
+               "invalid line\n"
++              "invalid line #comment\n"
+               "three = \"333\n"
+               "xxxx\"\n"
+               "four = \'44\\\"44\'\n"
+               "five = \'55\\\'55\' \"FIVE\" cinco   \n"
+               "six = seis sechs\\\n"
+               " sis\n"
+-              "seven=\"sevenval\"#comment\n"
+-              "eight=#comment\n"
++              "seven=\"sevenval\" #nocomment\n"
++              "eight=eightval #nocomment\n"
+               "export nine=nineval\n"
+               "ten=", f);
+ 
+@@ -75,20 +77,14 @@ static void test_parse_env_file(void) {
+         assert_se(streq(a[3], "four=44\"44"));
+         assert_se(streq(a[4], "five=55\'55FIVEcinco"));
+         assert_se(streq(a[5], "six=seis sechs sis"));
+-        assert_se(streq(a[6], "seven=sevenval"));
+-        assert_se(streq(a[7], "eight="));
++        assert_se(streq(a[6], "seven=sevenval#nocomment"));
++        assert_se(streq(a[7], "eight=eightval #nocomment"));
+         assert_se(streq(a[8], "export nine=nineval"));
+         assert_se(streq(a[9], "ten="));
+         assert_se(a[10] == NULL);
+ 
+         strv_env_clean_log(a, "/tmp/test-fileio");
+ 
+-        r = write_env_file("/tmp/test-fileio", a);
+-        assert_se(r >= 0);
+-
+-        r = load_env_file("/tmp/test-fileio", NULL, &b);
+-        assert_se(r >= 0);
+-
+         k = 0;
+         STRV_FOREACH(i, b) {
+                 log_info("Got2: <%s>", *i);
+@@ -128,11 +124,17 @@ static void test_parse_env_file(void) {
+         assert_se(streq(four, "44\"44"));
+         assert_se(streq(five, "55\'55FIVEcinco"));
+         assert_se(streq(six, "seis sechs sis"));
+-        assert_se(streq(seven, "sevenval"));
+-        assert_se(eight == NULL);
++        assert_se(streq(seven, "sevenval#nocomment"));
++        assert_se(streq(eight, "eightval #nocomment"));
+         assert_se(streq(nine, "nineval"));
+         assert_se(ten == NULL);
+ 
++        r = write_env_file("/tmp/test-fileio", a);
++        assert_se(r >= 0);
++
++        r = load_env_file("/tmp/test-fileio", NULL, &b);
++        assert_se(r >= 0);
++
+         unlink(t);
+         unlink("/tmp/test-fileio");
+ }
diff --git a/0057-fileio-unify-how-we-chop-off-whitespace-from-key-and.patch b/0057-fileio-unify-how-we-chop-off-whitespace-from-key-and.patch
new file mode 100644
index 0000000..69dbcc7
--- /dev/null
+++ b/0057-fileio-unify-how-we-chop-off-whitespace-from-key-and.patch
@@ -0,0 +1,127 @@
+From 846dd695edba75bb96762116cae2092f691161bd Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Wed, 24 Apr 2013 15:44:28 -0300
+Subject: [PATCH] fileio: unify how we chop off whitespace from key and value
+ in parse_env_file_internal() (cherry picked from commit
+ 2b77f67e78827cc7e85fb43b05d3e1623b31a1bf)
+
+Conflicts:
+	TODO
+---
+ src/shared/fileio.c | 46 ++++++++++++++++++++++++++++++----------------
+ 1 file changed, 30 insertions(+), 16 deletions(-)
+
+diff --git a/src/shared/fileio.c b/src/shared/fileio.c
+index f654af7..18a3645 100644
+--- a/src/shared/fileio.c
++++ b/src/shared/fileio.c
+@@ -177,7 +177,7 @@ static int parse_env_file_internal(
+                 void *userdata) {
+ 
+         _cleanup_free_ char *contents = NULL, *key = NULL;
+-        size_t key_alloc = 0, n_key = 0, value_alloc = 0, n_value = 0, last_whitespace = (size_t) -1;
++        size_t key_alloc = 0, n_key = 0, value_alloc = 0, n_value = 0, last_value_whitespace = (size_t) -1, last_key_whitespace = (size_t) -1;
+         char *p, *value = NULL;
+         int r;
+ 
+@@ -212,6 +212,8 @@ static int parse_env_file_internal(
+                                 state = COMMENT;
+                         else if (!strchr(WHITESPACE, c)) {
+                                 state = KEY;
++                                last_key_whitespace = (size_t) -1;
++
+                                 if (!greedy_realloc((void**) &key, &key_alloc, n_key+2)) {
+                                         r = -ENOMEM;
+                                         goto fail;
+@@ -225,9 +227,15 @@ static int parse_env_file_internal(
+                         if (strchr(newline, c)) {
+                                 state = PRE_KEY;
+                                 n_key = 0;
+-                        } else if (c == '=')
++                        } else if (c == '=') {
+                                 state = PRE_VALUE;
+-                        else {
++                                last_value_whitespace = (size_t) -1;
++                        } else {
++                                if (!strchr(WHITESPACE, c))
++                                        last_key_whitespace = (size_t) -1;
++                                else if (last_key_whitespace == (size_t) -1)
++                                         last_key_whitespace = n_key;
++
+                                 if (!greedy_realloc((void**) &key, &key_alloc, n_key+2)) {
+                                         r = -ENOMEM;
+                                         goto fail;
+@@ -247,8 +255,8 @@ static int parse_env_file_internal(
+                                         value[n_value] = 0;
+ 
+                                 /* strip trailing whitespace from key */
+-                                while(n_key && strchr(WHITESPACE, key[--n_key]))
+-                                        key[n_key]=0;
++                                if (last_key_whitespace != (size_t) -1)
++                                        key[last_key_whitespace] = 0;
+ 
+                                 r = push(key, value, userdata);
+                                 if (r < 0)
+@@ -257,6 +265,7 @@ static int parse_env_file_internal(
+                                 n_key = 0;
+                                 value = NULL;
+                                 value_alloc = n_value = 0;
++
+                         } else if (c == '\'')
+                                 state = SINGLE_QUOTE_VALUE;
+                         else if (c == '\"')
+@@ -285,13 +294,13 @@ static int parse_env_file_internal(
+                                 if (value)
+                                         value[n_value] = 0;
+ 
+-                                /* Chomp off trailing whitespace */
+-                                if (last_whitespace != (size_t) -1)
+-                                        value[last_whitespace] = 0;
++                                /* Chomp off trailing whitespace from value */
++                                if (last_value_whitespace != (size_t) -1)
++                                        value[last_value_whitespace] = 0;
+ 
+                                 /* strip trailing whitespace from key */
+-                                while(n_key && strchr(WHITESPACE, key[--n_key]))
+-                                        key[n_key]=0;
++                                if (last_key_whitespace != (size_t) -1)
++                                        key[last_key_whitespace] = 0;
+ 
+                                 r = push(key, value, userdata);
+                                 if (r < 0)
+@@ -300,14 +309,15 @@ static int parse_env_file_internal(
+                                 n_key = 0;
+                                 value = NULL;
+                                 value_alloc = n_value = 0;
++
+                         } else if (c == '\\') {
+                                 state = VALUE_ESCAPE;
+-                                last_whitespace = (size_t) -1;
++                                last_value_whitespace = (size_t) -1;
+                         } else {
+                                 if (!strchr(WHITESPACE, c))
+-                                        last_whitespace = (size_t) -1;
+-                                else if (last_whitespace == (size_t) -1)
+-                                        last_whitespace = n_value;
++                                        last_value_whitespace = (size_t) -1;
++                                else if (last_value_whitespace == (size_t) -1)
++                                        last_value_whitespace = n_value;
+ 
+                                 if (!greedy_realloc((void**) &value, &value_alloc, n_value+2)) {
+                                         r = -ENOMEM;
+@@ -417,9 +427,13 @@ static int parse_env_file_internal(
+                 if (value)
+                         value[n_value] = 0;
+ 
++                if (state == VALUE)
++                        if (last_value_whitespace != (size_t) -1)
++                                value[last_value_whitespace] = 0;
++
+                 /* strip trailing whitespace from key */
+-                while(n_key && strchr(WHITESPACE, key[--n_key]))
+-                        key[n_key]=0;
++                if (last_key_whitespace != (size_t) -1)
++                        key[last_key_whitespace] = 0;
+ 
+                 r = push(key, value, userdata);
+                 if (r < 0)
diff --git a/0058-core-execute-only-clean-the-environment-if-we-have-o.patch b/0058-core-execute-only-clean-the-environment-if-we-have-o.patch
new file mode 100644
index 0000000..37ddc5d
--- /dev/null
+++ b/0058-core-execute-only-clean-the-environment-if-we-have-o.patch
@@ -0,0 +1,24 @@
+From 341923eda80fc43cfcb2de76759b239c75c42ebf Mon Sep 17 00:00:00 2001
+From: Harald Hoyer <harald at redhat.com>
+Date: Thu, 18 Apr 2013 07:15:03 +0200
+Subject: [PATCH] core/execute: only clean the environment, if we have one
+ (cherry picked from commit 5521d6985648669a65d0529bb01c7a32edc99294)
+
+---
+ src/core/execute.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/core/execute.c b/src/core/execute.c
+index 4b29d8e..11993df 100644
+--- a/src/core/execute.c
++++ b/src/core/execute.c
+@@ -1757,7 +1757,8 @@ int exec_context_load_environment(const ExecContext *c, char ***l) {
+                                 return k;
+                          }
+                         /* Log invalid environment variables with filename */
+-                        p = strv_env_clean_log(p, pglob.gl_pathv[n]);
++			if (p)
++	                        p = strv_env_clean_log(p, pglob.gl_pathv[n]);
+ 
+                         if (r == NULL)
+                                 r = p;
diff --git a/systemd.spec b/systemd.spec
index d130a7c..8b05414 100644
--- a/systemd.spec
+++ b/systemd.spec
@@ -13,7 +13,7 @@
 Name:           systemd
 Url:            http://www.freedesktop.org/wiki/Software/systemd
 Version:        201
-Release:        2%{?gitcommit:.git%{gitcommit}}%{?dist}.6
+Release:        2%{?gitcommit:.git%{gitcommit}}%{?dist}.7
 # For a breakdown of the licensing, see README
 License:        LGPLv2+ and MIT and GPLv2+
 Summary:        A System and Service Manager
@@ -93,6 +93,12 @@ Patch0049:      0049-man-clarify-behaviour-of-Also-in-unit-files.patch
 Patch0050:      0050-man-fix-typos-in-systemd.special.patch
 Patch0051:      0051-core-escape-unit-name-from-udev.patch
 Patch0052:      0052-journald-be-more-careful-when-we-try-to-flush-the-ru.patch
+Patch0053:      0053-fileio-also-escape-and-when-writing-out-env-vars.patch
+Patch0054:      0054-fileio-parse_env_file_internal-fix-environment-file-.patch
+Patch0055:      0055-core-execute-report-invalid-environment-variables-fr.patch
+Patch0056:      0056-fileio.c-do-not-parse-comments-after-non-whitespace-.patch
+Patch0057:      0057-fileio-unify-how-we-chop-off-whitespace-from-key-and.patch
+Patch0058:      0058-core-execute-only-clean-the-environment-if-we-have-o.patch
 
 # kernel-install patch for grubby, drop if grubby is obsolete
 Patch1000:      kernel-install-grubby.patch
@@ -830,6 +836,10 @@ fi
 %{_libdir}/pkgconfig/gudev-1.0*
 
 %changelog
+* Fri May 17 2013 Michal Schmidt <mschmidt at redhat.com> - 201-2.fc18.7
+- Pick fileio fixes for environment files (#964132).
+- Drop isdn.service from default preset (Lennart, #959793).
+
 * Tue May 07 2013 Michal Schmidt <mschmidt at redhat.com> - 201-2.fc18.6
 - Avoid sysctl.d precedence rules change (#924433).
 - More patches from upstream.


More information about the scm-commits mailing list