From: sashiko-bot@kernel.org
To: jikos@kernel.org, joe.lawrence@redhat.com, mbenes@suse.cz,
song@kernel.org, pmladek@suse.com, jpoimboe@kernel.org
Cc: "Yafang Shao" <laoar.shao@gmail.com>, live-patching@vger.kernel.org
Subject: Re: [RFC PATCH 5/6] livepatch: Remove obsolete per-object callbacks
Date: Thu, 14 May 2026 22:40:00 +0000 [thread overview]
Message-ID: <20260514224000.8316FC2BCB3@smtp.kernel.org> (raw)
In-Reply-To: <20260513143321.26185-6-laoar.shao@gmail.com>
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [Critical] Out-of-bounds ELF relocations causing memory corruption
- [High] Silent failure of livepatch state callbacks due to missing initialization
- [Low] Build failures due to unmigrated selftests and samples
--
commit deb761bd65e9a96a95798282bde72ddb362e1c0d
Author: Yafang Shao <laoar.shao@gmail.com>
livepatch: Remove obsolete per-object callbacks
This commit removes obsolete per-object callbacks from the livepatch framework
in favor of per-state callbacks. It drops the callback fields from the klp
object structures and updates objtool and the livepatch core scripts.
> All selftests have been migrated to the new per-state callbacks, making the
> per-object callbacks redundant.
Is this description accurate?
The callbacks field was removed from struct klp_object, but if modules like
samples/livepatch/livepatch-callbacks-demo.c or the selftests still use it
in their klp_object declarations, won't this cause build failures?
> diff --git a/scripts/livepatch/init.c b/scripts/livepatch/init.c
> index 9265e0e504e0c..570366b9268c4 100644
> --- a/scripts/livepatch/init.c
> +++ b/scripts/livepatch/init.c
> @@ -63,8 +63,6 @@ static int __init livepatch_mod_init(void)
>
> obj->name = obj_ext->name;
> obj->funcs = funcs;
> -
> - memcpy(&obj->callbacks, &obj_ext->callbacks, sizeof(struct klp_callbacks));
> }
>
> patch->mod = THIS_MODULE;
Will the state callbacks be executed when the patch is enabled?
Looking at livepatch_mod_init() after these changes, patch->states is never
initialized:
scripts/livepatch/init.c:livepatch_mod_init() {
...
patch->mod = THIS_MODULE;
patch->objs = objs;
/* TODO patch->states */
patch->replace_set = KLP_REPLACE_TAG;
return klp_enable_patch(patch);
}
When klp_states_pre_patch() iterates over patch->states, won't it silently
skip the uninitialized callbacks?
> diff --git a/tools/objtool/klp-diff.c b/tools/objtool/klp-diff.c
> index 4d1f9e9977eb9..6e2762de3d512 100644
> --- a/tools/objtool/klp-diff.c
> +++ b/tools/objtool/klp-diff.c
[ ... ]
> @@ -1566,8 +1566,8 @@ static int create_klp_sections(struct elfs *e)
> reloc = find_reloc_by_dest(e->out, sym->sec, sym->offset);
>
> if (!elf_create_reloc(e->out, obj_sec,
> - offsetof(struct klp_object_ext, callbacks) +
> - offsetof(struct klp_callbacks, pre_patch),
> + offsetof(struct klp_state_ext, callbacks) +
> + offsetof(struct klp_state_callbacks, pre_patch),
> reloc->sym, reloc_addend(reloc), R_ABS64))
> return -1;
> }
Does this result in out-of-bounds memory writes during ELF relocation?
Earlier in create_klp_sections(), obj_sec is allocated using the size of
struct klp_object_ext, which is 24 bytes:
tools/objtool/klp-diff.c:create_klp_sections() {
size_t obj_size = sizeof(struct klp_object_ext);
...
obj_sec = elf_create_section_pair(e->out, KLP_OBJECTS_SEC, obj_size, 0, 0);
However, the new relocations are created using offsets from a completely
different structure, struct klp_state_ext.
Because offsetof(struct klp_state_ext, callbacks) is 16, and the callback
offsets go up to 24, this applies relocations at offsets 16, 24, 32, and 40
within obj_sec.
Won't the relocation at offset 16 corrupt klp_object_ext.nr_funcs, and the
subsequent relocations write entirely out of bounds of the 24-byte obj_sec
buffer?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260513143321.26185-1-laoar.shao@gmail.com?part=5
next prev parent reply other threads:[~2026-05-14 22:40 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-13 14:33 [RFC PATCH 0/6] livepatch: Introduce replace set support Yafang Shao
2026-05-13 14:33 ` [RFC PATCH 1/6] livepatch: Support scoped atomic replace using replace set Yafang Shao
2026-05-14 20:54 ` sashiko-bot
2026-05-13 14:33 ` [RFC PATCH 2/6] livepatch: Add callbacks for introducing and removing states Yafang Shao
2026-05-13 14:33 ` [RFC PATCH 3/6] livepatch: Allow to handle lifetime of shadow variables using the livepatch state Yafang Shao
2026-05-14 22:07 ` sashiko-bot
2026-05-13 14:33 ` [RFC PATCH 4/6] livepatch: Remove "data" from struct klp_state Yafang Shao
2026-05-14 22:22 ` sashiko-bot
2026-05-13 14:33 ` [RFC PATCH 5/6] livepatch: Remove obsolete per-object callbacks Yafang Shao
2026-05-14 22:40 ` sashiko-bot [this message]
2026-05-13 14:33 ` [RFC PATCH 6/6] livepatch: Support replace_set in shadow variable API Yafang Shao
2026-05-14 23:01 ` sashiko-bot
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=20260514224000.8316FC2BCB3@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=jikos@kernel.org \
--cc=joe.lawrence@redhat.com \
--cc=jpoimboe@kernel.org \
--cc=laoar.shao@gmail.com \
--cc=live-patching@vger.kernel.org \
--cc=mbenes@suse.cz \
--cc=pmladek@suse.com \
--cc=sashiko-reviews@lists.linux.dev \
--cc=song@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.