Hi, Martin,

> On Aug 10, 2023, at 11:18 AM, Martin Uecker <muec...@gwdg.de> wrote:
> 
> Am Donnerstag, dem 10.08.2023 um 10:58 -0400 schrieb Siddhesh Poyarekar:
>> On 2023-08-10 10:47, Martin Uecker wrote:
>>> Am Donnerstag, dem 10.08.2023 um 16:42 +0200 schrieb Jakub Jelinek:
>>>> On Thu, Aug 10, 2023 at 04:38:21PM +0200, Martin Uecker wrote:
>>>>> Am Donnerstag, dem 10.08.2023 um 13:59 +0000 schrieb Qing Zhao:
>>>>>> 
>>>>>>> On Aug 10, 2023, at 2:58 AM, Martin Uecker <muec...@gwdg.de> wrote:
>>>>>>> 
>>>>>>> Am Mittwoch, dem 09.08.2023 um 20:10 +0000 schrieb Qing Zhao:
>>>>>>>> 
>>>>>>>>> On Aug 9, 2023, at 12:21 PM, Michael Matz <m...@suse.de> wrote:
>>>>>>> 
>>>>> 
>>>>>>> I am not sure for the reason given above. The following
>>>>>>> code would not work:
>>>>>>> 
>>>>>>> struct foo_flex { int a; short b; char t[]; } x;
>>>>>>> x.a = 1;
>>>>>>> struct foo_flex *p = malloc(sizeof(x) + x.a);
>>>>>>> if (!p) abort();
>>>>>>> memcpy(p, &x, sizeof(x)); // initialize struct
>>>>>>> 
>>>>>> Okay.
>>>>>> Then, the user still should use the sizeof(struct foo_flex) + N * 
>>>>>> sizeof(foo->t) for the allocation, even though this might allocate more 
>>>>>> bytes than necessary. (But this is safe)
>>>>>> 
>>>>>> Let me know if I still miss anything.
>>>>> 
>>>>> The question is not only what the user should use to
>>>>> allocate, but also what BDOS should return.  In my
>>>>> example the user uses the sizeof() + N * sizeof
>>>>> formula and the memcpy is safe, but it would be flagged
>>>>> as a buffer overrun if BDOS uses the offsetof formula.
>>>> 
>>>> BDOS/BOS (at least the 0 level) should return what is actually
>>>> allocated for the var, what size was passed to malloc and if it
>>>> is a var with flex array member with initialization what is actually the
>>>> size on the stack or in .data/.rodata etc.
>>> 
>>> Agreed.
>>> 
>>> But what about a struct with FAM with the new "counted_by" attribute
>>> if the original allocation is not visible?
>> 
>> There's precedent for this through the __access__ attribute; __bos 
>> trusts what the attribute says about the allocation.
> 
> The access attribute gives the size directly. The counted_by gives
> a length for the array which needs to be translated into a size
> via a formula. There are different formulas in use. The question 
> is which formula should bdos trust?
> 
> Whatever you pick, if this is not consistent with the actual
> allocation or use, then it will cause problems either by
> breaking code or not detecting buffer overruns.
> 
> So it needs to be consistent with what GCC allocates for a
> var with FAM and initialization and also the user needs to 
> be told what the right choice is so that he can use the right
> size for allocation and argument to memcpy / memset etc.

All agreed. Thanks a lot for raising these issues and providing helpful 
suggestions. 
I will double check on these and make sure __bos behaves correctly for 
structure with FAM.

Might come back with more questions for discussion…-:).

Thanks.

Qing
> 
> Martin

Reply via email to