ql_proxy_fd.dup() creates a working copy.
(self)
| 153 | del ql |
| 154 | |
| 155 | def test_proxy_fd_dup(self): |
| 156 | """ql_proxy_fd.dup() creates a working copy.""" |
| 157 | from qiling.os.posix.kernel_proxy import KernelProxy |
| 158 | from qiling.os.posix.kernel_proxy.proxy_fd import ql_proxy_fd |
| 159 | |
| 160 | ql = Qiling([self.HELLO_BIN], self.ROOTFS, verbose=QL_VERBOSE.OFF) |
| 161 | proxy = KernelProxy(ql) |
| 162 | proxy.forward_syscall('eventfd2', returns_fd=True) |
| 163 | |
| 164 | hook = ql.os.posix_syscall_hooks[QL_INTERCEPT.CALL]['ql_syscall_eventfd2'] |
| 165 | guest_fd = hook(ql, 0, 0) |
| 166 | fd_obj = ql.os.fd[guest_fd] |
| 167 | |
| 168 | duped = fd_obj.dup() |
| 169 | self.assertIsInstance(duped, ql_proxy_fd) |
| 170 | self.assertNotEqual(fd_obj._proxy_fd, duped._proxy_fd) |
| 171 | |
| 172 | # write on original, read on dup |
| 173 | fd_obj.write(struct.pack('<Q', 7)) |
| 174 | data = duped.read(8) |
| 175 | self.assertEqual(struct.unpack('<Q', data)[0], 7) |
| 176 | |
| 177 | fd_obj.close() |
| 178 | duped.close() |
| 179 | proxy.stop() |
| 180 | del ql |
| 181 | |
| 182 | # ------------------------------------------------------------------------- |
| 183 | # User hooks coexist with proxy hooks |
nothing calls this directly
no test coverage detected