|
9 | 9 |
|
10 | 10 | from qiling import Qiling |
11 | 11 | from qiling.const import QL_ARCH, QL_VERBOSE |
12 | | -from qiling.os.posix.const_mapping import socket_type_mapping, socket_level_mapping, socket_domain_mapping, socket_ip_option_mapping, socket_option_mapping |
| 12 | +from qiling.os.posix.const_mapping import socket_type_mapping, socket_level_mapping, socket_domain_mapping, socket_ip_option_mapping, socket_tcp_option_mapping, socket_option_mapping |
13 | 13 | from qiling.os.posix.const import * |
14 | 14 | from qiling.os.posix.filestruct import ql_socket |
15 | 15 | from qiling.os.posix.structs import * |
@@ -126,6 +126,52 @@ def ql_syscall_socket(ql: Qiling, domain: int, socktype: int, protocol: int): |
126 | 126 | return idx |
127 | 127 |
|
128 | 128 |
|
| 129 | +def ql_syscall_socketpair(ql: Qiling, socket_domain, socket_type, socket_protocol, sv: int): |
| 130 | + idx_list = [i for i in range(NR_OPEN) if ql.os.fd[i] is None] |
| 131 | + if len(idx_list) > 1: |
| 132 | + idx1, idx2 = idx_list[:2] |
| 133 | + |
| 134 | + emu_socket_value = socket_type |
| 135 | + |
| 136 | + # ql_socket.open should use host platform based socket_type. |
| 137 | + try: |
| 138 | + emu_socket_type = socket_type_mapping(socket_type, ql.arch.type) |
| 139 | + except KeyError: |
| 140 | + ql.log.error(f'Cannot convert emu_socket_type {emu_socket_value} to host platform based socket_type') |
| 141 | + raise |
| 142 | + |
| 143 | + try: |
| 144 | + socket_type = getattr(socket, emu_socket_type) |
| 145 | + except AttributeError: |
| 146 | + ql.log.error(f'Cannot convert emu_socket_type {emu_socket_type}:{emu_socket_value} to host platform based socket_type') |
| 147 | + raise |
| 148 | + |
| 149 | + ql.log.debug(f'Convert emu_socket_type {emu_socket_type}:{emu_socket_value} to host platform based socket_type {emu_socket_type}:{socket_type}') |
| 150 | + |
| 151 | + try: |
| 152 | + sock1, sock2 = ql_socket.socketpair(socket_domain, socket_type, socket_protocol) |
| 153 | + |
| 154 | + # save sock to ql |
| 155 | + ql.os.fd[idx1] = sock1 |
| 156 | + ql.os.fd[idx2] = sock2 |
| 157 | + |
| 158 | + # save fd to &sv |
| 159 | + ql.mem.write(sv, ql.pack32(idx1)) |
| 160 | + ql.mem.write(sv+4, ql.pack32(idx2)) |
| 161 | + regreturn = 0 |
| 162 | + |
| 163 | + # May raise error: Protocol not supported |
| 164 | + except OSError as e: |
| 165 | + ql.log.debug(f'{e}: {socket_domain=}, {socket_type=}, {socket_protocol=}, {sv=}') |
| 166 | + regreturn = -1 |
| 167 | + |
| 168 | + socket_type = socket_type_mapping(socket_type, ql.arch.type) |
| 169 | + socket_domain = socket_domain_mapping(socket_domain, ql.arch.type, ql.os.type) |
| 170 | + ql.log.debug("socketpair(%s, %s, %s, %d) = %d" % (socket_domain, socket_type, socket_protocol, sv, regreturn)) |
| 171 | + |
| 172 | + return regreturn |
| 173 | + |
| 174 | + |
129 | 175 | def ql_syscall_connect(ql: Qiling, sockfd: int, addr: int, addrlen: int): |
130 | 176 | if sockfd not in range(NR_OPEN): |
131 | 177 | return -1 |
@@ -218,6 +264,8 @@ def ql_syscall_getsockopt(ql: Qiling, sockfd: int, level: int, optname: int, opt |
218 | 264 | # emu_opt_name is based on level |
219 | 265 | if vsock_level_name == 'IPPROTO_IP': |
220 | 266 | vsock_opt_name = socket_ip_option_mapping(vsock_opt, ql.arch.type, ql.os.type) |
| 267 | + elif vsock_level_name == 'IPPROTO_TCP': |
| 268 | + vsock_opt_name = socket_tcp_option_mapping(vsock_opt, ql.arch.type) |
221 | 269 | else: |
222 | 270 | vsock_opt_name = socket_option_mapping(vsock_opt, ql.arch.type) |
223 | 271 |
|
@@ -288,6 +336,8 @@ def ql_syscall_setsockopt(ql: Qiling, sockfd: int, level: int, optname: int, opt |
288 | 336 | # emu_opt_name is based on level |
289 | 337 | if vsock_level_name == 'IPPROTO_IP': |
290 | 338 | vsock_opt_name = socket_ip_option_mapping(vsock_opt, ql.arch.type, ql.os.type) |
| 339 | + elif vsock_level_name == 'IPPROTO_TCP': |
| 340 | + vsock_opt_name = socket_tcp_option_mapping(vsock_opt, ql.arch.type) |
291 | 341 | else: |
292 | 342 | vsock_opt_name = socket_option_mapping(vsock_opt, ql.arch.type) |
293 | 343 |
|
|
0 commit comments