[git commit] ash: catch error in arithmetic expansion in PS1

Denys Vlasenko vda.linux at googlemail.com
Fri Apr 19 11:21:34 UTC 2019


commit: https://git.busybox.net/busybox/commit/?id=d1a2fa2a4e013960bf56dfef8a71ed2d08fc756b
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

Setting PS1 to:

   PS1='$((123+))'

causes the shell to enter an infinite error loop:

   sh: arithmetic syntax error

Catch any exception raised by expandarg() in expandstr() and allow
processing to continue.

function                                             old     new   delta
expandstr                                            262     344     +82
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 82/0)               Total: 82 bytes

Signed-off-by: Ron Yorston <rmy at pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/ash.c | 32 ++++++++++++++++++++------------
 1 file changed, 20 insertions(+), 12 deletions(-)

diff --git a/shell/ash.c b/shell/ash.c
index f3a2c6952..924e17f32 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -13043,6 +13043,9 @@ expandstr(const char *ps, int syntax_type)
 	union node n;
 	int saveprompt;
 	struct parsefile *file_stop = g_parsefile;
+	volatile int saveint;
+	struct jmploc *volatile savehandler = exception_handler;
+	struct jmploc jmploc;
 
 	/* XXX Fix (char *) cast. */
 	setinputstring((char *)ps);
@@ -13054,18 +13057,13 @@ expandstr(const char *ps, int syntax_type)
 	 * Try a prompt with syntactically wrong command:
 	 * PS1='$(date "+%H:%M:%S) > '
 	 */
-	{
-		volatile int saveint;
-		struct jmploc *volatile savehandler = exception_handler;
-		struct jmploc jmploc;
-		SAVE_INT(saveint);
-		if (setjmp(jmploc.loc) == 0) {
-			exception_handler = &jmploc;
-			readtoken1(pgetc(), syntax_type, FAKEEOFMARK, 0);
-		}
-		exception_handler = savehandler;
-		RESTORE_INT(saveint);
+	SAVE_INT(saveint);
+	if (setjmp(jmploc.loc) == 0) {
+		exception_handler = &jmploc;
+		readtoken1(pgetc(), syntax_type, FAKEEOFMARK, 0);
 	}
+	exception_handler = savehandler;
+	RESTORE_INT(saveint);
 
 	doprompt = saveprompt;
 
@@ -13077,7 +13075,17 @@ expandstr(const char *ps, int syntax_type)
 	n.narg.text = wordtext;
 	n.narg.backquote = backquotelist;
 
-	expandarg(&n, NULL, EXP_QUOTED);
+	/* expandarg() might fail too:
+	 * PS1='$((123+))'
+	 */
+	SAVE_INT(saveint);
+	if (setjmp(jmploc.loc) == 0) {
+		exception_handler = &jmploc;
+		expandarg(&n, NULL, EXP_QUOTED);
+	}
+	exception_handler = savehandler;
+	RESTORE_INT(saveint);
+
 	return stackblock();
 }
 


More information about the busybox-cvs mailing list