]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic/strv: fix splitting of strings with escape characters 23290/head
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 6 May 2022 16:23:06 +0000 (18:23 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Fri, 6 May 2022 16:26:30 +0000 (18:26 +0200)
Plain strv_split() should not care if the strings contains backslashes
or quote characters. But extract_first_word() interprets backslashes
unless EXTRACT_RETAIN_ESCAPE is given.

I wonder how it's possible that nobody noticed this before. I think this
code was introduced in 0645b83a40d1c782f173c4d8440ab2fc82a75006.

src/basic/strv.h
src/test/test-strv.c

index 62950588764e4b0b442f5e422949b47a5f6bf1d6..b9563e8692f790eb4704af36c460094c20013474 100644 (file)
@@ -77,7 +77,7 @@ int strv_split_full(char ***t, const char *s, const char *separators, ExtractFla
 static inline char** strv_split(const char *s, const char *separators) {
         char **ret;
 
-        if (strv_split_full(&ret, s, separators, 0) < 0)
+        if (strv_split_full(&ret, s, separators, EXTRACT_RETAIN_ESCAPE) < 0)
                 return NULL;
 
         return ret;
index dabb0cd9737f55e3bdb542834dfdc38e694f1be4..331c277c3529e2edc3fc285ef0a80da4294cbfc8 100644 (file)
@@ -317,6 +317,21 @@ TEST(strv_split) {
 
         assert_se(strv_split_full(&l, "\\", NULL, EXTRACT_UNQUOTE | EXTRACT_RELAX | EXTRACT_UNESCAPE_RELAX) == 1);
         assert_se(strv_equal(l, STRV_MAKE("\\")));
+
+        l = strv_free_erase(l);
+
+        assert_se(l = strv_split("\\", NULL));
+        assert_se(strv_equal(l, STRV_MAKE("\\")));
+
+        l = strv_free_erase(l);
+
+        assert_se(l = strv_split("aa\\ bb\\", NULL));
+        assert_se(strv_equal(l, STRV_MAKE("aa\\", "bb\\")));
+
+        l = strv_free_erase(l);
+
+        assert_se(l = strv_split("aa\" bb'", NULL));
+        assert_se(strv_equal(l, STRV_MAKE("aa\"", "bb'")));
 }
 
 TEST(strv_split_empty) {