On 07/13/2017 10:41 AM, Michal Privoznik wrote:
On 06/02/2017 12:25 PM, John Ferlan wrote:
> If the virNWFilterSaveConfig in virNWFilterObjListLoadConfig, then jumping
s/,/ fails,/
> to the error label would free the @def owned by the object, but the object
> is still on the list.
>
> Fix this by following proper procedure to clear @def and create a new
> variable @objdef to handle the object's def after successful assignment.
>
> Signed-off-by: John Ferlan <jferlan(a)redhat.com>
> ---
> src/conf/virnwfilterobj.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/src/conf/virnwfilterobj.c b/src/conf/virnwfilterobj.c
> index 0027d45..3fb6046 100644
> --- a/src/conf/virnwfilterobj.c
> +++ b/src/conf/virnwfilterobj.c
> @@ -485,6 +485,7 @@ virNWFilterObjListLoadConfig(virNWFilterObjListPtr nwfilters,
> {
> virNWFilterDefPtr def = NULL;
> virNWFilterObjPtr obj;
> + virNWFilterDefPtr objdef;
> char *configFile = NULL;
>
> if (!(configFile = virFileBuildPath(configDir, name, ".xml")))
> @@ -503,10 +504,12 @@ virNWFilterObjListLoadConfig(virNWFilterObjListPtr nwfilters,
>
> if (!(obj = virNWFilterObjListAssignDef(nwfilters, def)))
> goto error;
> + def = NULL;
> + objdef = obj->def;
>
> /* We generated a UUID, make it permanent by saving the config to disk */
> - if (!def->uuid_specified &&
> - virNWFilterSaveConfig(configDir, def) < 0)
> + if (!objdef->uuid_specified &&
> + virNWFilterSaveConfig(configDir, objdef) < 0)
> goto error;
This @objdef variable looks redundant to me. Can't we access obj->def
directly? Esp. since you're introducing a variable just for a two times
use. Then again, we often use obj->def->... when it comes to domain
objects, why not here?
If obj->def ever gets "consumed" by the virObject code, then
obj->def->x
will fail miserably. That was the original design goal. I've since had
to scale back. I guess I could do "obj->def->uuid_specified" as it
doesn't really matter until the day obj->def-> is no longer accessible.
As a preference - I like the extra local variable. In the long run the
compiler will do away with it, but for me it just reads better that way.
The deeper one gets into a->b->c->d[->e...] the more insane it gets.
Forcing one level of indirection is just more readable to me.
John
ACK if you drop the @objdef variable.
Michal