X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=src%2Fbox.c;h=bcfe233f84345b2043d0f4dbe5a22f18c12c8332;hb=3ee84a61340017dccf73f53194cd7ec4c7ec838b;hp=477d7c8539cea373e0622b4573ac3eede689debe;hpb=55290a5179a1955c1755dbe11479970192564bc1;p=eval.git diff --git a/src/box.c b/src/box.c index 477d7c8..bcfe233 100644 --- a/src/box.c +++ b/src/box.c @@ -1,7 +1,7 @@ /* * A Simple Testing Sandbox * - * (c) 2001 Martin Mares + * (c) 2001--2004 Martin Mares */ #define _LARGEFILE64_SOURCE @@ -35,7 +35,9 @@ static int use_wall_clock; static int file_access; static int verbose; static int memory_limit; +static int allow_times; static char *redir_stdin, *redir_stdout; +static char *set_cwd; static pid_t box_pid; static int is_ptraced; @@ -144,7 +146,9 @@ valid_filename(unsigned long addr) return; if (!strcmp(namebuf, "/dev/null") || !strcmp(namebuf, "/dev/zero") || - !strcmp(namebuf, "/proc/meminfo")) + !strcmp(namebuf, "/proc/meminfo") || + !strcmp(namebuf, "/proc/self/stat") || + !strncmp(namebuf, "/usr/share/zoneinfo/", 20)) return; } die("Forbidden access to file `%s'.", namebuf); @@ -205,6 +209,7 @@ valid_syscall(struct user *u) case SYS_munmap: case SYS_ioctl: case SYS_uname: + case 252: return 1; case SYS_time: case SYS_alarm: @@ -244,6 +249,8 @@ valid_syscall(struct user *u) case SYS_mmap2: case SYS__sysctl: return (filter_syscalls == 1); + case SYS_times: + return allow_times; default: return 0; } @@ -424,6 +431,8 @@ box_inside(int argc, char **argv) memcpy(args, argv, argc * sizeof(char *)); args[argc] = NULL; + if (set_cwd && chdir(set_cwd)) + die("chdir: %m"); if (redir_stdin) { close(0); @@ -436,8 +445,7 @@ box_inside(int argc, char **argv) if (open(redir_stdout, O_WRONLY | O_CREAT | O_TRUNC, 0666) != 1) die("open(\"%s\"): %m", redir_stdout); } - close(2); - dup(1); + dup2(1, 2); setpgrp(); if (memory_limit) { @@ -470,6 +478,7 @@ Options:\n\ -m \tLimit address space to KB\n\ -o \tRedirect stdout to \n\ -t