do not fail out on chdir if chroot is used

pull/441/head
JacobBarthelmeh 2022-08-31 13:27:10 -07:00
parent e1f72a00e1
commit 887edc29e3
1 changed files with 14 additions and 6 deletions

View File

@ -305,7 +305,7 @@ static int SetupChroot(WOLFSSHD_CONFIG* usrConf)
#define TEST_SFTP_TIMEOUT 1 #define TEST_SFTP_TIMEOUT 1
/* handle SFTP operations /* handle SFTP operations
* returns 0 on success * returns WS_SUCCESS on success
*/ */
static int SFTP_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh, static int SFTP_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh,
WPASSWD* pPasswd, WOLFSSHD_CONFIG* usrConf) WPASSWD* pPasswd, WOLFSSHD_CONFIG* usrConf)
@ -405,6 +405,9 @@ static int SFTP_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh,
#define MAX_COMMAND_SZ 80 #define MAX_COMMAND_SZ 80
#endif #endif
/* handles creating a new shell env. and maintains SSH connection for incoming
* user input as well as output of the shell.
* return WS_SUCCESS on success */
static int SHELL_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh, static int SHELL_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh,
WPASSWD* pPasswd, WOLFSSHD_CONFIG* usrConf) WPASSWD* pPasswd, WOLFSSHD_CONFIG* usrConf)
{ {
@ -450,7 +453,8 @@ static int SHELL_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh,
signal(SIGINT, SIG_DFL); signal(SIGINT, SIG_DFL);
signal(SIGCHLD, SIG_DFL); signal(SIGCHLD, SIG_DFL);
if (SetupChroot(usrConf) < 0) { rc = SetupChroot(usrConf);
if (rc < 0) {
wolfSSH_Log(WS_LOG_ERROR, "[SSHD] Error setting chroot"); wolfSSH_Log(WS_LOG_ERROR, "[SSHD] Error setting chroot");
if (wolfSSHD_AuthReducePermissions(conn->auth) != WS_SUCCESS) { if (wolfSSHD_AuthReducePermissions(conn->auth) != WS_SUCCESS) {
/* stop everything if not able to reduce permissions level */ /* stop everything if not able to reduce permissions level */
@ -473,10 +477,14 @@ static int SHELL_Subsystem(WOLFSSHD_CONNECTION* conn, WOLFSSH* ssh,
setenv("HOME", pPasswd->pw_dir, 1); setenv("HOME", pPasswd->pw_dir, 1);
setenv("LOGNAME", pPasswd->pw_name, 1); setenv("LOGNAME", pPasswd->pw_name, 1);
rc = chdir(pPasswd->pw_dir);
if (rc != 0) { /* if chroot was not used then try to change to users direcotry */
wolfSSH_Log(WS_LOG_ERROR, "[SSHD] Error going to user home dir"); if (rc == 0) {
return WS_FATAL_ERROR; rc = chdir(pPasswd->pw_dir);
if (rc != 0) {
wolfSSH_Log(WS_LOG_ERROR, "[SSHD] Error going to user home dir");
return WS_FATAL_ERROR;
}
} }
/* default to /bin/sh if user shell is not set */ /* default to /bin/sh if user shell is not set */