From 566d06ae508ae2f23c555506434028239b2b5b21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 3 Mar 2021 13:47:55 +0100 Subject: [PATCH] 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. --- src/basic/escape.c | 9 ++++----- src/test/test-escape.c | 1 + 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/basic/escape.c b/src/basic/escape.c index 2de275f04e..f45536d9bd 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 854a55174b..848aec37d8 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) {