diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/jail.c | 33 | ||||
-rw-r--r-- | src/utils.c | 38 | ||||
-rw-r--r-- | src/utils.h | 3 |
3 files changed, 64 insertions, 10 deletions
@@ -3,6 +3,7 @@ #include <sched.h> #include <signal.h> #include <pty.h> +#include <sys/wait.h> #include <sys/epoll.h> #include <sys/prctl.h> #include <sys/stat.h> @@ -287,10 +288,7 @@ static int jail_childfn(void *arg) E_STRERR("mkdir"); exit(EXIT_FAILURE); } - if (dir_is_mountpoint(path_dev)) { - W2("%s%s is already a mountpoint", args->newroot, path_dev); - } - if (mount_dev(path_dev)) { + if (!dir_is_mountpoint(path_dev) && mount_dev(path_dev)) { E2("Can not mount devtmpfs to %s%s", args->newroot, path_dev); exit(EXIT_FAILURE); } @@ -309,15 +307,30 @@ static int jail_childfn(void *arg) exit(EXIT_FAILURE); } + D2("Creating device files in %s%s", args->newroot, path_dev); + if (create_device_files(path_dev)) { + E2("Device file creation failed for rootfs '%s%s'", + args->newroot, path_dev); + exit(EXIT_FAILURE); + } + D2("%s", "Forking a new pseudo terminal"); child_pid = forkpty(&term_fd, NULL, term, win); - if (!child_pid) { - if (execl("/bin/bash", "/bin/bash", (char *) NULL)) { - exit(EXIT_FAILURE); - } - } else { - W_STRERR("Forking a new pseudo terminal"); + switch (child_pid) { + case -1: + W_STRERR("Forking a new pseudo terminal"); + break; + case 0: + D2("Executing '%s'", "/bin/bash"); + if (execl("/bin(bash", "/bin/bash", (char *) NULL)) + W_STRERR("Execute a shell"); + break; + default: + waitpid(child_pid, &s, 0); } +printf("_%d,%d_\n", child_pid, getuid()); +sleep(10); + exit(EXIT_FAILURE); } diff --git a/src/utils.c b/src/utils.c index b4820d0..aa62beb 100644 --- a/src/utils.c +++ b/src/utils.c @@ -8,10 +8,13 @@ #include <pwd.h> #include <grp.h> #include <sys/types.h> +#undef makedev +#include <sys/sysmacros.h> #include <sys/stat.h> #include <sys/wait.h> #include <sys/prctl.h> #include <sys/mount.h> +#include <linux/limits.h> #include <assert.h> #include "utils.h" @@ -305,7 +308,42 @@ int mount_pts(const char *mount_path) return 0; } +int create_device_file_checked(const char *mount_path, const char *device_file, + mode_t mode, int add_mode, dev_t dev) +{ + int s; + mode_t defmode = S_IRUSR|S_IWUSR| + S_IRGRP|S_IWGRP| + S_IROTH; + size_t plen = strnlen(mount_path, PATH_MAX); + size_t dlen = strnlen(device_file, PATH_MAX); + struct stat devbuf = {0}; + char devpath[plen+dlen+1]; + + snprintf(devpath, plen+dlen+1, "%s/%s", mount_path, device_file); + s = stat(devpath, &devbuf); + + if (s && errno != EEXIST) { + return 1; + } else if (s && errno == EEXIST) { + } + + D2("Create device file: %s", devpath); + if (!add_mode) + defmode = 0; + s = mknod(devpath, defmode|mode, dev); + if (s) { + E2("Device file creation '%s' failed", devpath); + E_STRERR("Device creation"); + return 1; + } + + return 0; +} + int create_device_files(const char *mount_path) { + create_device_file_checked(mount_path, "ptmx", 0, 1, makedev(5,2)); + return 0; } diff --git a/src/utils.h b/src/utils.h index b9ed7ab..ce679e4 100644 --- a/src/utils.h +++ b/src/utils.h @@ -32,6 +32,9 @@ int mount_dev(const char *mount_path); int mount_pts(const char *mount_path); +int create_device_file_checked(const char *mount_path, const char *device_file, + mode_t mode, int add_mode, dev_t dev); + int create_device_files(const char *mount_path); #endif |