This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: Fwd: What can a signal handler do with SIGSTKSZ?
On Mon, Jan 14, 2019 at 6:29 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> On 14/01/2019 09:18, Szabolcs Nagy wrote:
> >
> > as far as i know aarch64 kernel calculates and reports worst
> > case stack frame size precisely, so that's probably just an
> > x86 issue.
That's good to hear. All of the architectures' signal frame
construction code should be checked and updated if necessary -- alas,
I doubt there's any good way to automate the problem, since signal
delivery is so low-level and arch-specific (but I'm not a kernel
hacker).
> > i think proposing sysconf(_SC_{MIN}SIGSTKSZ) for posix is the
> > right solution with the kernel providing an upper bound of the
> > stack frame in AT_MINSIGSTKSZ (as it already does on aarch64).
> >
> > with the current wording of the standard SIGSTKSZ and MINSIGSTKSZ
> > definition cannot be omitted when they are runtime variables,
> > so posix needs to be updated.
>
> From an implementation standpoint, how the lib would calculate _SC_SIGSTKSZ?
> Just plus constant based on _SC_MINSIGSTKSZ? If it is the idea we might go
> only with _SC_MINSIGSSTKSZ and export the value adjustment instead.
That seems fine to me.
For this new interface, the backward compatibility concerns I raised
regarding what you can do in MINSIGSTKSZ don't necessarily apply, and
it would make sense for it to be truly a minimum. I would suggest we
define "minimum" in terms of what the C standard - not POSIX - allows
you to do in a signal handler, which is almost nothing: you're
guaranteed to have enough space in sysconf(_SC_MINSIGSTKSZ) for this:
static volatile sig_atomic_t signal_flag = 0;
static void handler(int unused)
{
flag = 1;
}
and this:
static atomic_uint signal_count = 0;
static void handler (int unused)
{
atomic_fetch_add (&signal_count, 1);
}
but *not* for this:
static int sockets[MAX_SOCKETS];
static void handler (int sig)
{
for (int i = 0; i < MAX_SOCKETS; i++)
{
if (sockets[i] == -1) continue;
write (sockets[i], "\r\n500 Service shutting down
unexpectedly\r\n\r\n", 44);
close (sockets[i]);
}
signal (sig, SIG_DFL);
raise (sig);
}
or for anything for which you would need to use SA_SIGINFO, or for
recursive signal delivery.
zw