lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Tue, 4 Dec 2018 15:00:07 +0100
From:   Petr Mladek <pmladek@...e.com>
To:     Miroslav Benes <mbenes@...e.cz>
Cc:     Jiri Kosina <jikos@...nel.org>,
        Josh Poimboeuf <jpoimboe@...hat.com>,
        Jason Baron <jbaron@...mai.com>,
        Joe Lawrence <joe.lawrence@...hat.com>,
        Evgenii Shatokhin <eshatokhin@...tuozzo.com>,
        live-patching@...r.kernel.org, linux-kernel@...r.kernel.org,
        Jessica Yu <jeyu@...nel.org>
Subject: Re: [PATCH v14 03/11] livepatch: Consolidate klp_free functions

On Mon 2018-12-03 15:59:57, Miroslav Benes wrote:
> On Thu, 29 Nov 2018, Petr Mladek wrote:
> 
> > -static int klp_init_patch(struct klp_patch *patch)
> > +/* Init operations that must succeed before klp_free_patch() can be called. */
> > +static int klp_init_patch_before_free(struct klp_patch *patch)
> 
> There is no klp_free_patch() now, so the comment is not correct. Also I 
> don't know if the function name is ideal, but I don't have a better one.
> 
> >  {
> >  	struct klp_object *obj;
> > -	int ret;
> > +	struct klp_func *func;
> >  
> >  	if (!patch->objs)
> >  		return -EINVAL;
> >  
> > -	mutex_lock(&klp_mutex);
> > -
> > +	INIT_LIST_HEAD(&patch->list);
> > +	patch->kobj_alive = false;
> >  	patch->enabled = false;
> >  	init_completion(&patch->finish);
> >  
> > -	ret = kobject_init_and_add(&patch->kobj, &klp_ktype_patch,
> > -				   klp_root_kobj, "%s", patch->mod->name);
> > +	klp_for_each_object(patch, obj) {
> > +		if (!obj->funcs)
> > +			return -EINVAL;
> > +
> > +		obj->kobj_alive = false;
> > +
> > +		klp_for_each_func(obj, func)
> > +			func->kobj_alive = false;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +static int klp_init_patch(struct klp_patch *patch)
> > +{
> > +	struct klp_object *obj;
> > +	int ret;
> > +
> > +	mutex_lock(&klp_mutex);
> > +
> > +	ret = klp_init_patch_before_free(patch);
> >  	if (ret) {
> >  		mutex_unlock(&klp_mutex);
> >  		return ret;
> >  	}
> >  
> > +	ret = kobject_init_and_add(&patch->kobj, &klp_ktype_patch,
> > +				   klp_root_kobj, "%s", patch->mod->name);
> > +	if (ret)
> > +		goto free;
> 
> Is this intentional? It should be sufficient (and it was before the patch) to
> unlock the mutex and return ret. We do not need to free anything here. Only
> klp_patch instance was initialized and that is all.

It will get needed later when try_module_get() is moved into
klp_init_patch_before_free(), see the 5th patch. I'll do it
in the right order in v15.

BTW: I remember that I did this by intention. I updated the patchset
step by step according to the feedback. The init_before_free() was
growing and growing. I did many rebases, shuffling changes between
patches, just wanted to be on the safe side, and maybe save one hunk.
But it seems that no shortcut can slip the careful review ;-)


> Otherwise it looks good. kobj_alive feels safer than state_initialized.

Yup.

Best Regards,
Petr

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ