aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2021-03-29 13:59:43 -0700
committerDoug Evans <dje@google.com>2021-04-06 12:53:02 -0700
commitcc53bd21e02d87aeac02687fb34aa1b1a3a9f7e4 (patch)
tree8e1d8a866375a35a363318127ffb843a8aec6a90
parent9aaa17b530325d13dfaab293f5406ee8017d12e6 (diff)
downloadslirp-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.c9
-rw-r--r--src/socket.c1
-rw-r--r--src/udp.c5
-rw-r--r--src/util.c1
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,
diff --git a/src/udp.c b/src/udp.c
index 37f13ca..bb65ecf 100644
--- a/src/udp.c
+++ b/src/udp.c
@@ -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);
diff --git a/src/util.c b/src/util.c
index 67ef667..e6bccbe 100644
--- a/src/util.c
+++ b/src/util.c
@@ -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)
{