On Mon, Sep 26, 2022 at 09:50:33PM +0200, Laurent Vivier wrote: > Signed-off-by: Laurent Vivier <lviv...@redhat.com> > Reviewed-by: Stefano Brivio <sbri...@redhat.com>
Reviewed-by: David Gibson <da...@gibson.dropbear.id.au> > --- > include/qemu/sockets.h | 2 ++ > net/net.c | 62 ++++++++++++++++++++++-------------------- > 2 files changed, 34 insertions(+), 30 deletions(-) > > diff --git a/include/qemu/sockets.h b/include/qemu/sockets.h > index 038faa157f59..47194b9732f8 100644 > --- a/include/qemu/sockets.h > +++ b/include/qemu/sockets.h > @@ -47,6 +47,8 @@ void socket_listen_cleanup(int fd, Error **errp); > int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp); > > /* Old, ipv4 only bits. Don't use for new code. */ > +int convert_host_port(struct sockaddr_in *saddr, const char *host, > + const char *port, Error **errp); > int parse_host_port(struct sockaddr_in *saddr, const char *str, > Error **errp); > int socket_init(void); > diff --git a/net/net.c b/net/net.c > index 2db160e0634d..d2288bd3a929 100644 > --- a/net/net.c > +++ b/net/net.c > @@ -66,55 +66,57 @@ static QTAILQ_HEAD(, NetClientState) net_clients; > /***********************************************************/ > /* network device redirectors */ > > -int parse_host_port(struct sockaddr_in *saddr, const char *str, > - Error **errp) > +int convert_host_port(struct sockaddr_in *saddr, const char *host, > + const char *port, Error **errp) > { > - gchar **substrings; > struct hostent *he; > - const char *addr, *p, *r; > - int port, ret = 0; > + const char *r; > + long p; > > memset(saddr, 0, sizeof(*saddr)); > > - substrings = g_strsplit(str, ":", 2); > - if (!substrings || !substrings[0] || !substrings[1]) { > - error_setg(errp, "host address '%s' doesn't contain ':' " > - "separating host from port", str); > - ret = -1; > - goto out; > - } > - > - addr = substrings[0]; > - p = substrings[1]; > - > saddr->sin_family = AF_INET; > - if (addr[0] == '\0') { > + if (host[0] == '\0') { > saddr->sin_addr.s_addr = 0; > } else { > - if (qemu_isdigit(addr[0])) { > - if (!inet_aton(addr, &saddr->sin_addr)) { > + if (qemu_isdigit(host[0])) { > + if (!inet_aton(host, &saddr->sin_addr)) { > error_setg(errp, "host address '%s' is not a valid " > - "IPv4 address", addr); > - ret = -1; > - goto out; > + "IPv4 address", host); > + return -1; > } > } else { > - he = gethostbyname(addr); > + he = gethostbyname(host); > if (he == NULL) { > - error_setg(errp, "can't resolve host address '%s'", addr); > - ret = -1; > - goto out; > + error_setg(errp, "can't resolve host address '%s'", host); > + return -1; > } > saddr->sin_addr = *(struct in_addr *)he->h_addr; > } > } > - port = strtol(p, (char **)&r, 0); > - if (r == p) { > - error_setg(errp, "port number '%s' is invalid", p); > + if (qemu_strtol(port, &r, 0, &p) != 0) { > + error_setg(errp, "port number '%s' is invalid", port); > + return -1; > + } > + saddr->sin_port = htons(p); > + return 0; > +} > + > +int parse_host_port(struct sockaddr_in *saddr, const char *str, > + Error **errp) > +{ > + gchar **substrings; > + int ret; > + > + substrings = g_strsplit(str, ":", 2); > + if (!substrings || !substrings[0] || !substrings[1]) { > + error_setg(errp, "host address '%s' doesn't contain ':' " > + "separating host from port", str); > ret = -1; > goto out; > } > - saddr->sin_port = htons(port); > + > + ret = convert_host_port(saddr, substrings[0], substrings[1], errp); > > out: > g_strfreev(substrings); -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
signature.asc
Description: PGP signature