Re: [PATCH] In verify_version() don't require specific syment type values for linux_banner symbol to get it's address

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2023/09/13 9:11, David Mair wrote:
> verify_version() in kernel.c gets a struct syment for linux_banner using 
> symbol_search() and uses the value member of the result as the address 
> of linux_banner in some cases based on the type member's value in the 
> same struct syment. A small number of coredumps with an unhandled type 
> ('B' or 'b') for linux_banner result in the address of linux_banner 
> being loaded from the actual linux_banner data. This fails because the 
> first ulong of the linux_banner ASCII text is treated as a dumped kernel 
> address and attempting to access that in the core fails.
> 
> Based on a suggestion from Kazu, continue to get the struct syment for 
> linux_banner using symbol_search(). Also use get_symbol_type() for 
> linux_banner and use the result of that to decide where to get the 
> linux_banner address from, disregarding the syment type member. If 
> get_symbol_type() reports a TYPE_CODE_ARRAY (and by default with a 
> warning) use the syment value member as the linux_banner address. If 
> get_symbol_type() reports a TYPE_CODE_PTR read the address of 
> linux_banner using get_symbol_data().
> 
> The else block doesn't strictly require braced content for a single 
> switch statement but braces are included to match style of locally 
> similar cases.
> 
> Signed-off-by: David Mair <dmair@xxxxxxxx>

Thanks for the patch.  Tested ok with various vmcores on hand, and applied.

https://github.com/crash-utility/crash/commit/27f3ccd6c296099206a337c2913f370afcddf1ad

Thanks,
Kazu

> ---
> diff --git a/kernel.c b/kernel.c
> index 988206b..6dcf414 100644
> --- a/kernel.c
> +++ b/kernel.c
> @@ -1076,13 +1076,21 @@ verify_version(void)
> 
>       if (!(sp = symbol_search("linux_banner")))
>           error(FATAL, "linux_banner symbol does not exist?\n");
> -    else if ((sp->type == 'R') || (sp->type == 'r') ||
> -        (THIS_KERNEL_VERSION >= LINUX(2,6,11) && (sp->type == 'D' || 
> sp->type == 'd')) ||
> -         (machine_type("ARM") && sp->type == 'T') ||
> -         (machine_type("ARM64")))
> -        linux_banner = symbol_value("linux_banner");
> -    else
> -        get_symbol_data("linux_banner", sizeof(ulong), &linux_banner);
> +    else {
> +        switch (get_symbol_type("linux_banner", NULL, NULL))
> +        {
> +        case TYPE_CODE_ARRAY:
> +            linux_banner = sp->value;
> +            break;
> +        case TYPE_CODE_PTR:
> +            get_symbol_data("linux_banner", sizeof(ulong), &linux_banner);
> +            break;
> +        default:
> +            error(WARNING, "linux_banner is unknown type\n");
> +            linux_banner = sp->value;
> +            break;
> +        }
> +    }
> 
>       if (!IS_KVADDR(linux_banner))
>           error(WARNING, "invalid linux_banner pointer: %lx\n",
> 
> -- 
> Crash-utility mailing list
> Crash-utility@xxxxxxxxxx
> https://listman.redhat.com/mailman/listinfo/crash-utility
> Contribution Guidelines: https://github.com/crash-utility/crash/wiki
--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki




[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux