def test_02_decode_max(self): pid = os.fork() if not pid: # child trace.me() os.kill(os.getpid(), signal.SIGSTOP) open('/dev/null', 'r') os._exit(0) else: # parent pid, status = os.waitpid(pid, 0) self.assert_(os.WIFSTOPPED(status), "%#x" % status) self.assertEqual(os.WSTOPSIG(status), signal.SIGSTOP, "%#x" % status) # Loop until we get to the open() system call as there's no # guarantee that other system calls won't be called beforehand. while True: trace.syscall_entry(pid, 0) pid, status = os.waitpid(pid, 0) self.assert_(os.WIFSTOPPED(status), "%#x" % status) self.assertEqual(os.WSTOPSIG(status), signal.SIGTRAP, "%#x" % status) scno = syscall.get_no(pid) name = syscall.name(scno) if name == 'open': path = string.decode(pid, 0, 9) self.assertEqual(path, '/dev/null') break try: trace.kill(pid) except OSError: pass
def test_02_set_no(self): pid = os.fork() if not pid: # child trace.me() os.kill(os.getpid(), signal.SIGSTOP) os.kill(os.getpid(), 0) os._exit(0) else: # parent pid, status = os.waitpid(pid, 0) self.assert_(os.WIFSTOPPED(status), "%#x" % status) self.assertEqual(os.WSTOPSIG(status), signal.SIGSTOP, "%#x" % status) # Loop until we get to the kill() system call as there's no # guarantee that other system calls won't be called beforehand. while True: trace.syscall_entry(pid, 0) pid, status = os.waitpid(pid, 0) self.assert_(os.WIFSTOPPED(status), "%#x" % status) self.assertEqual(os.WSTOPSIG(status), signal.SIGTRAP, "%#x" % status) scno = syscall.get_no(pid) name = syscall.name(scno) if name == 'kill': syscall.set_no(pid, syscall.INVALID) scno = syscall.get_no(pid) self.assertEqual(scno, syscall.INVALID) break try: trace.kill(pid) except OSError: pass
def test_02_decode_max(self): pid = os.fork() if not pid: # child trace.me() os.kill(os.getpid(), signal.SIGSTOP) os.execvp('true', ('/dev/null',)) os._exit(0) else: # parent pid, status = os.waitpid(pid, 0) self.assert_(os.WIFSTOPPED(status), "%#x" % status) self.assertEqual(os.WSTOPSIG(status), signal.SIGSTOP, "%#x" % status) # Loop until we get to the open() system call as there's no # guarantee that other system calls won't be called beforehand. while True: trace.syscall_entry(pid, 0) pid, status = os.waitpid(pid, 0) self.assert_(os.WIFSTOPPED(status), "%#x" % status) self.assertEqual(os.WSTOPSIG(status), signal.SIGTRAP, "%#x" % status) scno = syscall.get_no(pid) name = syscall.name(scno) if name == 'execve': arg = syscall.get_arg(pid, 1) path = strarray.decode(pid, arg, 0, 9) self.assertEqual(path, '/dev/null') break try: trace.kill(pid) except OSError: pass
def test_01_decode(self): pid = os.fork() if not pid: # child trace.me() os.kill(os.getpid(), signal.SIGSTOP) os.execvp("true", ("/dev/null",)) os._exit(0) else: # parent pid, status = os.waitpid(pid, 0) self.assert_(os.WIFSTOPPED(status), "%#x" % status) self.assertEqual(os.WSTOPSIG(status), signal.SIGSTOP, "%#x" % status) # Loop until we get to the open() system call as there's no # guarantee that other system calls won't be called beforehand. while True: trace.syscall_entry(pid, 0) pid, status = os.waitpid(pid, 0) self.assert_(os.WIFSTOPPED(status), "%#x" % status) self.assertEqual(os.WSTOPSIG(status), signal.SIGTRAP, "%#x" % status) scno = syscall.get_no(pid) name = syscall.name(scno) if name == "execve": arg = syscall.get_arg(pid, 1) path = strarray.decode(pid, arg, 0) self.assertEqual(path, "/dev/null") break try: trace.kill(pid) except OSError: pass
def test_04_get_ret_fail(self): pid = os.fork() if not pid: # child trace.me() os.kill(os.getpid(), signal.SIGSTOP) try: open('') except IOError: pass os._exit(0) else: # parent pid, status = os.waitpid(pid, 0) self.assert_(os.WIFSTOPPED(status), "%#x" % status) self.assertEqual(os.WSTOPSIG(status), signal.SIGSTOP, "%#x" % status) # Loop until we get to the open() system call as there's no # guarantee that other system calls won't be called beforehand. stop_at_exit = False while True: if stop_at_exit: trace.syscall_exit(pid, 0) else: trace.syscall_entry(pid, 0) pid, status = os.waitpid(pid, 0) self.assert_(os.WIFSTOPPED(status), "%#x" % status) self.assertEqual(os.WSTOPSIG(status), signal.SIGTRAP, "%#x" % status) scno = syscall.get_no(pid) name = syscall.name(scno) if name == 'open': stop_at_exit = True continue elif stop_at_exit: ret = syscall.get_ret(pid) self.assertEqual(ret, -errno.ENOENT) break try: trace.kill(pid) except OSError: pass