From: Minfei Huang <mnfhuang@gmail.com>
To: Miroslav Benes <mbenes@suse.cz>
Cc: jpoimboe@redhat.com, sjenning@redhat.com, jkosina@suse.cz,
vojtech@suse.cz, live-patching@vger.kernel.org,
linux-kernel@vger.kernel.org, mhuang@redhat.com
Subject: Re: [PATCH v2] livepatch: Prevent livepatch to apply the uninitialized patch
Date: Tue, 12 May 2015 20:19:23 +0800 [thread overview]
Message-ID: <20150512121923.GA42505@dhcp-129-218.nay.redhat.com> (raw)
In-Reply-To: <alpine.LNX.2.00.1505121316400.32510@pobox.suse.cz>
On 05/12/15 at 01:41P, Miroslav Benes wrote:
> On Tue, 12 May 2015, Minfei Huang wrote:
>
> > The previous patches can be applied, once the corresponding module is
> > loaded. In general, the patch will do relocation (if necessary) and
> > obtain/verify function address before we start to enable patch.
> >
> > In some case, the uninitialized patch can be applied to the kernel.
> > Following is the case to describe the scenario step by step.
> >
> > 1) Patch a patch to the kernel before the corresponding module being
> > loaded.
> > 2) Call klp_module_notify_coming to enable the patch, once the module
> > is loaded.
> > 3) Do the instruction "obj->mod = mod", whatever the result of
> > klp_module_notify_coming is
> > 4) Fail to call the klp_init_object_loaded or klp_enable_object
> > 5) klp_module_notify_coming returns, now the module is working
> >
> > 6) Enable the patch from the userspace (disable patch firstly, then
> > enable the patch via sysfs)
> > 7) Call __klp_enable_patch to enable patch
> > 8) Pass the limitation (klp_init_object_loaded), because the value
> > of obj->mod is not NULL (obtain the value from step 3)
> > 9) Patch is applied, though it is uninitialized (do not relocate
> > and obtain old_addr)
> >
> > It is fatal to kernel, once the uninitialized patch is appled. To
> > fix it, obj->mod will nerver obtain the value, if livepatch fails
> > to call the klp_module_notify_coming.
>
> Hi,
>
> I still think the changelog needs to be improved a bit.
>
> There are three different situations in which the coming module notifier
> can fail:
>
> 1. relocations are not applied for some reason. In this case kallsyms for
> module symbol is not called at all. The patch is not applied to the
> module. If the user disable and enable patch again, there is possible bug
> in klp_enable_func. If the user specified func->old_addr for some function
> in the module (and he shouldn't do that, but nevertheless) our warning
> would not catch it, ftrace will fail in the process and the patch is
> not enabled.
The function may be registered successfully by ftrace, although the
function address is incorrect.
>
> 2. relocations are applied successfully, but kallsyms lookup fails. In
> this case func->old_addr can be correct for all previous lookups, 0 for
> current failed one, and "unspecified" for the rest. If we undergo the same
> scenario as in 1. the behaviour differs for three cases, but the patch is
> not enabled anyway.
>
> 3. the object is initialized but klp_enable_object fails in the notifier
> due to possible ftrace error. Since it is improbable that ftrace would
> heal itself in the future, we would get those errors everytime the patch
> is enabled.
>
> Your patch fixes all three cases, but consider to change the changelog to
> describe it all.
Thanks for your effort about the patch log. It is more clearly to the
patch log as you suggested.
I will modify the patch log, then post the next version.
>
> See few more remarks below.
>
> >
> > Signed-off-by: Minfei Huang <mnfhuang@gmail.com>
> > ---
> > v1:
> > - modify the commit log, describe the issue more details
> > ---
> > kernel/livepatch/core.c | 23 +++++++++++++----------
> > 1 file changed, 13 insertions(+), 10 deletions(-)
> >
> > diff --git a/kernel/livepatch/core.c b/kernel/livepatch/core.c
> > index 284e269..4bbcdda 100644
> > --- a/kernel/livepatch/core.c
> > +++ b/kernel/livepatch/core.c
> > @@ -883,30 +883,30 @@ int klp_register_patch(struct klp_patch *patch)
> > }
> > EXPORT_SYMBOL_GPL(klp_register_patch);
> >
> > -static void klp_module_notify_coming(struct klp_patch *patch,
> > +static int klp_module_notify_coming(struct klp_patch *patch,
> > struct klp_object *obj)
> > {
> > struct module *pmod = patch->mod;
> > struct module *mod = obj->mod;
> > - int ret;
> > + int ret = 0;
> >
> > ret = klp_init_object_loaded(patch, obj);
> > if (ret)
> > - goto err;
> > + goto out;
> >
> > if (patch->state == KLP_DISABLED)
> > - return;
> > + goto out;
> >
> > pr_notice("applying patch '%s' to loading module '%s'\n",
> > pmod->name, mod->name);
> >
> > ret = klp_enable_object(obj);
> > - if (!ret)
> > - return;
> >
> > -err:
> > - pr_warn("failed to apply patch '%s' to module '%s' (%d)\n",
> > - pmod->name, mod->name, ret);
> > +out:
> > + if (ret)
> > + pr_warn("failed to apply patch '%s' to module '%s' (%d)\n",
> > + pmod->name, mod->name, ret);
>
> I think this message should be extended. We failed to apply the patch to
> this object and we won't ever try that again. The user should know that.
I will modify the error message.
>
> Also note, that this warning is printed in two different situations.
> Either the initialization failed, or klp_enable_object failed. Maybe it
> would be nice to inform the user about that.
>
> > + return ret;
> > }
> >
> > static void klp_module_notify_going(struct klp_patch *patch,
> > @@ -930,6 +930,7 @@ disabled:
> > static int klp_module_notify(struct notifier_block *nb, unsigned long action,
> > void *data)
> > {
> > + int ret = 0;
>
> Do we really need the initialization? klp_module_notify_coming returns the
> error or 0 by itself.
>
Will modify.
Thanks
Minfei
prev parent reply other threads:[~2015-05-12 12:19 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-12 8:22 Minfei Huang
2015-05-12 11:41 ` Miroslav Benes
2015-05-12 12:19 ` Minfei Huang [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150512121923.GA42505@dhcp-129-218.nay.redhat.com \
--to=mnfhuang@gmail.com \
--cc=jkosina@suse.cz \
--cc=jpoimboe@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=live-patching@vger.kernel.org \
--cc=mbenes@suse.cz \
--cc=mhuang@redhat.com \
--cc=sjenning@redhat.com \
--cc=vojtech@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®