[git commit] ash: survive failures in $PS1 expansion. Closes 10371

Denys Vlasenko vda.linux at googlemail.com
Thu Oct 12 17:20:13 UTC 2017


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

function                                             old     new   delta
expandstr                                            120     209     +89

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/ash.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/shell/ash.c b/shell/ash.c
index 39705a3..ef81ea7 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -12656,7 +12656,24 @@ expandstr(const char *ps, int syntax_type)
 
 	saveprompt = doprompt;
 	doprompt = 0;
-	readtoken1(pgetc(), syntax_type, FAKEEOFMARK, 0);
+
+	/* readtoken1() might die horribly.
+	 * Try a prompt with syntacticallyt 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);
+	}
+
 	doprompt = saveprompt;
 
 	popfile();


More information about the busybox-cvs mailing list