summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/basic/env-file.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/basic/env-file.c b/src/basic/env-file.c
index 26470796eb..dc92b13a6f 100644
--- a/src/basic/env-file.c
+++ b/src/basic/env-file.c
@@ -209,17 +209,21 @@ static int parse_env_file_internal(
case DOUBLE_QUOTE_VALUE_ESCAPE:
state = DOUBLE_QUOTE_VALUE;
- if (c == '"') {
+ if (strchr(SHELL_NEED_ESCAPE, c)) {
+ /* If this is a char that needs escaping, just unescape it. */
if (!GREEDY_REALLOC(value, value_alloc, n_value+2))
return -ENOMEM;
- value[n_value++] = '"';
- } else if (!strchr(NEWLINE, c)) {
+ value[n_value++] = c;
+ } else if (c != '\n') {
+ /* If other char than what needs escaping, keep the "\" in place, like the
+ * real shell does. */
if (!GREEDY_REALLOC(value, value_alloc, n_value+3))
return -ENOMEM;
value[n_value++] = '\\';
value[n_value++] = c;
}
+ /* Escaped newlines (aka "continuation lines") are eaten up entirely */
break;
case COMMENT: