aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jail.c33
-rw-r--r--src/utils.c38
-rw-r--r--src/utils.h3
3 files changed, 64 insertions, 10 deletions
diff --git a/src/jail.c b/src/jail.c
index 7f38804..fc2e843 100644
--- a/src/jail.c
+++ b/src/jail.c
@@ -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