MCPcopy Create free account
hub / github.com/qilingframework/qiling / ql_syscall_recvmsg

Function ql_syscall_recvmsg

qiling/os/posix/syscall/socket.py:698–745  ·  view source on GitHub ↗
(ql: Qiling, sockfd: int, msg_addr: int, flags: int)

Source from the content-addressed store, hash-verified

696
697
698def ql_syscall_recvmsg(ql: Qiling, sockfd: int, msg_addr: int, flags: int):
699 sock = get_opened_socket(ql.os, sockfd)
700
701 if isinstance(sock, int):
702 return sock
703
704 abits = ql.arch.bits
705 endian = ql.arch.endian
706
707 msghdr = make_msghdr(abits, endian)
708 msg = msghdr.load_from(ql.mem, msg_addr)
709
710 try:
711 # TODO: handle the addr
712 data, ancdata, mflags, addr = sock.recvmsg(msg.msg_namelen, msg.msg_controllen, flags)
713 except ConnectionError:
714 return -1
715
716 iovec = make_iovec(abits, endian)
717 iovec_addr = msg.msg_iov
718 written = 0
719
720 for _ in range(msg.msg_iovlen):
721 with iovec.ref(ql.mem, iovec_addr) as obj:
722 size = min(obj.iov_len, len(data) - written)
723 ql.mem.write(obj.iov_base, data[written:written + size])
724
725 written += size
726 iovec_addr += iovec.sizeof()
727
728 cmsghdr = make_cmsghdr(abits, endian)
729 cmsg_addr = msg.msg_control
730
731 for cmsg_level, cmsg_type, cmsg_data in ancdata:
732 with cmsghdr.ref(ql.mem, cmsg_addr) as obj:
733 obj.cmsg_len = len(cmsg_data)
734 obj.cmsg_level = cmsg_level
735 obj.cmsg_type = cmsg_type
736
737 cmsg_addr += cmsghdr.sizeof()
738
739 ql.mem.write(cmsg_addr, cmsg_data)
740 cmsg_addr += len(cmsg_data)
741
742 msg.msg_flags = mflags
743 msg.save_to(ql.mem, msg_addr)
744
745 return len(data)
746
747
748def ql_syscall_recvfrom(ql: Qiling, sockfd: int, buf: int, length: int, flags: int, addr: int, addrlen: int):

Callers

nothing calls this directly

Calls 10

get_opened_socketFunction · 0.85
make_msghdrFunction · 0.85
make_iovecFunction · 0.85
make_cmsghdrFunction · 0.85
load_fromMethod · 0.80
recvmsgMethod · 0.80
refMethod · 0.80
sizeofMethod · 0.80
save_toMethod · 0.80
writeMethod · 0.45

Tested by

no test coverage detected