[libvirt] [PATCH v2] util: Loop through all resolved addresses in virNetSocketNewListenTCP
Daniel P. Berrangé
berrange at redhat.com
Fri Jun 1 10:38:12 UTC 2018
On Thu, May 24, 2018 at 02:00:06PM +0200, Olaf Hering wrote:
> Currently virNetSocketNewListenTCP bails out early under the following
> conditions:
> - the hostname resolves to at least one IPv4 and at least one IPv6
> address
> - the local interfaces have that one IPv4 address assigned, but not any
> of the IPv6 addresses
> - the local interfaces have just IPv6 link-local addresses
>
> In this case the resolver returns not only the IPv4 addresses but also
> IPv6. Binding the IPv6 address will obviously fail. But this terminates
> the entire loop, even if binding to IPv4 succeeded.
>
> To fix this error, just keep going and loop through all returned
> addresses. In case none of the attempts to bind to some address
> succeeded, try to report the appropriate error.
>
> Signed-off-by: Olaf Hering <olaf at aepfle.de>
> ---
> v2:
> whitespace fixes, as suggested by John Ferlan
>
> src/rpc/virnetsocket.c | 23 ++++++++++-------------
> 1 file changed, 10 insertions(+), 13 deletions(-)
>
> diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c
> index 7087abec9c..60a7187348 100644
> --- a/src/rpc/virnetsocket.c
> +++ b/src/rpc/virnetsocket.c
> @@ -382,11 +382,8 @@ int virNetSocketNewListenTCP(const char *nodename,
> #endif
>
> if (bind(fd, runp->ai_addr, runp->ai_addrlen) < 0) {
> - if (errno != EADDRINUSE) {
> - virReportSystemError(errno, "%s", _("Unable to bind to port"));
> - goto error;
> - }
> - addrInUse = true;
> + if (errno == EADDRINUSE)
> + addrInUse = true;
> VIR_FORCE_CLOSE(fd);
> runp = runp->ai_next;
> continue;
> @@ -409,14 +406,14 @@ int virNetSocketNewListenTCP(const char *nodename,
> fd = -1;
> }
>
> - if (nsocks == 0 && familyNotSupported) {
> - virReportSystemError(EAFNOSUPPORT, "%s", _("Unable to bind to port"));
> - goto error;
> - }
> -
> - if (nsocks == 0 &&
> - addrInUse) {
> - virReportSystemError(EADDRINUSE, "%s", _("Unable to bind to port"));
> + if (nsocks == 0) {
> + if (familyNotSupported)
> + errno = EAFNOSUPPORT;
> + else if (addrInUse)
> + errno = EADDRINUSE;
> + else
> + errno = EDESTADDRREQ;
> + virReportSystemError(errno, "%s", _("Unable to bind to port"));
> goto error;
> }
The indentation is still wrong here - libvirt uses 4 space indents.
Functionally the patch looks ok though.
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
More information about the libvir-list
mailing list