From 452cc1d9bdd7848e960919916de7c405512cad05 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 14 Aug 2017 14:23:45 +0200 Subject: [PATCH] ash: [PARSER] Catch variable length expansions on non-existant specials Upstream commit: Date: Thu, 30 Oct 2014 11:53:35 +0800 [PARSER] Catch variable length expansions on non-existant specials Currently we only check special variable names that follow directly after $ or ${. So errors such as ${#&} are not caught. This patch fixes that by moving the is_special check to just before we print out the special variable name. Signed-off-by: Herbert Xu function old new delta readtoken1 2630 2635 +5 Signed-off-by: Denys Vlasenko --- shell/ash.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/shell/ash.c b/shell/ash.c index 15c7c325a..1917b552c 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -12119,7 +12119,7 @@ parsesub: { STPUTC(c, out); c = pgetc_eatbnl(); } while (isdigit(c)); - } else if (is_special(c)) { + } else { /* $[{[#]][}] */ int cc = c; @@ -12137,10 +12137,16 @@ parsesub: { cc = '#'; } } + + if (!is_special(cc)) { + if (subtype == VSLENGTH) + subtype = 0; + goto badsub; + } + USTPUTC(cc, out); - } else { - goto badsub; } + if (c != '}' && subtype == VSLENGTH) { /* ${#VAR didn't end with } */ goto badsub; -- 2.25.1