On 2025/9/9 18:14 Gao Xiang wrote:
> On 2025/9/9 18:01, yuezhang...@sony.com wrote:
>> On 2025/9/9 15:26, Gao Xiang wrote:
>>> Hi Yuezhang,
>>>
>>> On 2025/9/9 10:52, Yuezhang Mo wrote:
>>>> This patch addresses 4 memory leaks and 1 allocation issue to
>>>> ensure proper cleanup and allocation:
>>>>
>>>> 1. Fixed memory leak by freeing sbi->zmgr in z_erofs_compress_exit().
>>>> 2. Fixed memory leak by freeing inode->chunkindexes in erofs_iput().
>>>> 3. Fixed incorrect allocation of chunk index array in
>>>>      erofs_rebuild_write_blob_index() to ensure correct array allocation
>>>>      and avoid out-of-bounds access.
>>>> 4. Fixed memory leak of struct erofs_blobchunk not being freed by
>>>>      calling erofs_blob_exit() in rebuild mode.
>>>> 5. Fix memory leak by calling erofs_put_super().
>>>>      In main(), erofs_read_superblock() is called only to get the block
>>>>      size. In erofs_mkfs_rebuild_load_trees(), erofs_read_superblock()
>>>>      is called again, causing sbi->devs to be overwritten without being
>>>>      released.
>>>>
>>>> Signed-off-by: Yuezhang Mo <yuezhang...@sony.com>
>>>> Reviewed-by: Friendy Su <friendy...@sony.com>
>>>> Reviewed-by: Daniel Palmer <daniel.pal...@sony.com>
>>>
>>> Thanks for your patch and sorry for a bit delay...
>>>
>>>> ---
>>>>    lib/compress.c | 2 ++
>>>>    lib/inode.c    | 3 +++
>>>>    lib/rebuild.c  | 2 +-
>>>>    mkfs/main.c    | 3 ++-
>>>>    4 files changed, 8 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/lib/compress.c b/lib/compress.c
>>>> index 622a205..dd537ec 100644
>>>> --- a/lib/compress.c
>>>> +++ b/lib/compress.c
>>>> @@ -2171,5 +2171,7 @@ int z_erofs_compress_exit(struct erofs_sb_info *sbi)
>>>>                }
>>>>    #endif
>>>>        }
>>>> +
>>>> +     free(sbi->zmgr);
>>>>        return 0;
>>>>    }
>>>> diff --git a/lib/inode.c b/lib/inode.c
>>>> index 7ee6b3d..0882875 100644
>>>> --- a/lib/inode.c
>>>> +++ b/lib/inode.c
>>>> @@ -159,6 +159,9 @@ unsigned int erofs_iput(struct erofs_inode *inode)
>>>>        } else {
>>>>                free(inode->i_link);
>>>>        }
>>>> +
>>>> +     if (inode->chunkindexes)
>>>> +             free(inode->chunkindexes);
>>>
>>> For now, this needs a check
>>>
>>>          if (inode->datalayout == EROFS_INODE_CHUNK_BASED)
>>>                  free(inode->chunkindexes);
>>>
>>> I admit it's not very clean, but otherwise it doesn't work
>>> since `chunkindexes` is in a union.
>>>
>>
>> Okay, I will change to this check.
>>
>>>>        free(inode);
>>>>        return 0;
>>>>    }
>>>> diff --git a/lib/rebuild.c b/lib/rebuild.c
>>>> index 0358567..18e5204 100644
>>>> --- a/lib/rebuild.c
>>>> +++ b/lib/rebuild.c
>>>> @@ -186,7 +186,7 @@ static int erofs_rebuild_write_blob_index(struct 
>>>> erofs_sb_info *dst_sb,
>>>>
>>>>        unit = sizeof(struct erofs_inode_chunk_index);
>>>>        inode->extent_isize = count * unit;
>>>> -     idx = malloc(max(sizeof(*idx), sizeof(void *)));
>>>> +     idx = calloc(count, max(sizeof(*idx), sizeof(void *)));
>>>>        if (!idx)
>>>>                return -ENOMEM;
>>>>        inode->chunkindexes = idx;
>>>> diff --git a/mkfs/main.c b/mkfs/main.c
>>>> index 28588db..bcde787 100644
>>>> --- a/mkfs/main.c
>>>> +++ b/mkfs/main.c
>>>> @@ -1702,6 +1702,7 @@ int main(int argc, char **argv)
>>>>                        goto exit;
>>>>                }
>>>>                mkfs_blkszbits = src->blkszbits;
>>>> +             erofs_put_super(src);
>>>
>>> Do you really need to fix this now (considering `mkfs.erofs`
>>> will exit finally)?
>>
>> As you said, mkfs.erofs will exit finally, it won't affect users
>> without this fix.
>>
>> The main purpose of this patch is to fix the memory allocation
>> issue in erofs_rebuild_write_blob_index(). It will cause a
>> segmentation fault if there are deduplications(If there are few
>> files, no segmentation fault occurs, but the files will be
>> inaccessible.).
>
> Yes, so I tend to not fix `erofs_put_super()` in this patch.
>
>>
>>>
>>> In priciple, I think it should be fixed with a reference and
>>> something similiar to the kernel fill_super.
>>>
>>> I'm not sure if you have more time to improve this anyway,
>>> but the current usage is not perfect on my side...
>>
>> The memory leak is caused by the erofs_sb_info of the first blob
>> device being initialized twice, how to fix with reference? I do not
>> get your point.
>
> I think we should skip erofs_read_superblock() if sbi is
> initialized at least.

I will skip erofs_read_superblock() if sbi->devs is not NULL.

>
> As for reference I meant vfs_get_super() likewise, it calls
> fill_super() if .s_root is NULL.

Reply via email to