Message ID | 170791694361.389532.10047514554799419688.stgit@devnote2 (mailing list archive) |
---|---|
State | Superseded |
Commit | 9704669c386f9bbfef2e002e7e690c56b7dcf5de |
Headers | show |
Series | tracing/probes: Support function parameter access from return probe | expand |
Let me pick this patch because this is a real bugfix. On Wed, 14 Feb 2024 22:22:23 +0900 "Masami Hiramatsu (Google)" <mhiramat@kernel.org> wrote: > From: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > Fix to search a field from the structure which has anonymous union > correctly. > Since the reference `type` pointer was updated in the loop, the search > loop suddenly aborted where it hits an anonymous union. Thus it can not > find the field after the anonymous union. This avoids updating the > cursor `type` pointer in the loop. > > Fixes: 302db0f5b3d8 ("tracing/probes: Add a function to search a member of a struct/union") > Cc: stable@vger.kernel.org > Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> > --- > kernel/trace/trace_btf.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/kernel/trace/trace_btf.c b/kernel/trace/trace_btf.c > index ca224d53bfdc..5bbdbcbbde3c 100644 > --- a/kernel/trace/trace_btf.c > +++ b/kernel/trace/trace_btf.c > @@ -91,8 +91,8 @@ const struct btf_member *btf_find_struct_member(struct btf *btf, > for_each_member(i, type, member) { > if (!member->name_off) { > /* Anonymous union/struct: push it for later use */ > - type = btf_type_skip_modifiers(btf, member->type, &tid); > - if (type && top < BTF_ANON_STACK_MAX) { > + if (btf_type_skip_modifiers(btf, member->type, &tid) && > + top < BTF_ANON_STACK_MAX) { > anon_stack[top].tid = tid; > anon_stack[top++].offset = > cur_offset + member->offset; >
diff --git a/kernel/trace/trace_btf.c b/kernel/trace/trace_btf.c index ca224d53bfdc..5bbdbcbbde3c 100644 --- a/kernel/trace/trace_btf.c +++ b/kernel/trace/trace_btf.c @@ -91,8 +91,8 @@ const struct btf_member *btf_find_struct_member(struct btf *btf, for_each_member(i, type, member) { if (!member->name_off) { /* Anonymous union/struct: push it for later use */ - type = btf_type_skip_modifiers(btf, member->type, &tid); - if (type && top < BTF_ANON_STACK_MAX) { + if (btf_type_skip_modifiers(btf, member->type, &tid) && + top < BTF_ANON_STACK_MAX) { anon_stack[top].tid = tid; anon_stack[top++].offset = cur_offset + member->offset;