Changeset a7fac14 for owl.c


Ignore:
Timestamp:
Jul 23, 2011, 7:30:51 PM (10 years ago)
Author:
David Benjamin <davidben@mit.edu>
Branches:
master, release-1.9
Children:
4ebbfbc, 85bb19b, d933c3ca
Parents:
f661cee
git-author:
David Benjamin <davidben@mit.edu> (07/20/11 02:03:42)
git-committer:
David Benjamin <davidben@mit.edu> (07/23/11 19:30:51)
Message:
Assign all watched signals to a dummy no-op disposition

Otherwise some (namely SIGWINCH) may have SIG_DFL = SIG_IGN. This means
that the signal is ignored if the signal thread is in the middle of
processing another signal (a race condition), and on Solaris it's not
delivered at all.

Also more consistently consider errors in setup here fatal. And rename
CHECK_RESULT to OR_DIE.

Reported-by: Benjamin Kaduk <kaduk@mit.edu>
Reviewed-by: Adam Glasgall <adam@crossproduct.net>
File:
1 edited

Legend:

Unmodified
Added
Removed
  • owl.c

    rb8a3e00 ra7fac14  
    389389}
    390390
    391 #define CHECK_RESULT(s, syscall) \
     391#define OR_DIE(s, syscall)      \
    392392  G_STMT_START {                 \
    393     if ((syscall) != 0) {        \
     393    if ((syscall) == -1) {       \
    394394      perror((s));               \
    395395      exit(1);                   \
     
    402402  sigset_t sigset;
    403403  int ret, i;
    404   const int signals[] = { SIGABRT, SIGBUS, SIGCHLD, SIGFPE, SIGHUP, SIGILL,
    405                           SIGINT, SIGQUIT, SIGSEGV, SIGTERM, SIGWINCH };
     404  const int reset_signals[] = { SIGABRT, SIGBUS, SIGCHLD, SIGFPE, SIGILL,
     405                                SIGQUIT, SIGSEGV, };
     406  /* Don't bother resetting watched ones because owl_signal_init will. */
     407  const int watch_signals[] = { SIGWINCH, SIGTERM, SIGHUP, SIGINT, };
    406408
    407409  /* Sanitize our signals; the mask and dispositions from our parent
    408410   * aren't really useful. Signal list taken from equivalent code in
    409411   * Chromium. */
    410   CHECK_RESULT("sigemptyset", sigemptyset(&sigset));
     412  OR_DIE("sigemptyset", sigemptyset(&sigset));
    411413  if ((ret = pthread_sigmask(SIG_SETMASK, &sigset, NULL)) != 0) {
    412414    errno = ret;
    413415    perror("pthread_sigmask");
    414   }
    415   for (i = 0; i < G_N_ELEMENTS(signals); i++) {
    416     CHECK_RESULT("sigaction", sigaction(signals[i], &sig_default, NULL));
     416    exit(1);
     417  }
     418  for (i = 0; i < G_N_ELEMENTS(reset_signals); i++) {
     419    OR_DIE("sigaction", sigaction(reset_signals[i], &sig_default, NULL));
    417420  }
    418421
    419422  /* Turn off SIGPIPE; we check the return value of write. */
    420   CHECK_RESULT("sigaction", sigaction(SIGPIPE, &sig_ignore, NULL));
     423  OR_DIE("sigaction", sigaction(SIGPIPE, &sig_ignore, NULL));
    421424
    422425  /* Register some signals with the signal thread. */
    423   CHECK_RESULT("sigaddset", sigaddset(&sigset, SIGWINCH));
    424   CHECK_RESULT("sigaddset", sigaddset(&sigset, SIGTERM));
    425   CHECK_RESULT("sigaddset", sigaddset(&sigset, SIGHUP));
    426   CHECK_RESULT("sigaddset", sigaddset(&sigset, SIGINT));
    427   owl_signal_init(&sigset, sig_handler, NULL);
     426  owl_signal_init(watch_signals, G_N_ELEMENTS(watch_signals),
     427                  sig_handler, NULL);
    428428}
    429429
Note: See TracChangeset for help on using the changeset viewer.