2020-05-05 19:02:19

by Lenny Szubowicz

[permalink] [raw]
Subject: [PATCH] efi/libstub/x86: Free EFI map buffer in allocate_e820()

In allocate_e820(), free the EFI map buffer that has been returned
by efi_get_memory_map(). The returned size of the EFI map buffer
is used to allocate an adequately sized e820ext buffer, if it's
needed. But the contents of that EFI map buffer is not used at all
and the local pointer to it is gone on return from allocate_e820().

Signed-off-by: Lenny Szubowicz <[email protected]>
---
drivers/firmware/efi/libstub/x86-stub.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c
index 05ccb229fb45..4efe3e7a218d 100644
--- a/drivers/firmware/efi/libstub/x86-stub.c
+++ b/drivers/firmware/efi/libstub/x86-stub.c
@@ -623,6 +623,9 @@ static efi_status_t allocate_e820(struct boot_params *params,
if (status != EFI_SUCCESS)
return status;

+ /* Allocated EFI map buf is not used here. Just need its size. */
+ efi_bs_call(free_pool, map);
+
nr_desc = buff_size / desc_size;

if (nr_desc > ARRAY_SIZE(params->e820_table)) {
--
2.18.4


2020-05-06 07:29:22

by Ard Biesheuvel

[permalink] [raw]
Subject: Re: [PATCH] efi/libstub/x86: Free EFI map buffer in allocate_e820()

On Tue, 5 May 2020 at 21:00, Lenny Szubowicz <[email protected]> wrote:
>
> In allocate_e820(), free the EFI map buffer that has been returned
> by efi_get_memory_map(). The returned size of the EFI map buffer
> is used to allocate an adequately sized e820ext buffer, if it's
> needed. But the contents of that EFI map buffer is not used at all
> and the local pointer to it is gone on return from allocate_e820().
>
> Signed-off-by: Lenny Szubowicz <[email protected]>
> ---
> drivers/firmware/efi/libstub/x86-stub.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c
> index 05ccb229fb45..4efe3e7a218d 100644
> --- a/drivers/firmware/efi/libstub/x86-stub.c
> +++ b/drivers/firmware/efi/libstub/x86-stub.c
> @@ -623,6 +623,9 @@ static efi_status_t allocate_e820(struct boot_params *params,
> if (status != EFI_SUCCESS)
> return status;
>
> + /* Allocated EFI map buf is not used here. Just need its size. */
> + efi_bs_call(free_pool, map);
> +

Wouldn't it be better to call BS->GetMemoryMap() directly here, with a
zero size for the input buffer?

> nr_desc = buff_size / desc_size;
>
> if (nr_desc > ARRAY_SIZE(params->e820_table)) {
> --
> 2.18.4
>

2020-05-07 03:23:05

by Lenny Szubowicz

[permalink] [raw]
Subject: Re: [PATCH] efi/libstub/x86: Free EFI map buffer in allocate_e820()

On 5/6/20 3:23 AM, Ard Biesheuvel wrote:
> On Tue, 5 May 2020 at 21:00, Lenny Szubowicz <[email protected]> wrote:
>>
>> In allocate_e820(), free the EFI map buffer that has been returned
>> by efi_get_memory_map(). The returned size of the EFI map buffer
>> is used to allocate an adequately sized e820ext buffer, if it's
>> needed. But the contents of that EFI map buffer is not used at all
>> and the local pointer to it is gone on return from allocate_e820().
>>
>> Signed-off-by: Lenny Szubowicz <[email protected]>
>> ---
>> drivers/firmware/efi/libstub/x86-stub.c | 3 +++
>> 1 file changed, 3 insertions(+)
>>
>> diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c
>> index 05ccb229fb45..4efe3e7a218d 100644
>> --- a/drivers/firmware/efi/libstub/x86-stub.c
>> +++ b/drivers/firmware/efi/libstub/x86-stub.c
>> @@ -623,6 +623,9 @@ static efi_status_t allocate_e820(struct boot_params *params,
>> if (status != EFI_SUCCESS)
>> return status;
>>
>> + /* Allocated EFI map buf is not used here. Just need its size. */
>> + efi_bs_call(free_pool, map);
>> +
>
> Wouldn't it be better to call BS->GetMemoryMap() directly here, with a
> zero size for the input buffer?

I agree, that's a good suggestion. V2 coming shortly after testing.

>
>> nr_desc = buff_size / desc_size;
>>
>> if (nr_desc > ARRAY_SIZE(params->e820_table)) {
>> --
>> 2.18.4
>>
>