在 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(a)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(a)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