aboutsummaryrefslogtreecommitdiffstats
path: root/main/busybox
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2015-10-29 13:48:20 +0100
committerNatanael Copa <ncopa@alpinelinux.org>2015-10-29 13:48:20 +0100
commitf51fb868b73bec3e55fda6b857c568d8ef46de79 (patch)
treee65f421846e0ec20f9461851751a046c01d53163 /main/busybox
parentada3afa9aa74972ec117df1f6cc420615fc0b176 (diff)
downloadaports-f51fb868b73bec3e55fda6b857c568d8ef46de79.tar.bz2
aports-f51fb868b73bec3e55fda6b857c568d8ef46de79.tar.xz
main/busybox: fix issue with ash here documents
Diffstat (limited to 'main/busybox')
-rw-r--r--main/busybox/0001-ash-backport-fix-for-here-document-issues.patch165
1 files changed, 165 insertions, 0 deletions
diff --git a/main/busybox/0001-ash-backport-fix-for-here-document-issues.patch b/main/busybox/0001-ash-backport-fix-for-here-document-issues.patch
new file mode 100644
index 0000000000..7c9d8a9835
--- /dev/null
+++ b/main/busybox/0001-ash-backport-fix-for-here-document-issues.patch
@@ -0,0 +1,165 @@
+From c0eb20351d14932c5535789bce0251ab8718df77 Mon Sep 17 00:00:00 2001
+From: Ron Yorston <rmy@pobox.com>
+Date: Thu, 29 Oct 2015 11:31:39 +0000
+Subject: [PATCH] ash: backport fix for here document issues
+
+Reported-by: Natanael Copa <ncopa@alpinelinux.org>
+Signed-off-by: Ron Yorston <rmy@pobox.com>
+---
+ shell/ash.c | 72 +++++++++++++------------------
+ shell/ash_test/ash-heredoc/heredoc2.right | 2 +
+ shell/ash_test/ash-heredoc/heredoc2.tests | 7 +++
+ 3 files changed, 39 insertions(+), 42 deletions(-)
+ create mode 100644 shell/ash_test/ash-heredoc/heredoc2.right
+ create mode 100644 shell/ash_test/ash-heredoc/heredoc2.tests
+
+diff --git a/shell/ash.c b/shell/ash.c
+index 8a1628e..f13dd2a 100644
+--- a/shell/ash.c
++++ b/shell/ash.c
+@@ -10516,7 +10516,7 @@ static union node *andor(void);
+ static union node *pipeline(void);
+ static union node *parse_command(void);
+ static void parseheredoc(void);
+-static char nexttoken_ends_list(void);
++static int peektoken(void);
+ static int readtoken(void);
+
+ static union node *
+@@ -10525,11 +10525,27 @@ list(int nlflag)
+ union node *n1, *n2, *n3;
+ int tok;
+
+- checkkwd = CHKNL | CHKKWD | CHKALIAS;
+- if (nlflag == 2 && nexttoken_ends_list())
+- return NULL;
+ n1 = NULL;
+ for (;;) {
++ switch (peektoken()) {
++ case TNL:
++ if (!(nlflag & 1))
++ break;
++ parseheredoc();
++ return n1;
++
++ case TEOF:
++ if (!n1 && (nlflag & 1))
++ n1 = NODE_EOF;
++ parseheredoc();
++ return n1;
++ }
++
++ checkkwd = CHKNL | CHKKWD | CHKALIAS;
++ if (nlflag == 2 && tokname_array[peektoken()][0])
++ return n1;
++ nlflag |= 2;
++
+ n2 = andor();
+ tok = readtoken();
+ if (tok == TBACKGND) {
+@@ -10555,37 +10571,15 @@ list(int nlflag)
+ n1 = n3;
+ }
+ switch (tok) {
++ case TNL:
++ case TEOF:
++ tokpushback = 1;
++ /* fall through */
+ case TBACKGND:
+ case TSEMI:
+- tok = readtoken();
+- /* fall through */
+- case TNL:
+- if (tok == TNL) {
+- parseheredoc();
+- if (nlflag == 1)
+- return n1;
+- } else {
+- tokpushback = 1;
+- }
+- checkkwd = CHKNL | CHKKWD | CHKALIAS;
+- if (nexttoken_ends_list()) {
+- /* Testcase: "<<EOF; then <W".
+- * It used to segfault w/o this check:
+- */
+- if (heredoclist) {
+- raise_error_unexpected_syntax(-1);
+- }
+- return n1;
+- }
+ break;
+- case TEOF:
+- if (heredoclist)
+- parseheredoc();
+- else
+- pungetc(); /* push back EOF on input */
+- return n1;
+ default:
+- if (nlflag == 1)
++ if ((nlflag & 1))
+ raise_error_unexpected_syntax(-1);
+ tokpushback = 1;
+ return n1;
+@@ -11954,14 +11948,14 @@ readtoken(void)
+ return t;
+ }
+
+-static char
+-nexttoken_ends_list(void)
++static int
++peektoken(void)
+ {
+ int t;
+
+ t = readtoken();
+ tokpushback = 1;
+- return tokname_array[t][0];
++ return t;
+ }
+
+ /*
+@@ -11971,18 +11965,12 @@ nexttoken_ends_list(void)
+ static union node *
+ parsecmd(int interact)
+ {
+- int t;
+-
+ tokpushback = 0;
++ checkkwd = 0;
++ heredoclist = 0;
+ doprompt = interact;
+ setprompt_if(doprompt, doprompt);
+ needprompt = 0;
+- t = readtoken();
+- if (t == TEOF)
+- return NODE_EOF;
+- if (t == TNL)
+- return NULL;
+- tokpushback = 1;
+ return list(1);
+ }
+
+diff --git a/shell/ash_test/ash-heredoc/heredoc2.right b/shell/ash_test/ash-heredoc/heredoc2.right
+new file mode 100644
+index 0000000..a486f1a
+--- /dev/null
++++ b/shell/ash_test/ash-heredoc/heredoc2.right
+@@ -0,0 +1,2 @@
++bar
++bar
+diff --git a/shell/ash_test/ash-heredoc/heredoc2.tests b/shell/ash_test/ash-heredoc/heredoc2.tests
+new file mode 100644
+index 0000000..6d9ccb6
+--- /dev/null
++++ b/shell/ash_test/ash-heredoc/heredoc2.tests
+@@ -0,0 +1,7 @@
++foo () {
++cat <<EOF && { echo "$1" ; }
++$1
++EOF
++}
++
++foo "bar"
+--
+2.6.1
+