This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]