
On Thu, Jun 04, 2015 at 07:02:00 -0400, John Ferlan wrote:
On 05/29/2015 09:33 AM, Peter Krempa wrote:
virDomainLiveConfigHelperMethod that is used for this job now does modify the flags but still requires the callers to extract the correct definition objects.
In addition coverity and other static analyzers are usually unhappy as they don't grasp the fact that @flags are upadted according to the correct def to be present.
To work this issue around and simplify the calling chain let's add a new helper that will work only on drivers that always copy the persistent def to a transient at start of a vm. This will allow to drop a few arguments. The new function syntax will also fill two definition pointers rather than modifying the @flags parameter. --- src/conf/domain_conf.c | 113 ++++++++++++++++++++++++++++++++++++++--------- src/conf/domain_conf.h | 8 ++++ src/libvirt_private.syms | 2 + 3 files changed, 102 insertions(+), 21 deletions(-)
Well Coverity is most unhappy with these changes - causes 14 new issues - all related... I didn't get a chance to run your series through my checker because not all of the patches made it through even though they were in the archive (strange).
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 4a8c1b5..e8bda73 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c
...
+ +/** + * virDomainObjGetDefs: + * + * @vm: domain object + * @flags: for virDomainModificationImpact + * @liveDef: Set to the pointer to the live definition of @vm. + * @persDef: Set to the pointer to the config definition of @vm. + * + * Helper function to resolve @flags and retrieve correct domain pointer + * objects. This function should be used only when the hypervisor driver always + * creates vm->newDef once the vm is started. (qemu driver does that) + * + * If @liveDef or @persDef are set it implies that @flags request modification + * of thereof. + * + * Returns 0 on success and sets @liveDef and @persDef; -1 if @flags are + * inappropriate. + */ +int +virDomainObjGetDefs(virDomainObjPtr vm, + unsigned int flags, + virDomainDefPtr *liveDef, + virDomainDefPtr *persDef) +{ + if (liveDef) + *liveDef = NULL; + + if (*persDef) + *persDef = NULL;
You dereference "*persDef" here without checking and furthermore this causes Coverity to complain about UNINIT usage in each of the callers since non initialized their def to NULL.a
[1]
+ + if (virDomainObjUpdateModificationImpact(vm, &flags) < 0) + return -1; + + if (flags & VIR_DOMAIN_AFFECT_LIVE) { + if (liveDef) + *liveDef = vm->def; + + if (persDef) + *liveDef = vm->newDef;
here you check for persDef, but adjust *liveDef - so if liveDef == NULL, then there's going to be a failure...
+ } else { + if (persDef) + *persDef = vm->def;
Also persDef is checked again...
+ } + + return 0; }
+ /* * The caller must hold a lock on the driver owning 'doms', * and must also have locked 'dom', to ensure no one else diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 34b669d..262d267 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2545,6 +2545,14 @@ virDomainObjGetPersistentDef(virCapsPtr caps, virDomainXMLOptionPtr xmlopt, virDomainObjPtr domain);
+int virDomainObjUpdateModificationImpact(virDomainObjPtr vm, + unsigned int *flags); + +int virDomainObjGetDefs(virDomainObjPtr vm, + unsigned int flags, + virDomainDefPtr *liveDef, + virDomainDefPtr *persDef);
How about a "ATTRIBUTE_NONNULL(4)" here?
Actually, the first check has an extra dereference that should not be there. The function expects that NULL is passed here.
John
I'd paste a diff here that worked for me, except that I know you prefer not to have inlined diffs like that in email... So I'll wait to see how you fix this...
The change is to remove the deref at [1]. Peter