#include #include #include #include #include #define _GNU_SOURCE #include #include #include 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 \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); }