[libvirt] [PATCH 4/8] snapshot: Add VIR_DOMAIN_SNAPSHOT_CREATE_VALIDATE flag

Eric Blake eblake at redhat.com
Tue Jul 9 03:12:38 UTC 2019


On 7/8/19 2:56 AM, Peter Krempa wrote:
> On Fri, Jul 05, 2019 at 23:37:31 -0500, Eric Blake wrote:
>> We've been doing a terrible job of performing XML validation in our
>> various API that parse XML with a corresponding schema (we started
>> with domains back in commit dd69a14f, v1.2.12, but didn't catch all
>> domain-related APIs, and didn't cover other XMLM). New APIs (like
> 
> s/XMLM/XMLs/ ?

Yes. Not sure how I let that one through, but I also spotted it locally
before your mail.


> 
> The 'esx' driver also implements 'domainSnapshotCreateXML' as
> esxDomainSnapshotCreateXML

Fixed on my tree:

diff --git i/src/esx/esx_driver.c w/src/esx/esx_driver.c
index 47d95abd6d..9173896fe1 100644
--- i/src/esx/esx_driver.c
+++ w/src/esx/esx_driver.c
@@ -4101,18 +4101,23 @@ esxDomainSnapshotCreateXML(virDomainPtr domain,
const char *xmlDesc,
     bool diskOnly = (flags & VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY) != 0;
     bool quiesce = (flags & VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE) != 0;
     VIR_AUTOUNREF(virDomainSnapshotDefPtr) def = NULL;
+    unsigned int parse_flags = 0;

     /* ESX supports disk-only and quiesced snapshots; libvirt tracks no
      * snapshot metadata so supporting that flag is trivial.  */
     virCheckFlags(VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY |
                   VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE |
-                  VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA, NULL);
+                  VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA |
+                  VIR_DOMAIN_SNAPSHOT_CREATE_VALIDATE, NULL);
+
+    if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_VALIDATE)
+        format_flags = VIR_DOMAIN_SNAPSHOT_PARSE_VALIDATE;

     if (esxVI_EnsureSession(priv->primary) < 0)
         return NULL;

     def = virDomainSnapshotDefParseString(xmlDesc, priv->caps,
-                                          priv->xmlopt, NULL, 0);
+                                          priv->xmlopt, NULL, parse_flags);

     if (!def)
         return NULL;

>> +++ b/src/libvirt-domain-snapshot.c
>> @@ -115,6 +115,9 @@ virDomainSnapshotGetConnect(virDomainSnapshotPtr snapshot)
>>   * becomes current (see virDomainSnapshotCurrent()), and is a child
>>   * of any previous current snapshot.
>>   *
>> + * If @flags includes VIR_DOMAIN_SNAPSHOT_CREATE_VALIDATE, then @xmlDesc
>> + * must validate against the <domainsnapshot> XML schema.
> 
> s/must validate/is validated/ ?

Sure. Oddly enough, we do NOT document the VIR_DOMAIN_DEFINE_VALIDATE
flag and friends; I guess I'll add another patch to my queue to rectify
that.  (Uggh, this pile of yak shavings at my desk is growing taller...)

>> +++ b/src/vbox/vbox_common.c
>> @@ -5487,6 +5487,8 @@ vboxDomainSnapshotCreateXML(virDomainPtr dom,
>>      nsresult rc;
>>      resultCodeUnion result;
>>      virDomainSnapshotPtr ret = NULL;
>> +    unsigned int parse_flags = (VIR_DOMAIN_SNAPSHOT_PARSE_DISKS |
>> +                                VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE);
> 
> Parentheses unnecessary.

But compliant with the syntax-check, and allows for nicer indentation of
the second line.  Qemu just recently had a patch related to that:
https://lists.gnu.org/archive/html/qemu-devel/2019-07/msg01726.html


>> +++ b/tools/virsh-snapshot.c
>> @@ -50,6 +50,13 @@ virshSnapshotCreate(vshControl *ctl, virDomainPtr dom, const char *buffer,
>>
>>      snapshot = virDomainSnapshotCreateXML(dom, buffer, flags);
>>
>> +    /* If no source file but validate was not recognized, try again without
>> +     * that flag. */
>> +    if (!snapshot && last_error->code == VIR_ERR_NO_SUPPORT && !from) {
>> +        flags &= ~VIR_DOMAIN_SNAPSHOT_CREATE_VALIDATE;
>> +        snapshot = virDomainSnapshotCreateXML(dom, buffer, flags);
>> +    }
> 
> I think this compatibility glue is unnecessary ...

It's necessary if snapshot-create-as uses the flag...

>> @@ -366,7 +379,7 @@ cmdSnapshotCreateAs(vshControl *ctl, const vshCmd *cmd)
>>      const char *desc = NULL;
>>      const char *memspec = NULL;
>>      virBuffer buf = VIR_BUFFER_INITIALIZER;
>> -    unsigned int flags = 0;
>> +    unsigned int flags = VIR_DOMAIN_SNAPSHOT_CREATE_VALIDATE;
> 
> ... just to validate something we always generated ourselves.

...but I can drop the use here, if you think we are safe.

> 
> ACK if you remove the use of the flag in cmdSnapshotCreateAs. Other are
> at your discretion.

Okay, will drop the use in snapshot-create-as.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20190708/b983457a/attachment-0001.sig>


More information about the libvir-list mailing list