[libvirt] [PATCH v2 8/9] virsocketaddr: Introduce virSocketAddrIsSameTCPHost

Peter Krempa pkrempa at redhat.com
Fri Apr 24 08:25:34 UTC 2015


On Thu, Apr 23, 2015 at 16:12:16 -0400, John Ferlan wrote:
> Add new API to be able to compare two TCP host name strings or numeric IP
> Addresses in order to determine if the resolved and translated names match.
> 
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
>  src/libvirt_private.syms |  1 +
>  src/util/virsocketaddr.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++
>  src/util/virsocketaddr.h |  2 ++
>  3 files changed, 65 insertions(+)
> 
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 848b44a..34cb871 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -2058,6 +2058,7 @@ virSocketAddrGetRange;
>  virSocketAddrIsNetmask;
>  virSocketAddrIsNumericLocalhost;
>  virSocketAddrIsPrivate;
> +virSocketAddrIsSameTCPHost;
>  virSocketAddrIsWildcard;
>  virSocketAddrMask;
>  virSocketAddrMaskByPrefix;
> diff --git a/src/util/virsocketaddr.c b/src/util/virsocketaddr.c
> index 993d460..c602604 100644
> --- a/src/util/virsocketaddr.c
> +++ b/src/util/virsocketaddr.c
> @@ -23,6 +23,7 @@
>  
>  #include <config.h>
>  
> +#include "viralloc.h"
>  #include "virsocketaddr.h"
>  #include "virerror.h"
>  #include "virstring.h"
> @@ -980,3 +981,64 @@ virSocketAddrIsNumericLocalhost(const char *addr)
>  
>      return false;
>  }
> +
> +
> +/**
> + * virSocketAddrIsSameTCPHost:
> + * @host1: either a numeric network address IPv4 or IPv6 or a network hostname
> + * @host2: either a numeric network address IPv4 or IPv6 or a network hostname
> + *
> + * For each hostname, get the array of resolved addresses and in a loop make
> + * compare the translated host IP Address looking for duplicates.
> + *
> + * Returns 1 if the hosts match, 0 if there is no match, and -1 on error
> + */
> +int
> +virSocketAddrIsSameTCPHost(const char *host1,
> +                           const char *host2)
> +{
> +    int ret = -1;
> +    struct addrinfo *reshost1 = NULL, *reshost2 = NULL;
> +    struct addrinfo *curhost1, *curhost2;
> +    char *host1rslv = NULL, *host2rslv = NULL;
> +
> +    if (virSocketAddrParseInternal(&reshost1, host1, AF_UNSPEC, IPPROTO_TCP,
> +                                   false, true) < 0)
> +        goto cleanup;
> +
> +    if (virSocketAddrParseInternal(&reshost2, host2, AF_UNSPEC, IPPROTO_TCP,
> +                                   false, true) < 0)
> +        goto cleanup;
> +
> +    for (curhost1 = reshost1; curhost1; curhost1 = curhost1->ai_next) {
> +        if (!(host1rslv = virSocketAddrGetNumericHost(curhost1->ai_addr,
> +                                                      curhost1->ai_addrlen,
> +                                                      false, NULL)))
> +            goto cleanup;
> +        for (curhost2 = reshost2; curhost2; curhost2 = curhost2->ai_next) {
> +            if (curhost1->ai_family != curhost2->ai_family)
> +                continue;
> +
> +            if (!(host2rslv = virSocketAddrGetNumericHost(curhost2->ai_addr,
> +                                                          curhost2->ai_addrlen,
> +                                                          false, NULL)))
> +                goto cleanup;
> +
> +            if (STREQ(host1rslv, host2rslv)) {

I'm still failing to see why the host address check portion of
virSocketAddrEqual() isn't good for this job and you have to format the
address as string.

> +                ret = 1;
> +                goto cleanup;
> +            }
> +        }

Next iteration leaks host2rslv.

> +    }

Next iteration leaks host1rslv.

> +
> +    ret = 0;
> +
> + cleanup:
> +    if (reshost1)
> +        freeaddrinfo(reshost1);
> +    if (reshost2)
> +        freeaddrinfo(reshost2);
> +    VIR_FREE(host1rslv);
> +    VIR_FREE(host2rslv);
> +    return ret;
> +}

Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150424/b738d10f/attachment-0001.sig>


More information about the libvir-list mailing list