[libvirt] [PATCH v2 3/4] conf: add virSocketAddrIsLocalhost to Check migration_host

Chen, Fan chen.fan.fnst at cn.fujitsu.com
Tue Oct 7 04:41:18 UTC 2014


On Fri, 2014-10-03 at 15:58 +0200, Ján Tomko wrote: 
> On 09/23/2014 06:04 AM, Chen Fan wrote:
> > Signed-off-by: Chen Fan <chen.fan.fnst at cn.fujitsu.com>
> > ---
> >  src/libvirt_private.syms |  1 +
> >  src/qemu/qemu_conf.c     |  8 ++++++++
> >  src/util/virsocketaddr.c | 35 +++++++++++++++++++++++++++++++++++
> >  src/util/virsocketaddr.h |  3 +++
> >  4 files changed, 47 insertions(+)
> > 
> > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> > index 51a692b..f7172b0 100644
> > --- a/src/libvirt_private.syms
> > +++ b/src/libvirt_private.syms
> > @@ -1885,6 +1885,7 @@ virSocketAddrGetPort;
> >  virSocketAddrGetRange;
> >  virSocketAddrIsNetmask;
> >  virSocketAddrIsNumeric;
> > +virSocketAddrIsLocalhost;
> >  virSocketAddrIsPrivate;
> >  virSocketAddrIsWildcard;
> >  virSocketAddrMask;
> > diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> > index adc6caf..30169cf 100644
> > --- a/src/qemu/qemu_conf.c
> > +++ b/src/qemu/qemu_conf.c
> > @@ -707,6 +707,14 @@ int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg,
> >      GET_VALUE_LONG("seccomp_sandbox", cfg->seccompSandbox);
> >  
> >      GET_VALUE_STR("migration_host", cfg->migrateHost);
> > +    if (cfg->migrateHost &&
> > +        virSocketAddrIsLocalhost(cfg->migrateHost)) {
> > +        virReportError(VIR_ERR_CONF_SYNTAX,
> > +                       _("migration_host must not be 'localhost' address: %s"),
> > +                       cfg->migrateHost);
> > +        goto cleanup;
> > +    }
> > +
> >      GET_VALUE_STR("migration_address", cfg->migrationAddress);
> >  
> >      GET_VALUE_BOOL("log_timestamp", cfg->logTimestamp);
> > diff --git a/src/util/virsocketaddr.c b/src/util/virsocketaddr.c
> > index 64409a6..dfcaf72 100644
> > --- a/src/util/virsocketaddr.c
> > +++ b/src/util/virsocketaddr.c
> > @@ -884,3 +884,38 @@ virSocketAddrIsNumeric(const char *address, int *family)
> >      }
> >      return sa_family == AF_INET || sa_family == AF_INET6;
> >  }
> > +
> > +/**
> > + * virSocketAddrIsLocalhost:
> > + * @address: address to check
> > + *
> > + * Check if passed address is a 'localhost' address.
> > + *
> > + * Returns: true if @address is 'localhost' address,
> > + *          false otherwise
> > + */
> > +bool
> > +virSocketAddrIsLocalhost(const char *address)
> 
> I think this function should be named 'IsNumericLocalhost' and only check for
> the numeric representation of localhost. If the address is numeric, we can
> parse it and catch all the cases (like 127.0.0.1, 2130706433, 0177.0.0.1,
> 0:0:0::1). But we can't check if a hostname points to localhost without
> resolving it.
> 
> > +{
> > +   int family;
> > +
> > +   if (virSocketAddrIsNumeric(address, &family)) {
> > +       if (family == AF_INET) {
> > +           if (STREQ(address, "127.0.0.1"))
> > +               return true;
> > +       }
> > +
> 
> This should do what virSocketAddrIsWildcard does, only using
> INADDR_LOOPBACK instead of INADDR_ANY
> and IN6_IS_ADDR_LOOPBACK instead of IN6_IS_ADDR_UNSPECIFIED.
> 
> > +       if (family == AF_INET6) {
> > +           if (STREQ(address, "::1"))
> > +               return true;
> > +       }
> > +   } else {
> > +       if (STRPREFIX(address, "localhost"))
> > +           return true;
> 
> I'd put this check in qemu_conf.c.
> 
> > +
> > +       if (STREQ(address, "[::1]"))
> > +           return true;
> 
> And strip the brackets before calling virSocketAddrParse.

I had sent V3 patch that including the above solution.
please help to review it.

Thanks,
Chen 
> 
> Jan
> 
> > +   }
> > +
> > +   return false;
> > +}
> > diff --git a/src/util/virsocketaddr.h b/src/util/virsocketaddr.h
> > index 7b11afb..5269f35 100644
> > --- a/src/util/virsocketaddr.h
> > +++ b/src/util/virsocketaddr.h
> > @@ -126,4 +126,7 @@ bool virSocketAddrIsPrivate(const virSocketAddr *addr);
> >  bool virSocketAddrIsWildcard(const virSocketAddr *addr);
> >  
> >  bool virSocketAddrIsNumeric(const char *address, int *family);
> > +
> > +bool virSocketAddrIsLocalhost(const char *address);
> > +
> >  #endif /* __VIR_SOCKETADDR_H__ */
> > 
> 
> 





More information about the libvir-list mailing list