diff --git a/jd4/sandbox.py b/jd4/sandbox.py index 42dd322..f47bdad 100644 --- a/jd4/sandbox.py +++ b/jd4/sandbox.py @@ -62,16 +62,19 @@ def _handle_reset_child(): def _handle_compile(compiler_file, compiler_args, output_file, cgroup_file): pid = fork() if not pid: - chdir('/out') - os_close(STDIN_FILENO) - if output_file: - fd = os_open(output_file, O_WRONLY) - dup2(fd, STDOUT_FILENO) - dup2(fd, STDERR_FILENO) - os_close(fd) - if cgroup_file: - enter_cgroup(cgroup_file) - execve(compiler_file, compiler_args, SPAWN_ENV) + try: + chdir('/out') + os_close(STDIN_FILENO) + if output_file: + fd = os_open(output_file, O_WRONLY) + dup2(fd, STDOUT_FILENO) + dup2(fd, STDERR_FILENO) + os_close(fd) + if cgroup_file: + enter_cgroup(cgroup_file) + execve(compiler_file, compiler_args, SPAWN_ENV) + except: + exit(1) return wait_and_reap_zombies(pid) @@ -84,29 +87,32 @@ def _handle_execute(execute_file, cgroup_file): pid = fork() if not pid: - chdir('/in/package') - if stdin_file: - fd = os_open(stdin_file, O_RDONLY) - dup2(fd, STDIN_FILENO) - os_close(fd) - if stdout_file: - fd = os_open(stdout_file, O_WRONLY) - dup2(fd, STDOUT_FILENO) - os_close(fd) - if stderr_file: - fd = os_open(stderr_file, O_WRONLY) - dup2(fd, STDERR_FILENO) - os_close(fd) - if extra_file: - fd = os_open(extra_file, O_RDONLY) - if fd == EXTRA_FILENO: - set_inheritable(fd, True) - else: - dup2(fd, EXTRA_FILENO) + try: + chdir('/in/package') + if stdin_file: + fd = os_open(stdin_file, O_RDONLY) + dup2(fd, STDIN_FILENO) + os_close(fd) + if stdout_file: + fd = os_open(stdout_file, O_WRONLY) + dup2(fd, STDOUT_FILENO) + os_close(fd) + if stderr_file: + fd = os_open(stderr_file, O_WRONLY) + dup2(fd, STDERR_FILENO) os_close(fd) - if cgroup_file: - enter_cgroup(cgroup_file) - execve(execute_file, execute_args, SPAWN_ENV) + if extra_file: + fd = os_open(extra_file, O_RDONLY) + if fd == EXTRA_FILENO: + set_inheritable(fd, True) + else: + dup2(fd, EXTRA_FILENO) + os_close(fd) + if cgroup_file: + enter_cgroup(cgroup_file) + execve(execute_file, execute_args, SPAWN_ENV) + except: + exit(1) return wait_and_reap_zombies(pid) _HANDLERS = {