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