2022-06-28 15:31:48

by Schspa Shi

[permalink] [raw]
Subject: [PATCH v2] vfio: Clear the caps->buf to NULL after free

API vfio_info_cap_add will free caps->buf, clear it to NULL after
free.

Signed-off-by: Schspa Shi <[email protected]>
---
drivers/vfio/vfio.c | 1 +
1 file changed, 1 insertion(+)

diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
index 61e71c1154be..a0fb93866f61 100644
--- a/drivers/vfio/vfio.c
+++ b/drivers/vfio/vfio.c
@@ -1812,6 +1812,7 @@ struct vfio_info_cap_header *vfio_info_cap_add(struct vfio_info_cap *caps,
buf = krealloc(caps->buf, caps->size + size, GFP_KERNEL);
if (!buf) {
kfree(caps->buf);
+ caps->buf = NULL;
caps->size = 0;
return ERR_PTR(-ENOMEM);
}
--
2.24.3 (Apple Git-128)


2022-06-28 16:05:38

by Cornelia Huck

[permalink] [raw]
Subject: Re: [PATCH v2] vfio: Clear the caps->buf to NULL after free

On Tue, Jun 28 2022, Alex Williamson <[email protected]> wrote:

> On Tue, 28 Jun 2022 23:24:29 +0800
> Schspa Shi <[email protected]> wrote:
>
>> API vfio_info_cap_add will free caps->buf, clear it to NULL after
>> free.
>
> Should this be something like:
>
> On buffer resize failure, vfio_info_cap_add() will free the buffer,
> report zero for the size, and return -ENOMEM. As additional
> hardening, also clear the buffer pointer to prevent any chance of a
> double free.

I like that better. With that,

Reviewed-by: Cornelia Huck <[email protected]>

>
> Thanks,
> Alex
>
>> Signed-off-by: Schspa Shi <[email protected]>
>> ---
>> drivers/vfio/vfio.c | 1 +
>> 1 file changed, 1 insertion(+)
>>
>> diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
>> index 61e71c1154be..a0fb93866f61 100644
>> --- a/drivers/vfio/vfio.c
>> +++ b/drivers/vfio/vfio.c
>> @@ -1812,6 +1812,7 @@ struct vfio_info_cap_header *vfio_info_cap_add(struct vfio_info_cap *caps,
>> buf = krealloc(caps->buf, caps->size + size, GFP_KERNEL);
>> if (!buf) {
>> kfree(caps->buf);
>> + caps->buf = NULL;
>> caps->size = 0;
>> return ERR_PTR(-ENOMEM);
>> }

2022-06-28 16:08:30

by Alex Williamson

[permalink] [raw]
Subject: Re: [PATCH v2] vfio: Clear the caps->buf to NULL after free

On Tue, 28 Jun 2022 23:24:29 +0800
Schspa Shi <[email protected]> wrote:

> API vfio_info_cap_add will free caps->buf, clear it to NULL after
> free.

Should this be something like:

On buffer resize failure, vfio_info_cap_add() will free the buffer,
report zero for the size, and return -ENOMEM. As additional
hardening, also clear the buffer pointer to prevent any chance of a
double free.

Thanks,
Alex

> Signed-off-by: Schspa Shi <[email protected]>
> ---
> drivers/vfio/vfio.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
> index 61e71c1154be..a0fb93866f61 100644
> --- a/drivers/vfio/vfio.c
> +++ b/drivers/vfio/vfio.c
> @@ -1812,6 +1812,7 @@ struct vfio_info_cap_header *vfio_info_cap_add(struct vfio_info_cap *caps,
> buf = krealloc(caps->buf, caps->size + size, GFP_KERNEL);
> if (!buf) {
> kfree(caps->buf);
> + caps->buf = NULL;
> caps->size = 0;
> return ERR_PTR(-ENOMEM);
> }

2022-06-29 05:24:17

by Schspa Shi

[permalink] [raw]
Subject: Re: [PATCH v2] vfio: Clear the caps->buf to NULL after free


Cornelia Huck <[email protected]> writes:

> On Tue, Jun 28 2022, Alex Williamson
> <[email protected]> wrote:
>
>> On Tue, 28 Jun 2022 23:24:29 +0800
>> Schspa Shi <[email protected]> wrote:
>>
>>> API vfio_info_cap_add will free caps->buf, clear it to NULL
>>> after
>>> free.
>>
>> Should this be something like:
>>
>> On buffer resize failure, vfio_info_cap_add() will free the
>> buffer,
>> report zero for the size, and return -ENOMEM. As
>> additional
>> hardening, also clear the buffer pointer to prevent any
>> chance of a
>> double free.
>
> I like that better. With that,
>
> Reviewed-by: Cornelia Huck <[email protected]>
>

I have send a V3 patch for this comment change, please review it.

>>
>> Thanks,
>> Alex
>>
>>> Signed-off-by: Schspa Shi <[email protected]>
>>> ---
>>> drivers/vfio/vfio.c | 1 +
>>> 1 file changed, 1 insertion(+)
>>>
>>> diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
>>> index 61e71c1154be..a0fb93866f61 100644
>>> --- a/drivers/vfio/vfio.c
>>> +++ b/drivers/vfio/vfio.c
>>> @@ -1812,6 +1812,7 @@ struct vfio_info_cap_header
>>> *vfio_info_cap_add(struct vfio_info_cap *caps,
>>> buf = krealloc(caps->buf, caps->size + size, GFP_KERNEL);
>>> if (!buf) {
>>> kfree(caps->buf);
>>> + caps->buf = NULL;
>>> caps->size = 0;
>>> return ERR_PTR(-ENOMEM);
>>> }

--
BRs
Schspa Shi