Skip to content

Commit 2e782b1

Browse files
authored
Merge pull request #986 from elicn/fix-socket
Fix getpeername and getsockname syscalls
2 parents ac7c9f6 + 450ee9b commit 2e782b1

File tree

1 file changed

+36
-24
lines changed

1 file changed

+36
-24
lines changed

qiling/os/posix/syscall/socket.py

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -338,37 +338,49 @@ def ql_syscall_bind(ql: Qiling, bind_fd, bind_addr, bind_addrlen):
338338
return regreturn
339339

340340

341-
def ql_syscall_getsockname(ql: Qiling, sockfd, addr, addrlenptr):
342-
if 0 <= sockfd < NR_OPEN and ql.os.fd[sockfd] != 0:
343-
host, port = ql.os.fd[sockfd].getsockname()
344-
data = struct.pack("<h", int(ql.os.fd[sockfd].family))
345-
data += struct.pack(">H", port)
346-
data += ipaddress.ip_address(host).packed
347-
addrlen = ql.mem.read(addrlenptr, 4)
348-
addrlen = ql.unpack32(addrlen)
349-
data = data[:addrlen]
350-
ql.mem.write(addr, data)
351-
regreturn = 0
341+
def ql_syscall_getsockname(ql: Qiling, sockfd: int, addr: int, addrlenptr: int):
342+
if 0 <= sockfd < NR_OPEN:
343+
socket = ql.os.fd[sockfd]
344+
345+
if isinstance(socket, ql_socket):
346+
host, port = socket.getpeername()
347+
348+
data = struct.pack("<h", int(socket.family))
349+
data += struct.pack(">H", port)
350+
data += ipaddress.ip_address(host).packed
351+
352+
addrlen = ql.mem.read_ptr(addrlenptr)
353+
354+
ql.mem.write(addr, data[:addrlen])
355+
regreturn = 0
356+
else:
357+
regreturn = -EPERM
352358
else:
353-
regreturn = -1
359+
regreturn = -EPERM
354360

355361
ql.log.debug("getsockname(%d, 0x%x, 0x%x) = %d" % (sockfd, addr, addrlenptr, regreturn))
356362
return regreturn
357363

358364

359-
def ql_syscall_getpeername(ql: Qiling, sockfd, addr, addrlenptr):
360-
if 0 <= sockfd < NR_OPEN and ql.os.fd[sockfd] != 0:
361-
host, port = ql.os.fd[sockfd].getpeername()
362-
data = struct.pack("<h", int(ql.os.fd[sockfd].family))
363-
data += struct.pack(">H", port)
364-
data += ipaddress.ip_address(host).packed
365-
addrlen = ql.mem.read(addrlenptr, 4)
366-
addrlen = ql.unpack32(addrlen)
367-
data = data[:addrlen]
368-
ql.mem.write(addr, data)
369-
regreturn = 0
365+
def ql_syscall_getpeername(ql: Qiling, sockfd: int, addr: int, addrlenptr: int):
366+
if 0 <= sockfd < NR_OPEN:
367+
socket = ql.os.fd[sockfd]
368+
369+
if isinstance(socket, ql_socket):
370+
host, port = socket.getpeername()
371+
372+
data = struct.pack("<h", int(socket.family))
373+
data += struct.pack(">H", port)
374+
data += ipaddress.ip_address(host).packed
375+
376+
addrlen = ql.mem.read_ptr(addrlenptr)
377+
378+
ql.mem.write(addr, data[:addrlen])
379+
regreturn = 0
380+
else:
381+
regreturn = -EPERM
370382
else:
371-
regreturn = -1
383+
regreturn = -EPERM
372384

373385
ql.log.debug("getpeername(%d, 0x%x, 0x%x) = %d" % (sockfd, addr, addrlenptr, regreturn))
374386
return regreturn

0 commit comments

Comments
 (0)