Re: Trivial Fix: use palloc_array/repalloc_array for BufFile file arrays - Mailing list pgsql-hackers

From Chao Li
Subject Re: Trivial Fix: use palloc_array/repalloc_array for BufFile file arrays
Date
Msg-id C8B71441-5D80-494F-9A29-A9BF559BC8D8@gmail.com
Whole thread Raw
In response to Re: Trivial Fix: use palloc_array/repalloc_array for BufFile file arrays  (Chao Li <li.evan.chao@gmail.com>)
List pgsql-hackers

> On Mar 9, 2026, at 08:40, Chao Li <li.evan.chao@gmail.com> wrote:
>
>
>
>> On Mar 7, 2026, at 03:33, Masahiko Sawada <sawada.mshk@gmail.com> wrote:
>>
>> Hi,
>>
>> On Tue, Mar 3, 2026 at 5:31 PM Chao Li <li.evan.chao@gmail.com> wrote:
>>>
>>>
>>>
>>>> On Dec 25, 2025, at 11:34, Chao Li <li.evan.chao@gmail.com> wrote:
>>>>
>>>>
>>>>
>>>>> On Dec 25, 2025, at 11:12, Chao Li <li.evan.chao@gmail.com> wrote:
>>>>>
>>>>> Hi Hackers,
>>>>>
>>>>> I noticed this error while working on [1].
>>>>>
>>>>> In BufFile, the fields is claimed as an array:
>>>>> ```
>>>>> struct BufFile
>>>>> {
>>>>>  File *files; /* palloc'd array with numFiles entries */
>>>>> ```
>>>>>
>>>>> However, it’s allocated by palloc_object():
>>>>> ```
>>>>> file->files = palloc_object(File);
>>>>> ```
>>>>>
>>>>> And reallocated by repalloc():
>>>>> ```
>>>>>  file->files = (File *) repalloc(file->files,
>>>>>      (file->numFiles + 1) * sizeof(File));
>>>>> ```
>>>>>
>>>>> This trivial patch just changes to use palloc_array/repalloc_array, which makes the intent clearer.
>>>>>
>>>>> Best regards,
>>>>> --
>>>>> Chao Li (Evan)
>>>>> HighGo Software Co., Ltd.
>>>>> https://www.highgo.com/
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> <v1-0001-Use-palloc_array-repalloc_array-for-BufFile-file-.patch>
>>>>
>>>>
>>>> Sorry for missing the reference of [1]:
>>>>
>>>> [1] https://postgr.es/m/aUStrqoOCDRFAq1M@paquier.xyz
>>>>
>>>> Best regards,
>>>> --
>>>> Chao Li (Evan)
>>>> HighGo Software Co., Ltd.
>>>> https://www.highgo.com/
>>>>
>>>
>>> PFA v2:
>>> * Rebased
>>> * Updated the commit message
>>
>> I've reviewed the v2 patch and here is a comment:
>>
>> - file->files = palloc_object(File);
>> + file->files = palloc_array(File, 1);
>>
>> I'm not a fan of this change. This change looks like trying to
>> distinguish allocated memory by palloc_object() and palloc_array()
>> even though underlying memory is identical. I'm concerned about this
>> change creating unnecessary coding conventions.
>>
>
> Hi Masahiho-san,
>
> Thank you so much for taking the time to review this patch.
>
> Actually, this change was my original motivation for creating the patch. When I first read the code, I was confused
whythe field was named with the plural “files" even though it was allocated with palloc_object(). After reading
further,I saw that the memory is later enlarged with repalloc, so it became clear that file->files is really meant to
bean array. 
>
> To me, the allocation method should reflect the actual meaning of the object. Here, file->files is an array, no
matterhow many elements it currently contains. Even if it only has one element at the moment, semantically it is still
anarray. 
>
> By “creating unnecessary coding conventions”, are you concerned that this change might encourage people to always use
palloc_array(type,1) when allocating a single object? That concern is understandable, but I think it should depend on
thereal semantics. If the memory is for a single object, then of course palloc_array() should be wrong. 
>
> Given the nature of C, a "File *" can point either to a single File object or to a File array. In that sense,
palloc_array()makes it explicit that this pointer is intended to represent an array, while palloc_object() suggests a
singleobject. So I think changing this to palloc_array() improves readability in this case. 
>
> Best regards,
> --
> Chao Li (Evan)
> HighGo Software Co., Ltd.
> https://www.highgo.com/

Hi Masahiko-san,

Would you mind sharing any further thoughts on this?

While working further on this patch, I noticed this code in ginget.c:
```
        key->requiredEntries = palloc(1 * sizeof(GinScanEntry));
```

To me, this seems to use * 1 to make it explicit that key->requiredEntries is intended as an array, even though it
currentlycontains only one element. That feels similar to what I was trying to express with: " file->files =
palloc_array(File,1);”. But if you still feel this is not a good change, I’m happy to revert it. 

Also, while reviewing recent patches, I found a number of additional palloc/repalloc call sites that could be converted
tothe newer helpers, so I expanded the scope of this patch a bit. To avoid making it too large, I included only about
1/3of the cases I found in this version. If this patch moves forward, I’d be happy to clean up the remaining
occurrencesseparately. 

PFA v3.

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/





Attachment

pgsql-hackers by date:

Previous
From: Chengxi Sun
Date:
Subject: Re: Add uuid_to_base32hex() and base32hex_to_uuid() built-in functions
Next
From: "cca5507"
Date:
Subject: Re: [Bug Report + Patch] File descriptor leak when io_method=io_uring