From e19e1935a33b117e2ee6daf9b2d79c00603333c7 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 3 May 2009 02:15:18 +0200 Subject: [PATCH] hush: fix \ handling Signed-off-by: Denys Vlasenko --- shell/hush.c | 28 +++++++++++----------- shell/hush_test/hush-parsing/escape4.right | 2 ++ shell/hush_test/hush-parsing/escape4.tests | 6 +++++ shell/hush_test/hush-parsing/group1.tests | 0 4 files changed, 22 insertions(+), 14 deletions(-) create mode 100644 shell/hush_test/hush-parsing/escape4.right create mode 100755 shell/hush_test/hush-parsing/escape4.tests mode change 100644 => 100755 shell/hush_test/hush-parsing/group1.tests diff --git a/shell/hush.c b/shell/hush.c index 255caef01..c6e940548 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -50,14 +50,9 @@ * * TODOs: * grep for "TODO" and fix (some of them are easy) - * change { and } from special chars to reserved words * $var refs in function do not pick up values set by "var=val func" * builtins: ulimit * follow IFS rules more precisely, including update semantics - * figure out what to do with backslash-newline - * continuation lines, both explicit and implicit - done? - * separate job control from interactiveness - * (testcase: booting with init=/bin/hush does not show prompt (2009-04)) * * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. */ @@ -5347,10 +5342,12 @@ static int parse_stream_dquoted(o_string *as_string, * $, `, ", \, or . A double quote may be quoted * within double quotes by preceding it with a backslash. */ - if (strchr("$`\"\\", next) != NULL) { + if (strchr("$`\"\\\n", next) != NULL) { ch = i_getch(input); - o_addqchr(dest, ch); - nommu_addchr(as_string, ch); + if (ch != '\n') { + o_addqchr(dest, ch); + nommu_addchr(as_string, ch); + } } else { o_addqchr(dest, '\\'); nommu_addchr(as_string, '\\'); @@ -5677,13 +5674,16 @@ static struct pipe *parse_stream(char **pstring, syntax_error("\\"); xfunc_die(); } - o_addchr(&dest, '\\'); ch = i_getch(input); - nommu_addchr(&ctx.as_string, ch); - o_addchr(&dest, ch); - /* Example: echo Hello \2>file - * we need to know that word 2 is quoted */ - dest.o_quoted = 1; + if (ch != '\n') { + o_addchr(&dest, '\\'); + nommu_addchr(&ctx.as_string, '\\'); + o_addchr(&dest, ch); + nommu_addchr(&ctx.as_string, ch); + /* Example: echo Hello \2>file + * we need to know that word 2 is quoted */ + dest.o_quoted = 1; + } break; case '$': if (handle_dollar(&ctx.as_string, &dest, input) != 0) { diff --git a/shell/hush_test/hush-parsing/escape4.right b/shell/hush_test/hush-parsing/escape4.right new file mode 100644 index 000000000..5de3e0c90 --- /dev/null +++ b/shell/hush_test/hush-parsing/escape4.right @@ -0,0 +1,2 @@ +Ok +End diff --git a/shell/hush_test/hush-parsing/escape4.tests b/shell/hush_test/hush-parsing/escape4.tests new file mode 100755 index 000000000..df8bf0af7 --- /dev/null +++ b/shell/hush_test/hush-parsing/escape4.tests @@ -0,0 +1,6 @@ +i\ +f tr\ +ue; th\ +en echo "O\ +k"; fi; echo "\ +End" \ No newline at end of file diff --git a/shell/hush_test/hush-parsing/group1.tests b/shell/hush_test/hush-parsing/group1.tests old mode 100644 new mode 100755