From 43cd46fd0d9a7ada1dd7eadf468a46193f7a60de Mon Sep 17 00:00:00 2001 From: Greg Alexander Date: Wed, 16 May 2018 10:47:17 -0400 Subject: [PATCH] su is not a login shell, so if it's in the shell's filename, don't put "-" before argv[0], but do put it in argv[1] because su accepts it as a regular parameter ("-su" was breaking busybox) --- dropbear/dbutil.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/dropbear/dbutil.c b/dropbear/dbutil.c index d9bb745..6e57613 100644 --- a/dropbear/dbutil.c +++ b/dropbear/dbutil.c @@ -598,19 +598,20 @@ void run_shell_command(const char* cmd, unsigned int maxfd, char* usershell) { if (cmd != NULL) { argv[0] = baseshell; + argv[1] = "-c"; + argv[2] = (char*)cmd; + argv[3] = NULL; + } else if (strstr(usershell, "su")) { + /* busybox requires "su" in argv[0], so don't treat it like a + * command shell */ + argv[0] = baseshell; + argv[1] = "-"; + argv[2] = NULL; } else { /* a login shell should be "-bash" for "/bin/bash" etc */ int len = strlen(baseshell) + 2; /* 2 for "-" */ argv[0] = (char*)m_malloc(len); snprintf(argv[0], len, "-%s", baseshell); - } - - if (cmd != NULL) { - argv[1] = "-c"; - argv[2] = (char*)cmd; - argv[3] = NULL; - } else { - /* construct a shell of the form "-bash" etc */ argv[1] = NULL; }