Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions nshlib/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,11 @@ config NSH_DISABLE_CD
bool "Disable cd"
default DEFAULT_SMALL

config NSH_DISABLE_CHROOT
bool "Disable chroot"
default DEFAULT_SMALL
depends on FS_CHROOT

config NSH_DISABLE_CHMOD
bool "Disable chmod"
default DEFAULT_SMALL
Expand Down
3 changes: 3 additions & 0 deletions nshlib/nsh.h
Original file line number Diff line number Diff line change
Expand Up @@ -1084,6 +1084,9 @@ int cmd_irqinfo(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv);
#ifndef CONFIG_NSH_DISABLE_CD
int cmd_cd(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv);
#endif
#if defined(CONFIG_FS_CHROOT) && !defined(CONFIG_NSH_DISABLE_CHROOT)
int cmd_chroot(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv);
#endif
#ifndef CONFIG_NSH_DISABLE_PWD
int cmd_pwd(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv);
#endif
Expand Down
5 changes: 5 additions & 0 deletions nshlib/nsh_command.c
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,11 @@ static const struct cmdmap_s g_cmdmap[] =
CMD_MAP("cd", cmd_cd, 1, 2, "[<dir-path>|-|~|..]"),
#endif

#if defined(CONFIG_FS_CHROOT) && !defined(CONFIG_NSH_DISABLE_CHROOT)
CMD_MAP("chroot", cmd_chroot, 2, CONFIG_NSH_MAXARGUMENTS,
"<newroot> [<command> [args...]]"),
#endif

#if defined(CONFIG_FS_PERMISSION) && !defined(CONFIG_NSH_DISABLE_CHMOD)
CMD_MAP("chmod", cmd_chmod, 3, 3, "<octal-mode> <path>"),
#endif
Expand Down
94 changes: 94 additions & 0 deletions nshlib/nsh_envcmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <fcntl.h>
#include <libgen.h>
#include <errno.h>

Expand Down Expand Up @@ -324,6 +325,99 @@ int cmd_cd(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv)
}
#endif

/****************************************************************************
* Name: nsh_chroot_closefds
*
* Description:
* Close descriptors above stderr that are not already O_CLOEXEC so a
* jailed execvp() child cannot inherit host file descriptors.
*
****************************************************************************/

#if defined(CONFIG_FS_CHROOT) && !defined(CONFIG_NSH_DISABLE_CHROOT) && \
defined(CONFIG_LIBC_EXECFUNCS)
static void nsh_chroot_closefds(void)
{
int fdmax;
int fd;
int flags;

fdmax = sysconf(_SC_OPEN_MAX);
if (fdmax <= STDERR_FILENO)
{
return;
}

for (fd = STDERR_FILENO + 1; fd < fdmax; fd++)
{
flags = fcntl(fd, F_GETFD);
if (flags >= 0 && (flags & FD_CLOEXEC) == 0)
{
close(fd);
}
}
}
#endif

/****************************************************************************
* Name: cmd_chroot
****************************************************************************/

#if defined(CONFIG_FS_CHROOT) && !defined(CONFIG_NSH_DISABLE_CHROOT)
int cmd_chroot(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv)
{
FAR char *fullpath;
int ret;

fullpath = nsh_getfullpath(vtbl, argv[1]);
if (fullpath == NULL)
{
nsh_error(vtbl, g_fmtcmdoutofmemory, argv[0]);
return ERROR;
}

ret = chdir(fullpath);
nsh_freefullpath(fullpath);
if (ret < 0)
{
nsh_error(vtbl, g_fmtcmdfailed, argv[0], "chdir", NSH_ERRNO);
return ERROR;
}

ret = chroot(".");
if (ret < 0)
{
nsh_error(vtbl, g_fmtcmdfailed, argv[0], "chroot", NSH_ERRNO);
return ERROR;
}

ret = chdir("/");
if (ret < 0)
{
nsh_error(vtbl, g_fmtcmdfailed, argv[0], "chdir", NSH_ERRNO);
return ERROR;
}

#ifdef CONFIG_LIBC_EXECFUNCS
if (argc > 2)
{
nsh_chroot_closefds();
execvp(argv[2], &argv[2]);
nsh_error(vtbl, g_fmtcmdfailed, argv[0], "execvp", NSH_ERRNO);
return ERROR;
}
#else
if (argc > 2)
{
nsh_error(vtbl, g_fmtcmdfailed, argv[0], "execvp", NSH_ERRNO);
return ERROR;
}
#endif

return OK;
}
#endif /* CONFIG_FS_CHROOT && !CONFIG_NSH_DISABLE_CHROOT */

/****************************************************************************
* Name: cmd_echo
****************************************************************************/
Expand Down
8 changes: 8 additions & 0 deletions testing/ostest/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,14 @@ if(CONFIG_TESTING_OSTEST)
list(APPEND SRCS waitpid.c)
endif()

if(CONFIG_FS_CHROOT)
if(CONFIG_SCHED_WAITPID)
if(NOT CONFIG_BUILD_KERNEL)
list(APPEND SRCS chroot.c)
endif()
endif()
endif()

if(NOT CONFIG_DISABLE_PTHREAD)
list(
APPEND
Expand Down
8 changes: 8 additions & 0 deletions testing/ostest/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,14 @@ ifeq ($(CONFIG_SCHED_WAITPID),y)
CSRCS += waitpid.c
endif

ifeq ($(CONFIG_FS_CHROOT),y)
ifeq ($(CONFIG_SCHED_WAITPID),y)
ifneq ($(CONFIG_BUILD_KERNEL),y)
CSRCS += chroot.c
endif
endif
endif

ifneq ($(CONFIG_DISABLE_PTHREAD),y)
CSRCS += cancel.c cond.c mutex.c timedmutex.c sem.c semtimed.c barrier.c
CSRCS += timedwait.c pthread_rwlock.c pthread_rwlock_cancel.c schedlock.c
Expand Down
Loading
Loading