chiark / gitweb /
load-fragment: properly do comparison of words
authorLennart Poettering <lennart@poettering.net>
Sun, 14 Nov 2010 18:58:33 +0000 (19:58 +0100)
committerLennart Poettering <lennart@poettering.net>
Sun, 14 Nov 2010 18:59:10 +0000 (19:59 +0100)
.gitignore
Makefile.am
src/load-fragment.c
src/test-strv.c [new file with mode: 0644]

index 21dd39456e7e5962b06d0d12e440c138e59b2523..d5c667ab17bc80abca8139c6c3fd198c31aafd49 100644 (file)
@@ -1,3 +1,4 @@
+test-strv
 systemd-ac-power
 systemd-timestamp
 systemd-cryptsetup
 systemd-ac-power
 systemd-timestamp
 systemd-cryptsetup
index 8c92256d7f8aced9e03530484a0bf896ff1398c1..e008cc78d8cd923a0fe20a299f2dd2ba93aba72a 100644 (file)
@@ -137,7 +137,8 @@ noinst_PROGRAMS = \
        test-hostname \
        test-daemon \
        test-cgroup \
        test-hostname \
        test-daemon \
        test-cgroup \
-       test-env-replace
+       test-env-replace \
+       test-strv
 
 if HAVE_PAM
 pamlib_LTLIBRARIES = \
 
 if HAVE_PAM
 pamlib_LTLIBRARIES = \
@@ -619,6 +620,15 @@ test_env_replace_CFLAGS = \
 test_env_replace_LDADD = \
        libsystemd-basic.la
 
 test_env_replace_LDADD = \
        libsystemd-basic.la
 
+test_strv_SOURCES = \
+       src/test-strv.c
+
+test_strv_CFLAGS = \
+       $(AM_CFLAGS)
+
+test_strv_LDADD = \
+       libsystemd-basic.la
+
 systemd_logger_SOURCES = \
        src/logger.c \
        src/sd-daemon.c \
 systemd_logger_SOURCES = \
        src/logger.c \
        src/sd-daemon.c \
index 424e6c37bb9d8d6e82572d986713a407ae04eec5..9b39d9161af1efbf0504587cad0496b674117de8 100644 (file)
@@ -433,7 +433,7 @@ static int config_parse_exec(
 
                 k = 0;
                 FOREACH_WORD_QUOTED(w, l, rvalue, state) {
 
                 k = 0;
                 FOREACH_WORD_QUOTED(w, l, rvalue, state) {
-                        if (strncmp(w, ";", l) == 0)
+                        if (strncmp(w, ";", MAX(l, 1U)) == 0)
                                 break;
 
                         k++;
                                 break;
 
                         k++;
@@ -444,7 +444,7 @@ static int config_parse_exec(
 
                 k = 0;
                 FOREACH_WORD_QUOTED(w, l, rvalue, state) {
 
                 k = 0;
                 FOREACH_WORD_QUOTED(w, l, rvalue, state) {
-                        if (strncmp(w, ";", l) == 0)
+                        if (strncmp(w, ";", MAX(l, 1U)) == 0)
                                 break;
 
                         if (honour_argv0 && w == rvalue) {
                                 break;
 
                         if (honour_argv0 && w == rvalue) {
@@ -1077,11 +1077,11 @@ static int config_parse_mount_flags(
         assert(data);
 
         FOREACH_WORD_QUOTED(w, l, rvalue, state) {
         assert(data);
 
         FOREACH_WORD_QUOTED(w, l, rvalue, state) {
-                if (strncmp(w, "shared", l) == 0)
+                if (strncmp(w, "shared", MAX(l, 6U)) == 0)
                         flags |= MS_SHARED;
                         flags |= MS_SHARED;
-                else if (strncmp(w, "slave", l) == 0)
+                else if (strncmp(w, "slave", MAX(l, 5U)) == 0)
                         flags |= MS_SLAVE;
                         flags |= MS_SLAVE;
-                else if (strncmp(w, "private", l) == 0)
+                else if (strncmp(w, "private", MAX(l, 7U)) == 0)
                         flags |= MS_PRIVATE;
                 else {
                         log_error("[%s:%u] Failed to parse mount flags, ignoring: %s", filename, line, rvalue);
                         flags |= MS_PRIVATE;
                 else {
                         log_error("[%s:%u] Failed to parse mount flags, ignoring: %s", filename, line, rvalue);
diff --git a/src/test-strv.c b/src/test-strv.c
new file mode 100644 (file)
index 0000000..5734368
--- /dev/null
@@ -0,0 +1,41 @@
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
+
+/***
+  This file is part of systemd.
+
+  Copyright 2010 Lennart Poettering
+
+  systemd is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  systemd is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include <string.h>
+#include "util.h"
+
+int main(int argc, char *argv[]) {
+        char *w, *state;
+        size_t l;
+        const char test[] = "test a b c 'd' e '' '' hhh '' ''";
+
+        printf("<%s>\n", test);
+
+        FOREACH_WORD_QUOTED(w, l, test, state) {
+                char *t;
+
+                assert_se(t = strndup(w, l));
+                printf("<%s>\n", t);
+                free(t);
+        }
+
+        return 0;
+}