From: Zbigniew Jędrzejewski-Szmek Date: Wed, 3 Mar 2021 12:47:55 +0000 (+0100) Subject: basic/escape: always escape newlines in shell_escape() X-Git-Tag: v249-rc1~274^2~17 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=566d06ae508ae2f23c555506434028239b2b5b21;p=thirdparty%2Fsystemd.git basic/escape: always escape newlines in shell_escape() shell_escape() is mostly used for mount paths and similar, where we assume no newlines are present in the string. But if any were ever present, we should escape them. So let's simplify the code by making this unconditional. --- diff --git a/src/basic/escape.c b/src/basic/escape.c index 2de275f04e1..f45536d9bde 100644 --- a/src/basic/escape.c +++ b/src/basic/escape.c @@ -462,11 +462,11 @@ char* octescape(const char *s, size_t len) { } -static char* strcpy_backslash_escaped(char *t, const char *s, const char *bad, bool escape_tab_nl) { +static char* strcpy_backslash_escaped(char *t, const char *s, const char *bad) { assert(bad); for (; *s; s++) { - if (escape_tab_nl && IN_SET(*s, '\n', '\t')) { + if (IN_SET(*s, '\n', '\t')) { *(t++) = '\\'; *(t++) = *s == '\n' ? 'n' : 't'; continue; @@ -488,7 +488,7 @@ char* shell_escape(const char *s, const char *bad) { if (!r) return NULL; - t = strcpy_backslash_escaped(r, s, bad, false); + t = strcpy_backslash_escaped(r, s, bad); *t = 0; return r; @@ -530,8 +530,7 @@ char* shell_maybe_quote(const char *s, ShellEscapeFlags flags) { t = mempcpy(t, s, p - s); t = strcpy_backslash_escaped(t, p, - FLAGS_SET(flags, SHELL_ESCAPE_POSIX) ? SHELL_NEED_ESCAPE_POSIX : SHELL_NEED_ESCAPE, - true); + FLAGS_SET(flags, SHELL_ESCAPE_POSIX) ? SHELL_NEED_ESCAPE_POSIX : SHELL_NEED_ESCAPE); if (FLAGS_SET(flags, SHELL_ESCAPE_POSIX)) *(t++) = '\''; diff --git a/src/test/test-escape.c b/src/test/test-escape.c index 854a55174b9..848aec37d8c 100644 --- a/src/test/test-escape.c +++ b/src/test/test-escape.c @@ -127,6 +127,7 @@ static void test_shell_escape(void) { test_shell_escape_one("foobar", "", "foobar"); test_shell_escape_one("foobar", "o", "f\\o\\obar"); test_shell_escape_one("foo:bar,baz", ",:", "foo\\:bar\\,baz"); + test_shell_escape_one("foo\nbar\nbaz", ",:", "foo\\nbar\\nbaz"); } static void test_shell_maybe_quote_one(const char *s, ShellEscapeFlags flags, const char *expected) {