Loading linux-user/syscall.c +21 −6 Original line number Diff line number Diff line Loading @@ -296,9 +296,11 @@ static bitmask_transtbl fcntl_flags_tbl[] = { }; typedef abi_long (*TargetFdDataFunc)(void *, size_t); typedef abi_long (*TargetFdAddrFunc)(void *, abi_ulong, socklen_t); typedef struct TargetFdTrans { TargetFdDataFunc host_to_target_data; TargetFdDataFunc target_to_host_data; TargetFdAddrFunc target_to_host_addr; } TargetFdTrans; static TargetFdTrans **target_fd_trans; Loading @@ -313,6 +315,14 @@ static TargetFdDataFunc fd_trans_host_to_target_data(int fd) return NULL; } static TargetFdAddrFunc fd_trans_target_to_host_addr(int fd) { if (fd < target_fd_max && target_fd_trans[fd]) { return target_fd_trans[fd]->target_to_host_addr; } return NULL; } static void fd_trans_register(int fd, TargetFdTrans *trans) { unsigned int oldmax; Loading Loading @@ -1162,7 +1172,7 @@ static inline abi_long target_to_host_ip_mreq(struct ip_mreqn *mreqn, return 0; } static inline abi_long target_to_host_sockaddr(struct sockaddr *addr, static inline abi_long target_to_host_sockaddr(int fd, struct sockaddr *addr, abi_ulong target_addr, socklen_t len) { Loading @@ -1170,6 +1180,10 @@ static inline abi_long target_to_host_sockaddr(struct sockaddr *addr, sa_family_t sa_family; struct target_sockaddr *target_saddr; if (fd_trans_target_to_host_addr(fd)) { return fd_trans_target_to_host_addr(fd)(addr, target_addr, len); } target_saddr = lock_user(VERIFY_READ, target_addr, len, 1); if (!target_saddr) return -TARGET_EFAULT; Loading Loading @@ -2115,7 +2129,7 @@ static abi_long do_bind(int sockfd, abi_ulong target_addr, addr = alloca(addrlen+1); ret = target_to_host_sockaddr(addr, target_addr, addrlen); ret = target_to_host_sockaddr(sockfd, addr, target_addr, addrlen); if (ret) return ret; Loading @@ -2135,7 +2149,7 @@ static abi_long do_connect(int sockfd, abi_ulong target_addr, addr = alloca(addrlen+1); ret = target_to_host_sockaddr(addr, target_addr, addrlen); ret = target_to_host_sockaddr(sockfd, addr, target_addr, addrlen); if (ret) return ret; Loading @@ -2155,7 +2169,8 @@ static abi_long do_sendrecvmsg_locked(int fd, struct target_msghdr *msgp, if (msgp->msg_name) { msg.msg_namelen = tswap32(msgp->msg_namelen); msg.msg_name = alloca(msg.msg_namelen+1); ret = target_to_host_sockaddr(msg.msg_name, tswapal(msgp->msg_name), ret = target_to_host_sockaddr(fd, msg.msg_name, tswapal(msgp->msg_name), msg.msg_namelen); if (ret) { goto out2; Loading Loading @@ -2418,7 +2433,7 @@ static abi_long do_sendto(int fd, abi_ulong msg, size_t len, int flags, return -TARGET_EFAULT; if (target_addr) { addr = alloca(addrlen+1); ret = target_to_host_sockaddr(addr, target_addr, addrlen); ret = target_to_host_sockaddr(fd, addr, target_addr, addrlen); if (ret) { unlock_user(host_msg, msg, 0); return ret; Loading Loading
linux-user/syscall.c +21 −6 Original line number Diff line number Diff line Loading @@ -296,9 +296,11 @@ static bitmask_transtbl fcntl_flags_tbl[] = { }; typedef abi_long (*TargetFdDataFunc)(void *, size_t); typedef abi_long (*TargetFdAddrFunc)(void *, abi_ulong, socklen_t); typedef struct TargetFdTrans { TargetFdDataFunc host_to_target_data; TargetFdDataFunc target_to_host_data; TargetFdAddrFunc target_to_host_addr; } TargetFdTrans; static TargetFdTrans **target_fd_trans; Loading @@ -313,6 +315,14 @@ static TargetFdDataFunc fd_trans_host_to_target_data(int fd) return NULL; } static TargetFdAddrFunc fd_trans_target_to_host_addr(int fd) { if (fd < target_fd_max && target_fd_trans[fd]) { return target_fd_trans[fd]->target_to_host_addr; } return NULL; } static void fd_trans_register(int fd, TargetFdTrans *trans) { unsigned int oldmax; Loading Loading @@ -1162,7 +1172,7 @@ static inline abi_long target_to_host_ip_mreq(struct ip_mreqn *mreqn, return 0; } static inline abi_long target_to_host_sockaddr(struct sockaddr *addr, static inline abi_long target_to_host_sockaddr(int fd, struct sockaddr *addr, abi_ulong target_addr, socklen_t len) { Loading @@ -1170,6 +1180,10 @@ static inline abi_long target_to_host_sockaddr(struct sockaddr *addr, sa_family_t sa_family; struct target_sockaddr *target_saddr; if (fd_trans_target_to_host_addr(fd)) { return fd_trans_target_to_host_addr(fd)(addr, target_addr, len); } target_saddr = lock_user(VERIFY_READ, target_addr, len, 1); if (!target_saddr) return -TARGET_EFAULT; Loading Loading @@ -2115,7 +2129,7 @@ static abi_long do_bind(int sockfd, abi_ulong target_addr, addr = alloca(addrlen+1); ret = target_to_host_sockaddr(addr, target_addr, addrlen); ret = target_to_host_sockaddr(sockfd, addr, target_addr, addrlen); if (ret) return ret; Loading @@ -2135,7 +2149,7 @@ static abi_long do_connect(int sockfd, abi_ulong target_addr, addr = alloca(addrlen+1); ret = target_to_host_sockaddr(addr, target_addr, addrlen); ret = target_to_host_sockaddr(sockfd, addr, target_addr, addrlen); if (ret) return ret; Loading @@ -2155,7 +2169,8 @@ static abi_long do_sendrecvmsg_locked(int fd, struct target_msghdr *msgp, if (msgp->msg_name) { msg.msg_namelen = tswap32(msgp->msg_namelen); msg.msg_name = alloca(msg.msg_namelen+1); ret = target_to_host_sockaddr(msg.msg_name, tswapal(msgp->msg_name), ret = target_to_host_sockaddr(fd, msg.msg_name, tswapal(msgp->msg_name), msg.msg_namelen); if (ret) { goto out2; Loading Loading @@ -2418,7 +2433,7 @@ static abi_long do_sendto(int fd, abi_ulong msg, size_t len, int flags, return -TARGET_EFAULT; if (target_addr) { addr = alloca(addrlen+1); ret = target_to_host_sockaddr(addr, target_addr, addrlen); ret = target_to_host_sockaddr(fd, addr, target_addr, addrlen); if (ret) { unlock_user(host_msg, msg, 0); return ret; Loading