[libvirt] [PATCH 5/5] guestfwd: Ensure guestfwd address is IPv4

Daniel Veillard veillard at redhat.com
Thu Nov 5 15:08:08 UTC 2009


On Wed, Nov 04, 2009 at 07:10:41PM +0000, Daniel P. Berrange wrote:
> On Wed, Nov 04, 2009 at 04:22:02PM +0000, Matthew Booth wrote:
> > * src/conf/domain_conf.c: Throw an error if guestfwd address isn't IPv4
> > ---
> >  src/conf/domain_conf.c |    7 +++++++
> >  1 files changed, 7 insertions(+), 0 deletions(-)
> > 
> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> > index 94bce1e..ec2a1bc 100644
> > --- a/src/conf/domain_conf.c
> > +++ b/src/conf/domain_conf.c
> > @@ -1482,6 +1482,13 @@ virDomainChrDefParseXML(virConnectPtr conn,
> >                          goto error;
> >                      }
> >  
> > +                    if(def->target.addr->stor.ss_family != AF_INET) {
> 
>                        ^^^^  whitespace issue

  Okay, I fixed a number of those in that module too

> > +                        virDomainReportError(conn, VIR_ERR_NO_SUPPORT, "%s",
> > +                                             _("guestfwd channel only supports "
> > +                                               "IPv4 addresses"));
> > +                        goto error;
> > +                    }
> > +
> >                      if(portStr == NULL) {
> >                          virDomainReportError(conn, VIR_ERR_INVALID_DOMAIN, "%s",
> >                                               _("guestfwd channel does "
> > -- 
> 
> NO_SUPPORT isn't really the best error code to use here - that's intended
> for public API calls which aren't implemented by a driver. 
> 
> Our reporting of XML configurations which aren't valid is pretty rubbish
> as we don't have a standard error code - people have been making it up as
> we go along.
> 
> I think we should add a new error code:
> 
>   VIR_ERR_CONFIG_UNSUPPORTED
> 
> whcih we can then standardize on for this kind of thing

  yup, makes sense, we have VIR_ERR_XML_ERROR for pure XML configuration
errors where the constructs are just invalid (I fixed a few in that module,
it was using VIR_ERR_INVALID_DOMAIN :-) but that one is for valid but
unsupported configurations.

  I ended up with the following patch which I pushed

   thanks !

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/
-------------- next part --------------
diff --git a/include/libvirt/virterror.h b/include/libvirt/virterror.h
index fa5cac4..4c28501 100644
--- a/include/libvirt/virterror.h
+++ b/include/libvirt/virterror.h
@@ -170,6 +170,7 @@ typedef enum {
     VIR_WAR_NO_SECRET, /* failed to start secret storage */
     VIR_ERR_INVALID_SECRET, /* invalid secret */
     VIR_ERR_NO_SECRET, /* secret not found */
+    VIR_ERR_CONFIG_UNSUPPORTED, /* unsupported configuration construct */
 } virErrorNumber;
 
 /**
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 94bce1e..90bd0e2 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1365,8 +1365,8 @@ virDomainChrDefParseXML(virConnectPtr conn,
     nodeName = (const char *) node->name;
     if ((def->targetType = virDomainChrTargetTypeFromString(nodeName)) < 0) {
         /* channel is handled below */
-        if(STRNEQ(nodeName, "channel")) {
-            virDomainReportError(conn, VIR_ERR_INVALID_DOMAIN,
+        if (STRNEQ(nodeName, "channel")) {
+            virDomainReportError(conn, VIR_ERR_XML_ERROR,
                               _("unknown target type for character device: %s"),
                                  nodeName);
             return NULL;
@@ -1421,10 +1421,10 @@ virDomainChrDefParseXML(virConnectPtr conn,
                     protocol = virXMLPropString(cur, "type");
             } else if (xmlStrEqual(cur->name, BAD_CAST "target")) {
                 /* If target type isn't set yet, expect it to be set here */
-                if(def->targetType == VIR_DOMAIN_CHR_TARGET_TYPE_NULL) {
+                if (def->targetType == VIR_DOMAIN_CHR_TARGET_TYPE_NULL) {
                     targetType = virXMLPropString(cur, "type");
-                    if(targetType == NULL) {
-                        virDomainReportError(conn, VIR_ERR_INVALID_DOMAIN, "%s",
+                    if (targetType == NULL) {
+                        virDomainReportError(conn, VIR_ERR_XML_ERROR, "%s",
                                              _("character device target does "
                                                "not define a type"));
                         goto error;
@@ -1432,7 +1432,7 @@ virDomainChrDefParseXML(virConnectPtr conn,
                     if ((def->targetType =
                         virDomainChrTargetTypeFromString(targetType)) < 0)
                     {
-                        virDomainReportError(conn, VIR_ERR_INVALID_DOMAIN,
+                        virDomainReportError(conn, VIR_ERR_XML_ERROR,
                                              _("unknown target type for "
                                                "character device: %s"),
                                              targetType);
@@ -1446,14 +1446,14 @@ virDomainChrDefParseXML(virConnectPtr conn,
                 case VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL:
                 case VIR_DOMAIN_CHR_TARGET_TYPE_CONSOLE:
                     portStr = virXMLPropString(cur, "port");
-                    if(portStr == NULL) {
+                    if (portStr == NULL) {
                         /* Not required. It will be assigned automatically
                          * later */
                         break;
                     }
 
-                    if(virStrToLong_ui(portStr, NULL, 10, &port) < 0) {
-                        virDomainReportError(conn, VIR_ERR_INVALID_DOMAIN,
+                    if (virStrToLong_ui(portStr, NULL, 10, &port) < 0) {
+                        virDomainReportError(conn, VIR_ERR_XML_ERROR,
                                              _("Invalid port number: %s"),
                                              portStr);
                         goto error;
@@ -1464,32 +1464,39 @@ virDomainChrDefParseXML(virConnectPtr conn,
                     addrStr = virXMLPropString(cur, "address");
                     portStr = virXMLPropString(cur, "port");
 
-                    if(addrStr == NULL) {
-                        virDomainReportError(conn, VIR_ERR_INVALID_DOMAIN, "%s",
+                    if (addrStr == NULL) {
+                        virDomainReportError(conn, VIR_ERR_XML_ERROR, "%s",
                                              _("guestfwd channel does not "
                                                "define a target address"));
                         goto error;
                     }
-                    if(VIR_ALLOC(def->target.addr) < 0) {
+                    if (VIR_ALLOC(def->target.addr) < 0) {
                         virReportOOMError(conn);
                         goto error;
                     }
-                    if(virSocketParseAddr(addrStr, def->target.addr, 0) < 0)
+                    if (virSocketParseAddr(addrStr, def->target.addr, 0) < 0)
                     {
-                        virDomainReportError(conn, VIR_ERR_INVALID_DOMAIN,
+                        virDomainReportError(conn, VIR_ERR_XML_ERROR,
                                              _("%s is not a valid address"),
                                              addrStr);
                         goto error;
                     }
 
-                    if(portStr == NULL) {
-                        virDomainReportError(conn, VIR_ERR_INVALID_DOMAIN, "%s",
+                    if (def->target.addr->stor.ss_family != AF_INET) {
+                        virDomainReportError(conn, VIR_ERR_CONFIG_UNSUPPORTED,
+                                     "%s", _("guestfwd channel only supports "
+                                             "IPv4 addresses"));
+                        goto error;
+                    }
+
+                    if (portStr == NULL) {
+                        virDomainReportError(conn, VIR_ERR_XML_ERROR, "%s",
                                              _("guestfwd channel does "
                                                "not define a target port"));
                         goto error;
                     }
-                    if(virStrToLong_ui(portStr, NULL, 10, &port) < 0) {
-                        virDomainReportError(conn, VIR_ERR_INVALID_DOMAIN,
+                    if (virStrToLong_ui(portStr, NULL, 10, &port) < 0) {
+                        virDomainReportError(conn, VIR_ERR_XML_ERROR,
                                              _("Invalid port number: %s"),
                                              portStr);
                         goto error;
@@ -1498,7 +1505,7 @@ virDomainChrDefParseXML(virConnectPtr conn,
                     break;
 
                 default:
-                    virDomainReportError(conn, VIR_ERR_INVALID_DOMAIN,
+                    virDomainReportError(conn, VIR_ERR_XML_ERROR,
                                          _("unexpected target type type %u"),
                                          def->targetType);
                 }
@@ -2732,7 +2739,7 @@ static virDomainDefPtr virDomainDefParseXML(virConnectPtr conn,
     }
 
     if (!(flags & VIR_DOMAIN_XML_INACTIVE))
-        if((virXPathLong(conn, "string(./@id)", ctxt, &id)) < 0)
+        if ((virXPathLong(conn, "string(./@id)", ctxt, &id)) < 0)
             id = -1;
     def->id = (int)id;
 
diff --git a/src/util/virterror.c b/src/util/virterror.c
index 10f979c..c8e8623 100644
--- a/src/util/virterror.c
+++ b/src/util/virterror.c
@@ -1089,6 +1089,12 @@ virErrorMsg(virErrorNumber error, const char *info)
             else
                 errmsg = _("Secret not found: %s");
             break;
+        case VIR_ERR_CONFIG_UNSUPPORTED:
+            if (info == NULL)
+                errmsg = _("unsupported configuration");
+            else
+                errmsg = _("unsupported configuration: %s");
+            break;
     }
     return (errmsg);
 }


More information about the libvir-list mailing list