[Crash-utility] [PATCH] symbol: fix offset print for function pointers that return pointers

John Pittman jpittman at redhat.com
Mon Apr 12 14:01:08 UTC 2021


Lianbo, I pulled down crash fresh and I can reproduce it everytime.
It's strange yours did not reproduce.  Not sure why.

RELEASE: 3.10.0-1160.24.1.el7.x86_64

crash> struct -o offload_callbacks
struct offload_callbacks {
       struct sk_buff *(*gso_segment)(struct sk_buff *, netdev_features_t);
       struct sk_buff **(*gro_receive)(struct sk_buff **, struct sk_buff *);
  [16] int (*gro_complete)(struct sk_buff *, int);
}
SIZE: 24
On Mon, Apr 12, 2021 at 3:54 AM lijiang <lijiang at redhat.com> wrote:
>
> 在 2021年04月02日 15:02, HAGIO KAZUHITO(萩尾 一仁) 写道:
> > -----Original Message-----
> >> In the show_member_offset() function, when trying to handle function
> >> pointers, the case for "(*" is handled.  However, if the function
> >> pointer returns a pointer or a pointer to a pointer, then the
> >> condition is unhandled.  This results in the offset not being printed.
> >>
> >> Fix by first checking if the member is potentially a function pointer,
> >> then checking if it returns a pointer or a pointer to a pointer.
> >>
> >> Signed-off-by: John Pittman <jpittman at redhat.com>
> >
> > Good catch... I've confirmed that the patch works as expected with RHEL7's
> > struct offload_callbacks:
> >
> > crash> struct -o offload_callbacks
> > struct offload_callbacks {
> >    [0] struct sk_buff *(*gso_segment)(struct sk_buff *, netdev_features_t);
> >    [8] struct sk_buff **(*gro_receive)(struct sk_buff **, struct sk_buff *);
> >   [16] int (*gro_complete)(struct sk_buff *, int);
> > }
> > SIZE: 24
>
> This should be a good example for the case described in patch log. But I didn't
> reproduce it on rhel7 before applying this patch, it's strange.
> ...
>       KERNEL: /usr/lib/debug/lib/modules/3.10.0-1160.24.1.el7.x86_64/vmlinux
> ...
>      RELEASE: 3.10.0-1160.24.1.el7.x86_64
>      VERSION: #1 SMP Thu Mar 25 21:21:56 UTC 2021
>      MACHINE: x86_64  (2892 Mhz)
>       MEMORY: 4 GB
>          PID: 7815
>      COMMAND: "crash"
>         TASK: ffffa10210512100  [THREAD_INFO: ffffa10189b34000]
>          CPU: 1
>        STATE: TASK_RUNNING (ACTIVE)
>
> crash> struct -o offload_callbacks
> struct offload_callbacks {
>        struct sk_buff *(*gso_segment)(struct sk_buff *, netdev_features_t);
>        struct sk_buff **(*gro_receive)(struct sk_buff **, struct sk_buff *);
>   [16] int (*gro_complete)(struct sk_buff *, int);
> }
> SIZE: 24
>
> Do you happen to know how to reproduce this issue? John Pittman.
>
> Thanks.
> Lianbo
>
> >
> > Acked-by: Kazuhito Hagio <k-hagio-ab at nec.com>
> >
> > Thanks,
> > Kazu
> >
> >> ---
> >>  symbols.c | 11 +++++++++--
> >>  1 file changed, 9 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/symbols.c b/symbols.c
> >> index a2d5c6c..5d7da6e 100644
> >> --- a/symbols.c
> >> +++ b/symbols.c
> >> @@ -8356,8 +8356,15 @@ show_member_offset(FILE *ofp, struct datatype_member *dm, char *inbuf)
> >>              }
> >>      } else if (c) {
> >>              for (i = 0; i < c; i++) {
> >> -                    if (STRNEQ(arglist[i], "(*")) {
> >> -                            target = arglist[i]+2;
> >> +                    if (strstr(inbuf, "(*")) {
> >> +                            if (STRNEQ(arglist[i], "(*"))
> >> +                                    target = arglist[i]+2;
> >> +                            else if (STRNEQ(arglist[i], "*(*"))
> >> +                                    target = arglist[i]+3;
> >> +                            else if (STRNEQ(arglist[i], "**(*"))
> >> +                                    target = arglist[i]+4;
> >> +                            else
> >> +                                    continue;
> >>                              if (!(t1 = strstr(target, ")")))
> >>                                      continue;
> >>                              *t1 = NULLCHAR;
> >> --
> >> 2.17.2
> >
>





More information about the Crash-utility mailing list