diff -uNr shellinabox-2.20/shellinabox/launcher.c shellinabox-2.20.mod/shellinabox/launcher.c --- shellinabox-2.20/shellinabox/launcher.c 2016-11-09 21:40:33.000000000 +0200 +++ shellinabox-2.20.mod/shellinabox/launcher.c 2020-08-11 21:49:21.332502608 +0300 @@ -676,10 +676,13 @@ // Temporarily regain privileges to update the utmp database uid_t r_uid, e_uid, s_uid; uid_t r_gid, e_gid, s_gid; + +#ifndef __ANDROID__ check(!getresuid(&r_uid, &e_uid, &s_uid)); check(!getresgid(&r_gid, &e_gid, &s_gid)); UNUSED_RETURN(setresuid(0, 0, 0)); UNUSED_RETURN(setresgid(0, 0, 0)); +#endif if (enableUtmpLogging) { setutxent(); @@ -693,10 +696,12 @@ #endif } +#ifndef __ANDROID__ // Switch back to the lower privileges check(!setresgid(r_gid, e_gid, s_gid)); check(!setresuid(r_uid, e_uid, s_uid)); #endif +#endif NOINTR(close(utmp->pty)); } @@ -1162,8 +1167,7 @@ if (service->useDefaultShell) { check(!service->cmdline); - service->cmdline = strdup(*pw->pw_shell ? - pw->pw_shell : "/bin/sh"); + service->cmdline = strdup("@TERMUX_PREFIX@/bin/bash"); } if (restricted && @@ -1217,7 +1221,9 @@ break; } } +#ifndef __ANDROID__ setgroups(ngroups, groups); +#endif free(groups); } @@ -1231,7 +1237,7 @@ (*environment)[numEnvVars++] = stringPrintf(NULL, "SHELL=%s", pw->pw_shell); check( (*environment)[numEnvVars++] = strdup( - "PATH=/usr/local/bin:/usr/bin:/bin:/usr/games")); + "PATH=@TERMUX_PREFIX@/bin")); (*environment)[numEnvVars++] = stringPrintf(NULL, "LOGNAME=%s", service->user); (*environment)[numEnvVars++] = stringPrintf(NULL, "USER=%s", service->user); @@ -1566,10 +1572,13 @@ cfsetospeed(&tt, B38400); tcsetattr(0, TCSAFLUSH, &tt); +#ifndef __ANDROID__ // Assert root privileges in order to update utmp entry. We can only do that, // if we have root permissions otherwise this fails. UNUSED_RETURN(setresuid(0, 0, 0)); UNUSED_RETURN(setresgid(0, 0, 0)); +#endif + #ifdef HAVE_UTMPX_H if (enableUtmpLogging) { setutxent(); @@ -1641,9 +1650,11 @@ #endif } +#ifndef __ANDROID__ // Change user and group ids check(!setresgid(service->gid, service->gid, service->gid)); check(!setresuid(service->uid, service->uid, service->uid)); +#endif // Change working directory if (service->useHomeDir) { @@ -1682,10 +1693,7 @@ snprintf(remoteHost, 256, (*realIP) ? "%s, %s" : "%s%s", peerName, (*realIP) ? realIP : ""); - execle("/bin/login", "login", "-p", "-h", remoteHost, - (void *)0, environment); - execle("/usr/bin/login", "login", "-p", "-h", remoteHost, - (void *)0, environment); + execle("@TERMUX_PREFIX@/bin/pwlogin", "pwlogin", (void *)0, environment); } else { // Launch user provied service execService(width, height, service, peerName, realIP, environment, url);