Follow @Openwall on Twitter for new release announcements and other news
[<prev] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20250811144228.GU1827@brightrain.aerifal.cx>
Date: Mon, 11 Aug 2025 10:42:29 -0400
From: Rich Felker <dalias@...c.org>
To: Thorsten Glaser <tg@...bsd.de>
Cc: musl@...ts.openwall.com
Subject: Re: Question about flexible array

On Mon, Jun 17, 2024 at 04:29:35AM +0000, Thorsten Glaser wrote:
> 樊鹏 dixit:
> 
> >The reason is a difference between gcc and g++:
> >
> >Flexible array members are not officially part of C++.
> >Flexible array members were officially standardized in C99.
> 
> >/usr/include/bits/signal.h:35:23: error: flexible array member 'mcontext_t::__extcontext' not at end of 'struct tbb::detail::r1::coroutine_type'
> 
> No, that’s not the problem here (the compiler allows that).
> 
> The problem is this, in oneTBB itself:
> 
>     struct coroutine_type {
>         coroutine_type() : my_context(), my_stack(), my_stack_size() {}
>         ucontext_t my_context;
>         void* my_stack;
>         std::size_t my_stack_size;
>     };
> 
> There’s a double problem here. One is the ordering. Changing to…
> 
>     struct coroutine_type {
>         coroutine_type() : my_context(), my_stack(), my_stack_size() {}
>         void* my_stack;
>         std::size_t my_stack_size;
>         ucontext_t my_context;
>     };
> 
> … would fix that, but I *bet* that the surrounding code allocates
> its struct coroutine_type by a fixed size and copies my_context
> by sizeof(ucontext_t), which necessarily does not include the FAM.
> 
> I’m not sure if it is even permissible for ucontext_t to contain
> a FAM; perhaps instead you need to figure out the exact or a
> maximum size and change the declaration (and the ABI, most likely)
> to that?
> 
> Otherwise, all that’s left is to forbid userspace the copying of
> ucontext_t, which probably won’t fly…

You can copy it, but there's no guarantee that the copy will be usable
for the same purposes the original was. However in this case I don't
think it matters. If they're using the ucontext for synchronous
coroutines, the vast majority of it, including all of the optional
vector state or whatever, is garbage; only the call-saved part of the
register file (equivalent to a jmp_buf) is relevant.

Rich

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.