* [PATCH 2/6] tests: add unit tests for config file parser
2018-03-06 22:56 [PATCH 0/6] Fixes for config file parsing Martin Wilck
2018-03-06 22:56 ` [PATCH 1/6] tests/uevent: fix -Wcast-qual errors Martin Wilck
@ 2018-03-06 22:56 ` Martin Wilck
2018-03-06 22:56 ` [PATCH 3/6] libmultipath: config parser: don't strip whitepace between quotes Martin Wilck
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Martin Wilck @ 2018-03-06 22:56 UTC (permalink / raw)
To: Christophe Varoqui; +Cc: Xose Vazquez Perez, dm-devel, Martin Wilck
Add test cases for parsing the config file.
Some of these tests currently fail unless the CPP macros at the top
are set to 1. The patches that follow fix them.
Signed-off-by: Martin Wilck <mwilck@suse.com>
---
tests/Makefile | 2 +-
tests/globals.c | 1 +
tests/parser.c | 497 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 499 insertions(+), 1 deletion(-)
create mode 100644 tests/parser.c
diff --git a/tests/Makefile b/tests/Makefile
index f6b55836a434..231f73bc7332 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -3,7 +3,7 @@ include ../Makefile.inc
CFLAGS += $(BIN_CFLAGS) -I$(multipathdir) -I$(mpathcmddir)
LIBDEPS += -L$(multipathdir) -lmultipath -lcmocka
-TESTS := uevent
+TESTS := uevent parser
.SILENT: $(TESTS:%=%.o)
.PRECIOUS: $(TESTS:%=%-test)
diff --git a/tests/globals.c b/tests/globals.c
index 96a56515fd09..80f57bd3639a 100644
--- a/tests/globals.c
+++ b/tests/globals.c
@@ -6,6 +6,7 @@ struct udev *udev;
int logsink = 0;
struct config conf = {
.uid_attrs = "sd:ID_BOGUS",
+ .verbosity = 4,
};
struct config *get_multipath_config(void)
diff --git a/tests/parser.c b/tests/parser.c
new file mode 100644
index 000000000000..e77d7ef56caf
--- /dev/null
+++ b/tests/parser.c
@@ -0,0 +1,497 @@
+/*
+ * Copyright (c) 2018 SUSE Linux GmbH
+ *
+ * This program 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.
+ *
+ * This program 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 this program; if not, write to the Free Software
+ *
+ */
+
+#include <stdbool.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <setjmp.h>
+#include <stdlib.h>
+#include <cmocka.h>
+// #include "list.h"
+#include "parser.h"
+#include "vector.h"
+
+#include "globals.c"
+
+/* Set these to 1 to get success for current broken behavior */
+/* Strip leading whitespace between quotes */
+#define LSTRIP_QUOTED_WSP 0
+/* Stop parsing at 2nd quote */
+#define TWO_QUOTES_ONLY 0
+
+#if TWO_QUOTES_ONLY
+static const char quote_marker[] = { '"', '\0' };
+#else
+static const char quote_marker[] = { '\0', '"', '\0' };
+#endif
+static bool is_quote(const char* token)
+{
+ return !memcmp(token, quote_marker, sizeof(quote_marker));
+}
+
+static char *test_file = "test.conf";
+
+/* Missing declaration */
+int validate_config_strvec(vector strvec, char *file);
+
+/* Stringify helpers */
+#define _str_(x) #x
+#define str(x) _str_(x)
+
+static int setup(void **state)
+{
+ return 0;
+}
+
+static int teardown(void **state)
+{
+ return 0;
+}
+
+static void test01(void **state)
+{
+ vector v = alloc_strvec("keyword value");
+ char *val;
+
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 2);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_string_equal(VECTOR_SLOT(v, 1), "value");
+
+ val = set_value(v);
+ assert_string_equal(val, "value");
+
+ free(val);
+ free_strvec(v);
+}
+
+static void test02(void **state)
+{
+ vector v = alloc_strvec("keyword \"value\"");
+ char *val;
+
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 4);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+ assert_string_equal(VECTOR_SLOT(v, 2), "value");
+ assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+ val = set_value(v);
+ assert_string_equal(val, "value");
+
+ free(val);
+ free_strvec(v);
+}
+
+static void test03(void **state)
+{
+ vector v = alloc_strvec("keyword value\n");
+ char *val;
+
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 2);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_string_equal(VECTOR_SLOT(v, 1), "value");
+
+ val = set_value(v);
+ assert_string_equal(val, "value");
+
+ free(val);
+ free_strvec(v);
+}
+
+static void test04(void **state)
+{
+ vector v = alloc_strvec("keyword \t value \t \n ");
+ char *val;
+
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 2);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_string_equal(VECTOR_SLOT(v, 1), "value");
+
+ val = set_value(v);
+ assert_string_equal(val, "value");
+
+ free(val);
+ free_strvec(v);
+}
+
+static void test05(void **state)
+{
+ vector v = alloc_strvec("keyword \t value \t ! comment ");
+ char *val;
+
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 2);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_string_equal(VECTOR_SLOT(v, 1), "value");
+
+ val = set_value(v);
+ assert_string_equal(val, "value");
+
+ free(val);
+ free_strvec(v);
+}
+
+static void test06(void **state)
+{
+ vector v = alloc_strvec("keyword \t value # \n comment ");
+ char *val;
+
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 2);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_string_equal(VECTOR_SLOT(v, 1), "value");
+
+ val = set_value(v);
+ assert_string_equal(val, "value");
+
+ free(val);
+ free_strvec(v);
+}
+
+static void test07(void **state)
+{
+ vector v = alloc_strvec("keyword \t value more ");
+ char *val;
+
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 3);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_string_equal(VECTOR_SLOT(v, 1), "value");
+ assert_string_equal(VECTOR_SLOT(v, 2), "more");
+
+ val = set_value(v);
+ assert_string_equal(val, "value");
+
+ free(val);
+ free_strvec(v);
+}
+
+static void test08(void **state)
+{
+#define QUOTED08 " value more "
+#define QUOTED08B "value more "
+ vector v = alloc_strvec("keyword \t \"" QUOTED08 "\"");
+ char *val;
+
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 4);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+#if LSTRIP_QUOTED_WSP
+ assert_string_equal(VECTOR_SLOT(v, 2), QUOTED08B);
+#else
+ assert_string_equal(VECTOR_SLOT(v, 2), QUOTED08);
+#endif
+ assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+ val = set_value(v);
+#if LSTRIP_QUOTED_WSP
+ assert_string_equal(val, QUOTED08B);
+#else
+ assert_string_equal(val, QUOTED08);
+#endif
+ free(val);
+ free_strvec(v);
+}
+
+static void test09(void **state)
+{
+#define QUOTED09 "value # more"
+ vector v = alloc_strvec("keyword \"" QUOTED09 "\"");
+ char *val;
+
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 4);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+ assert_string_equal(VECTOR_SLOT(v, 2), QUOTED09);
+ assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+ val = set_value(v);
+ assert_string_equal(val, QUOTED09);
+
+ free(val);
+ free_strvec(v);
+}
+
+static void test10(void **state)
+{
+#define QUOTED10 "value ! more"
+ vector v = alloc_strvec("keyword \"" QUOTED10 "\"");
+ char *val;
+
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 4);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+ assert_string_equal(VECTOR_SLOT(v, 2), QUOTED10);
+ assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+ val = set_value(v);
+ assert_string_equal(val, QUOTED10);
+
+ free(val);
+ free_strvec(v);
+}
+
+static void test11(void **state)
+{
+#define QUOTED11 "value comment"
+ vector v = alloc_strvec("keyword\"" QUOTED11 "\"");
+ char *val;
+
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 4);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+ assert_string_equal(VECTOR_SLOT(v, 2), QUOTED11);
+ assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+ val = set_value(v);
+ assert_string_equal(val, QUOTED11);
+
+ free(val);
+ free_strvec(v);
+}
+
+static void test12(void **state)
+{
+ vector v = alloc_strvec("key\"word\"");
+ char *val;
+
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 4);
+ assert_string_equal(VECTOR_SLOT(v, 0), "key");
+ assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+ assert_string_equal(VECTOR_SLOT(v, 2), "word");
+ assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+ val = set_value(v);
+ assert_string_equal(val, "word");
+
+ free(val);
+ free_strvec(v);
+}
+
+static void test13(void **state)
+{
+ vector v = alloc_strvec("keyword value \"quoted\"");
+ char *val;
+
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 5);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_string_equal(VECTOR_SLOT(v, 1), "value");
+ assert_true(is_quote(VECTOR_SLOT(v, 2)));;
+ assert_string_equal(VECTOR_SLOT(v, 3), "quoted");
+ assert_true(is_quote(VECTOR_SLOT(v, 4)));;
+
+ val = set_value(v);
+ assert_string_equal(val, "value");
+
+ free(val);
+ free_strvec(v);
+}
+
+static void test14(void **state)
+{
+ vector v = alloc_strvec("keyword \"value \" comment\"\"");
+ char *val;
+
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+#if TWO_QUOTES_ONLY
+ assert_int_equal(VECTOR_SIZE(v), 7);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+ assert_string_equal(VECTOR_SLOT(v, 2), "value ");
+ assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+ assert_string_equal(VECTOR_SLOT(v, 4), "comment");
+ assert_true(is_quote(VECTOR_SLOT(v, 5)));;
+ assert_true(is_quote(VECTOR_SLOT(v, 6)));;
+
+ val = set_value(v);
+ assert_string_equal(val, "value ");
+
+#else
+ assert_int_equal(VECTOR_SIZE(v), 5);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+ assert_string_equal(VECTOR_SLOT(v, 2), "value ");
+ assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+ assert_string_equal(VECTOR_SLOT(v, 4), " comment\"");
+
+ val = set_value(v);
+ assert_string_equal(val, "value ");
+
+#endif
+ free(val);
+ free_strvec(v);
+}
+
+static void test15(void **state)
+{
+#define QUOTED15 "word value\n comment"
+ vector v = alloc_strvec("key\"" QUOTED15 "\"");
+ char *val;
+
+ assert_int_equal(VECTOR_SIZE(v), 4);
+ assert_string_equal(VECTOR_SLOT(v, 0), "key");
+ assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+ assert_string_equal(VECTOR_SLOT(v, 2), QUOTED15);
+ assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+
+ val = set_value(v);
+ assert_string_equal(val, QUOTED15);
+
+ free(val);
+ free_strvec(v);
+}
+
+static void test16(void **state)
+{
+ vector v = alloc_strvec("keyword \"2.5\"\" SSD\"");
+ char *val;
+
+#if TWO_QUOTES_ONLY
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 6);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+ assert_string_equal(VECTOR_SLOT(v, 2), "2.5");
+ assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+ assert_string_equal(VECTOR_SLOT(v, 4), "SSD");
+ assert_true(is_quote(VECTOR_SLOT(v, 5)));;
+
+ val = set_value(v);
+ assert_string_equal(val, "2.5");
+#else
+ assert_int_equal(VECTOR_SIZE(v), 4);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+ assert_string_equal(VECTOR_SLOT(v, 2), "2.5\" SSD");
+ assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+ val = set_value(v);
+ assert_string_equal(val, "2.5\" SSD");
+#endif
+ free(val);
+ free_strvec(v);
+}
+
+static void test17(void **state)
+{
+ vector v = alloc_strvec("keyword \"\"\"\"\" is empty\"");
+ char *val;
+#if TWO_QUOTES_ONLY
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 6);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+ assert_true(is_quote(VECTOR_SLOT(v, 2)));;
+ assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+#if LSTRIP_QUOTED_WSP
+ assert_string_equal(VECTOR_SLOT(v, 4), "is empty");
+#else
+ assert_string_equal(VECTOR_SLOT(v, 4), " is empty");
+#endif
+ assert_true(is_quote(VECTOR_SLOT(v, 5)));;
+
+ val = set_value(v);
+ assert_string_equal(val, "");
+#else
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 4);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+ assert_string_equal(VECTOR_SLOT(v, 2), "\"\" is empty");
+ assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+ val = set_value(v);
+ assert_string_equal(val, "\"\" is empty");
+#endif
+ free(val);
+ free_strvec(v);
+}
+
+static void test18(void **state)
+{
+ vector v = alloc_strvec("keyword \"\"\"\"");
+ char *val;
+#if TWO_QUOTES_ONLY
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 5);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+ assert_true(is_quote(VECTOR_SLOT(v, 2)));;
+ assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+ assert_true(is_quote(VECTOR_SLOT(v, 4)));;
+
+ val = set_value(v);
+ assert_string_equal(val, "");
+#else
+ assert_int_equal(validate_config_strvec(v, test_file), 0);
+ assert_int_equal(VECTOR_SIZE(v), 4);
+ assert_string_equal(VECTOR_SLOT(v, 0), "keyword");
+ assert_true(is_quote(VECTOR_SLOT(v, 1)));;
+ assert_string_equal(VECTOR_SLOT(v, 2), "\"");
+ assert_true(is_quote(VECTOR_SLOT(v, 3)));;
+
+ val = set_value(v);
+ assert_string_equal(val, "\"");
+#endif
+ free(val);
+ free_strvec(v);
+}
+
+int test_config_parser(void)
+{
+ const struct CMUnitTest tests[] = {
+ cmocka_unit_test(test01),
+ cmocka_unit_test(test02),
+ cmocka_unit_test(test03),
+ cmocka_unit_test(test04),
+ cmocka_unit_test(test05),
+ cmocka_unit_test(test06),
+ cmocka_unit_test(test07),
+ cmocka_unit_test(test08),
+ cmocka_unit_test(test09),
+ cmocka_unit_test(test10),
+ cmocka_unit_test(test11),
+ cmocka_unit_test(test12),
+ cmocka_unit_test(test13),
+ cmocka_unit_test(test14),
+ cmocka_unit_test(test15),
+ cmocka_unit_test(test16),
+ cmocka_unit_test(test17),
+ cmocka_unit_test(test18),
+ };
+ return cmocka_run_group_tests(tests, setup, teardown);
+}
+
+int main(void)
+{
+ int ret = 0;
+
+ ret += test_config_parser();
+ return ret;
+}
--
2.16.1
^ permalink raw reply related [flat|nested] 9+ messages in thread* [PATCH 5/6] libmultipath: config parser: fix corner case for double quotes
2018-03-06 22:56 [PATCH 0/6] Fixes for config file parsing Martin Wilck
` (3 preceding siblings ...)
2018-03-06 22:56 ` [PATCH 4/6] libmultipath: config parser: Allow '"' in strings Martin Wilck
@ 2018-03-06 22:56 ` Martin Wilck
2018-03-06 22:56 ` [PATCH 6/6] multipath.conf(5): improve syntax documentation Martin Wilck
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Martin Wilck @ 2018-03-06 22:56 UTC (permalink / raw)
To: Christophe Varoqui; +Cc: Xose Vazquez Perez, dm-devel, Martin Wilck
A corner case of the previous patch are strings starting with a double quote,
such as '"prepended to itself is false" prepended to itself is false' or
'"" is the empty string', and in particular, the string '"' ("\"" in C
notation), which is indistinguishable from the "QUOTE" token in the parsed strvec.
This patch fixes that by introducing a special token that can't occur as part
of a normal string to indicate the beginning and end of a quoted string.
'"' is admittedly not a very likely keyword value for multipath.conf, but
a) this is a matter of correctness, b) we didn't think of '2.5"' before, either, and
c) the (*str != '"') expressions would need to be patched anyway to fix the
'string starting with "' case.
Signed-off-by: Martin Wilck <mwilck@suse.com>
---
libmultipath/parser.c | 36 +++++++++++++++++++-----------------
1 file changed, 19 insertions(+), 17 deletions(-)
diff --git a/libmultipath/parser.c b/libmultipath/parser.c
index 592269a9b5b1..da8de305f680 100644
--- a/libmultipath/parser.c
+++ b/libmultipath/parser.c
@@ -186,6 +186,12 @@ snprint_keyword(char *buff, int len, char *fmt, struct keyword *kw,
return fwd;
}
+static const char quote_marker[] = { '\0', '"', '\0' };
+static bool is_quote(const char* token)
+{
+ return !memcmp(token, quote_marker, sizeof(quote_marker));
+}
+
vector
alloc_strvec(char *string)
{
@@ -225,17 +231,13 @@ alloc_strvec(char *string)
start = cp;
if (!in_string && *cp == '"') {
cp++;
- token = MALLOC(2);
+ token = MALLOC(sizeof(quote_marker));
if (!token)
goto out;
- *(token) = '"';
- *(token + 1) = '\0';
- if (in_string)
- in_string = 0;
- else
- in_string = 1;
+ memcpy(token, quote_marker, sizeof(quote_marker));
+ in_string = 1;
} else if (!in_string && (*cp == '{' || *cp == '}')) {
token = MALLOC(2);
@@ -324,13 +326,13 @@ set_value(vector strvec)
(char *)VECTOR_SLOT(strvec, 0));
return NULL;
}
- size = strlen(str);
- if (size == 0) {
- condlog(0, "option '%s' has empty value",
- (char *)VECTOR_SLOT(strvec, 0));
- return NULL;
- }
- if (*str != '"') {
+ if (!is_quote(str)) {
+ size = strlen(str);
+ if (size == 0) {
+ condlog(0, "option '%s' has empty value",
+ (char *)VECTOR_SLOT(strvec, 0));
+ return NULL;
+ }
alloc = MALLOC(sizeof (char) * (size + 1));
if (alloc)
memcpy(alloc, str, size);
@@ -354,7 +356,7 @@ set_value(vector strvec)
(char *)VECTOR_SLOT(strvec, 0));
return NULL;
}
- if (*str == '"')
+ if (is_quote(str))
break;
tmp = alloc;
/* The first +1 is for the NULL byte. The rest are for the
@@ -460,7 +462,7 @@ validate_config_strvec(vector strvec, char *file)
(char *)VECTOR_SLOT(strvec, 0), line_nr, file);
return -1;
}
- if (*str != '"') {
+ if (!is_quote(str)) {
if (VECTOR_SIZE(strvec) > 2)
condlog(0, "ignoring extra data starting with '%s' on line %d of %s", (char *)VECTOR_SLOT(strvec, 2), line_nr, file);
return 0;
@@ -472,7 +474,7 @@ validate_config_strvec(vector strvec, char *file)
line_nr, file);
return -1;
}
- if (*str == '"') {
+ if (is_quote(str)) {
if (VECTOR_SIZE(strvec) > i + 1)
condlog(0, "ignoring extra data starting with '%s' on line %d of %s", (char *)VECTOR_SLOT(strvec, (i + 1)), line_nr, file);
return 0;
--
2.16.1
^ permalink raw reply related [flat|nested] 9+ messages in thread