diff options
author | Doug Evans <dje@google.com> | 2021-03-29 13:59:43 -0700 |
---|---|---|
committer | Doug Evans <dje@google.com> | 2021-04-06 12:53:02 -0700 |
commit | cc53bd21e02d87aeac02687fb34aa1b1a3a9f7e4 (patch) | |
tree | 8e1d8a866375a35a363318127ffb843a8aec6a90 | |
parent | 9aaa17b530325d13dfaab293f5406ee8017d12e6 (diff) | |
download | slirp-cc53bd21e02d87aeac02687fb34aa1b1a3a9f7e4.zip slirp-cc53bd21e02d87aeac02687fb34aa1b1a3a9f7e4.tar.gz slirp-cc53bd21e02d87aeac02687fb34aa1b1a3a9f7e4.tar.bz2 |
slirp_add_host*fwd: Ensure all error paths set errno
Debugging bind/listen failures without errno can get painful.
Signed-off-by: Doug Evans <dje@google.com>
-rw-r--r-- | src/slirp.c | 9 | ||||
-rw-r--r-- | src/socket.c | 1 | ||||
-rw-r--r-- | src/udp.c | 5 | ||||
-rw-r--r-- | src/util.c | 1 |
4 files changed, 14 insertions, 2 deletions
diff --git a/src/slirp.c b/src/slirp.c index 40d3873..fcaa179 100644 --- a/src/slirp.c +++ b/src/slirp.c @@ -1175,8 +1175,10 @@ int slirp_add_hostxfwd(Slirp *slirp, if (gaddr->sa_family == AF_INET) { const struct sockaddr_in *gaddr_in = (const struct sockaddr_in *) gaddr; - if (gaddrlen < sizeof(struct sockaddr_in)) + if (gaddrlen < sizeof(struct sockaddr_in)) { + errno = EINVAL; return -1; + } if (!gaddr_in->sin_addr.s_addr) { gdhcp_addr = *gaddr_in; @@ -1187,8 +1189,10 @@ int slirp_add_hostxfwd(Slirp *slirp, } else { const struct sockaddr_in6 *gaddr_in6 = (const struct sockaddr_in6 *) gaddr; - if (gaddrlen < sizeof(struct sockaddr_in6)) + if (gaddrlen < sizeof(struct sockaddr_in6)) { + errno = EINVAL; return -1; + } if (in6_zero(&gaddr_in6->sin6_addr)) { /* @@ -1196,6 +1200,7 @@ int slirp_add_hostxfwd(Slirp *slirp, * we can't translate "addr-any" to the guest. Instead, for now, * reject it. */ + errno = EINVAL; return -1; } } diff --git a/src/socket.c b/src/socket.c index 679ac4f..9166d83 100644 --- a/src/socket.c +++ b/src/socket.c @@ -735,6 +735,7 @@ int sosendto(struct socket *so, struct mbuf *m) /* * Listen for incoming TCP connections + * On failure errno contains the reason. */ struct socket *tcpx_listen(Slirp *slirp, const struct sockaddr *haddr, socklen_t haddrlen, @@ -360,18 +360,23 @@ struct socket *udpx_listen(Slirp *slirp, { struct socket *so; socklen_t addrlen; + int save_errno; so = socreate(slirp); so->s = slirp_socket(haddr->sa_family, SOCK_DGRAM, 0); if (so->s < 0) { + save_errno = errno; sofree(so); + errno = save_errno; return NULL; } so->so_expire = curtime + SO_EXPIRE; insque(so, &slirp->udb); if (bind(so->s, haddr, haddrlen) < 0) { + save_errno = errno; udp_detach(so); + errno = save_errno; return NULL; } slirp_socket_set_fast_reuse(so->s); @@ -71,6 +71,7 @@ static void slirp_set_cloexec(int fd) /* * Opens a socket with FD_CLOEXEC set + * On failure errno contains the reason. */ int slirp_socket(int domain, int type, int protocol) { |