X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=box%2Fbox.c;h=892cc53eb9b8bee98fb369f7b4e8810a342375ad;hb=4ee9f1ead0d2ef8133a8f1f692816b78d038ab4e;hp=b77ec8d66387d97c48a2f8da72940a16997c2fc9;hpb=da21fed34b0cec9654e62188553f754a4bca9b1d;p=moe.git diff --git a/box/box.c b/box/box.c index b77ec8d..892cc53 100644 --- a/box/box.c +++ b/box/box.c @@ -24,6 +24,7 @@ #include #include #include +#include #define NONRET __attribute__((noreturn)) #define UNUSED __attribute__((unused)) @@ -32,10 +33,12 @@ static int filter_syscalls; /* 0=off, 1=liberal, 2=totalitarian */ static int timeout; /* milliseconds */ static int wall_timeout; +static int extra_timeout; static int pass_environ; static int file_access; static int verbose; static int memory_limit; +static int stack_limit; static char *redir_stdin, *redir_stdout, *redir_stderr; static char *set_cwd; @@ -116,12 +119,15 @@ box_exit(int rc) ptrace(PTRACE_KILL, box_pid); kill(-box_pid, SIGKILL); kill(box_pid, SIGKILL); + meta_printf("killed:1\n"); struct rusage rus; - int stat; - int p = wait4(box_pid, &stat, 0, &rus); + int p, stat; + do + p = wait4(box_pid, &stat, 0, &rus); + while (p < 0 && errno == EINTR); if (p < 0) - fprintf(stderr, "UGH: Lost track of the process\n"); + fprintf(stderr, "UGH: Lost track of the process (%m)\n"); else final_stats(&rus); } @@ -771,7 +777,7 @@ check_timeout(void) ms = (utime + stime) * 1000 / ticks_per_sec; if (verbose > 1) fprintf(stderr, "[time check: %d msec]\n", ms); - if (ms > timeout) + if (ms > timeout && ms > extra_timeout) err("TO: Time limit exceeded"); } } @@ -824,23 +830,27 @@ sample_mem_peak(void) static void boxkeeper(void) { - int syscall_count = 0; + int syscall_count = (filter_syscalls ? 0 : 1); struct sigaction sa; is_ptraced = 1; + bzero(&sa, sizeof(sa)); sa.sa_handler = signal_int; sigaction(SIGINT, &sa, NULL); + gettimeofday(&start_time, NULL); ticks_per_sec = sysconf(_SC_CLK_TCK); if (ticks_per_sec <= 0) die("Invalid ticks_per_sec!"); + if (timeout || wall_timeout) { sa.sa_handler = signal_alarm; sigaction(SIGALRM, &sa, NULL); alarm(1); } + for(;;) { struct rusage rus; @@ -1026,15 +1036,22 @@ box_inside(int argc, char **argv) else dup2(1, 2); setpgrp(); + if (memory_limit) { rl.rlim_cur = rl.rlim_max = memory_limit * 1024; if (setrlimit(RLIMIT_AS, &rl) < 0) - die("setrlimit: %m"); + die("setrlimit(RLIMIT_AS): %m"); } + + rl.rlim_cur = rl.rlim_max = (stack_limit ? (rlim_t)stack_limit * 1024 : RLIM_INFINITY); + if (setrlimit(RLIMIT_STACK, &rl) < 0) + die("setrlimit(RLIMIT_STACK): %m"); + rl.rlim_cur = rl.rlim_max = 64; if (setrlimit(RLIMIT_NOFILE, &rl) < 0) - die("setrlimit: %m"); + die("setrlimit(RLIMIT_NOFILE): %m"); + char **env = setup_environment(); if (filter_syscalls) { @@ -1062,6 +1079,7 @@ Options:\n\ -E =\tSet the environment variable to ; unset it if is empty\n\ -f\t\tFilter system calls (-ff=very restricted)\n\ -i \tRedirect stdin from \n\ +-k \tLimit stack size to KB (default: 0=unlimited)\n\ -m \tLimit address space to KB\n\ -M \tOutput process information to (name:value)\n\ -o \tRedirect stdout to \n\ @@ -1074,6 +1092,8 @@ Options:\n\ -T\t\tAllow syscalls for measuring run time\n\ -v\t\tBe verbose (use multiple times for even more verbosity)\n\ -w