Re: [PATCH v2 1/2] s390/kexec: check the return value of ipl_report_finish

From: Heiko Carstens
Date: Tue Nov 16 2021 - 06:17:46 EST


On Tue, Nov 16, 2021 at 11:25:56AM +0800, Baoquan He wrote:
> In function ipl_report_finish(), it could fail by memory allocation
> failure, so check the return value to handle the case.
>
> Signed-off-by: Baoquan He <bhe@xxxxxxxxxx>
> ---
> arch/s390/include/asm/ipl.h | 2 +-
> arch/s390/kernel/ipl.c | 6 ++++--
> arch/s390/kernel/machine_kexec_file.c | 5 ++++-
> 3 files changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/arch/s390/include/asm/ipl.h b/arch/s390/include/asm/ipl.h
> index 3f8ee257f9aa..864ab5d2890c 100644
> --- a/arch/s390/include/asm/ipl.h
> +++ b/arch/s390/include/asm/ipl.h
> @@ -122,7 +122,7 @@ struct ipl_report_certificate {
>
> struct kexec_buf;
> struct ipl_report *ipl_report_init(struct ipl_parameter_block *ipib);
> -void *ipl_report_finish(struct ipl_report *report);
> +int ipl_report_finish(struct ipl_report *report, void **ipl_buf);
> int ipl_report_free(struct ipl_report *report);
> int ipl_report_add_component(struct ipl_report *report, struct kexec_buf *kbuf,
> unsigned char flags, unsigned short cert);
> diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c
> index e2cc35775b99..a0af0b23148d 100644
> --- a/arch/s390/kernel/ipl.c
> +++ b/arch/s390/kernel/ipl.c
> @@ -2144,7 +2144,7 @@ struct ipl_report *ipl_report_init(struct ipl_parameter_block *ipib)
> return report;
> }
>
> -void *ipl_report_finish(struct ipl_report *report)
> +int ipl_report_finish(struct ipl_report *report, void **ipl_buf)
> {
> struct ipl_report_certificate *cert;
> struct ipl_report_component *comp;
> @@ -2195,7 +2195,9 @@ void *ipl_report_finish(struct ipl_report *report)
> }
>
> BUG_ON(ptr > buf + report->size);
> - return buf;
> + *ipl_buf = buf;
> +
> + return 0;

This does not compile:

CC arch/s390/kernel/ipl.o
arch/s390/kernel/ipl.c: In function ‘ipl_report_finish’:
arch/s390/kernel/ipl.c:2159:24: warning: returning ‘void *’ from a function with return type ‘int’ makes integer from pointer without a cast [-Wint-conversion]
2159 | return ERR_PTR(-ENOMEM);
| ^~~~~~~~~~~~~~~~

Anyway, before we are going to have more iterations I just applied the
patch below instead before applying your memory leak fix.