71 lines
1.5 KiB
C
71 lines
1.5 KiB
C
#include <stdio.h>
|
|
#include <linux/sched.h>
|
|
#include <sys/types.h>
|
|
#include <sys/mount.h>
|
|
#include <dirent.h>
|
|
#define _GNU_SOURCE
|
|
#include <sched.h>
|
|
#include <stdint.h>
|
|
#include <errno.h>
|
|
|
|
struct args {
|
|
int c;
|
|
char **v;
|
|
};
|
|
|
|
uint8_t CSTACK[8192];
|
|
|
|
int setup_jail() {
|
|
mount("tmpfs", "jail/tmp", "tmpfs", MS_PRIVATE, NULL); // TODO this needs to also have a tmpfs data to limit size
|
|
mount("foo", "jail/foo", NULL, MS_PRIVATE|MS_BIND|MS_RDONLY, NULL);
|
|
chdir("jail");
|
|
chroot(".");
|
|
}
|
|
|
|
int myreaddir(void *fooargs) {
|
|
int len;
|
|
struct dirent *pDirent;
|
|
DIR *pDir;
|
|
struct args *myargs = (struct args *) fooargs;
|
|
|
|
setup_jail();
|
|
|
|
if (myargs->c < 2) {
|
|
printf ("Usage: testprog <dirname>\n");
|
|
return 1;
|
|
}
|
|
|
|
mount(NULL, myargs->v[1], NULL, MS_PRIVATE, NULL);
|
|
mount(NULL, ".", NULL, MS_PRIVATE, NULL);
|
|
umount(myargs->v[1]);
|
|
|
|
// sleep(100);
|
|
|
|
pDir = opendir (myargs->v[1]);
|
|
if (pDir == NULL) {
|
|
printf ("Cannot open directory '%s'\n", myargs->v[1]);
|
|
return 1;
|
|
}
|
|
|
|
char file[32];
|
|
snprintf(file, 32, "/tmp/%08d", rand());
|
|
|
|
FILE *foo=fopen(file, "w");
|
|
fclose(file);
|
|
|
|
sleep(100);
|
|
|
|
while ((pDirent = readdir(pDir)) != NULL) {
|
|
printf ("[%s]\n", pDirent->d_name);
|
|
}
|
|
closedir (pDir);
|
|
return 0;
|
|
}
|
|
|
|
int main (int c, char *v[]) {
|
|
struct args fooargs = {c: c, v: v};
|
|
|
|
int ret = clone(&myreaddir, CSTACK+8192, CLONE_NEWUTS|CLONE_NEWNS|CLONE_NEWCGROUP|CLONE_NEWIPC|CLONE_NEWNET|CLONE_NEWPID, (void *) &fooargs);
|
|
|
|
printf("%05d %05d\n", ret, errno);
|
|
}
|