On 10/31/2013 06:33 PM, Daniel P. Berrange wrote:
On Thu, Oct 31, 2013 at 04:40:11PM +0100, Ján Tomko wrote:
> Also try to bind on IPv6 to check if the port is occupied.
>
>
https://bugzilla.redhat.com/show_bug.cgi?id=1025407
> ---
> src/util/virportallocator.c | 45 ++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 38 insertions(+), 7 deletions(-)
Have you tested this on a system where the IPv6 kernel module is
not present, and on a system with IPv6 kmod is present, but no
interfaces have any IPv6 addresses (not even link-local ones).
I'm concerned this is going to trigger failures on IPv4 only
hosts.
When the ipv6 module is not present, socket(AF_INET6) returns EAFNOSUPPORT.
With sysctl net.ipv6.conf.all.disable_ipv6=1 even bind succeeds.
> diff --git a/src/util/virportallocator.c b/src/util/virportallocator.c
> index 1922ea6..24b4bff 100644
> --- a/src/util/virportallocator.c
> +++ b/src/util/virportallocator.c
> + if (family == AF_INET6) {
> + addr = (struct sockaddr*)&addr6;
> + addrlen = sizeof(addr6);
> + ipv6 = true;
> + } else if (family == AF_INET) {
> + addr = (struct sockaddr*)&addr4;
> + addrlen = sizeof(addr4);
family can be AF_INET or AF_INET6 here...
> + } else {
> + virReportError(VIR_ERR_INTERNAL_ERROR, _("Unknown family %d"),
family);
> + return -1;
> + }
>
> *used = false;
>
> fd = socket(PF_INET, SOCK_STREAM, 0);
...but you're hardcoding PF_INET here. I'm not sure it is valid
to use an PF_INET socket with an AF_INET6 address in bind().
Ouch, rebase error. That can't work.
s/PF_INET/family/
> if (fd < 0) {
> + if (errno == EAFNOSUPPORT)
> + return 0;
> virReportSystemError(errno, "%s", _("Unable to open test
socket"));
> goto cleanup;
> }
Jan