Projects
Browse Source     Search     Timeline     Wiki

Changeset 23356

Show
Ignore:
Timestamp:
09/05/07 11:20:21 (15 months ago)
Author:
zarzycki@…
Message:

<rdar://problem/5461936> signal handling bugs found during code audit

SIGTERM might be ignored for a tiny window post fork() and pre execve() in the child.

SIGTERM might be ignored for a tiny window of launchd's initialization of itself.

Location:
trunk/launchd/src
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • trunk/launchd/src/launchd.c

    r23322 r23356  
    107107main(int argc, char *const *argv) 
    108108{ 
    109         static const int sigigns[] = { SIGHUP, SIGINT, SIGPIPE, SIGALRM, 
    110                 SIGTERM, SIGURG, SIGTSTP, SIGTSTP, SIGCONT, SIGTTIN, 
    111                 SIGTTOU, SIGIO, SIGXCPU, SIGXFSZ, SIGVTALRM, SIGPROF, 
    112                 SIGWINCH, SIGINFO, SIGUSR1, SIGUSR2 
    113         }; 
    114109        bool sflag = false; 
    115         size_t i; 
    116110        int ch; 
    117111 
     
    137131        launchd_runtime_init(); 
    138132 
    139         for (i = 0; i < (sizeof(sigigns) / sizeof(int)); i++) { 
    140                 launchd_assumes(signal(sigigns[i], SIG_IGN) != SIG_ERR); 
    141         } 
    142  
    143133        if (NULL == getenv("PATH")) { 
    144134                setenv("PATH", _PATH_STDPATH, 1); 
     
    153143        monitor_networking_state(); 
    154144 
    155  
    156145        if (getpid() == 1) { 
    157146                handle_pid1_crashes_separately(); 
     
    159148 
    160149        jobmgr_init(sflag); 
     150 
     151        launchd_runtime_init2(); 
    161152 
    162153        launchd_runtime(); 
  • trunk/launchd/src/launchd_core_logic.c

    r23354 r23356  
    24832483        } 
    24842484 
    2485         for (i = 1; i < NSIG; i++) { 
    2486                 signal(i, SIG_DFL); 
    2487         } 
    2488  
    24892485        if (j->quarantine_data) { 
    24902486                qtn_proc_t qp; 
  • trunk/launchd/src/launchd_runtime.c

    r23344 r23356  
    5555#include <stdbool.h> 
    5656#include <syslog.h> 
     57#include <signal.h> 
    5758#include <dlfcn.h> 
    5859 
     
    106107static void logmsg_remove(struct logmsg_s *lm); 
    107108 
     109 
     110static const int sigigns[] = { SIGHUP, SIGINT, SIGPIPE, SIGALRM, SIGTERM, 
     111        SIGURG, SIGTSTP, SIGTSTP, SIGCONT, SIGTTIN, SIGTTOU, SIGIO, SIGXCPU, 
     112        SIGXFSZ, SIGVTALRM, SIGPROF, SIGWINCH, SIGINFO, SIGUSR1, SIGUSR2 
     113}; 
     114static sigset_t sigign_set; 
     115 
    108116void 
    109117launchd_runtime_init(void) 
     
    142150        runtime_openlog(getprogname(), LOG_PID|LOG_CONS, LOG_LAUNCHD); 
    143151        runtime_setlogmask(LOG_UPTO(/* LOG_DEBUG */ LOG_NOTICE)); 
     152} 
     153 
     154void 
     155launchd_runtime_init2(void) 
     156{ 
     157        size_t i; 
     158 
     159        for (i = 0; i < (sizeof(sigigns) / sizeof(int)); i++) { 
     160                sigaddset(&sigign_set, sigigns[i]); 
     161                launchd_assumes(signal(sigigns[i], SIG_IGN) != SIG_ERR); 
     162        } 
    144163} 
    145164 
     
    584603runtime_fork(mach_port_t bsport) 
    585604{ 
     605        sigset_t emptyset, oset; 
    586606        pid_t r = -1; 
    587607        int saved_errno; 
     608        size_t i; 
     609 
     610        sigemptyset(&emptyset); 
    588611 
    589612        launchd_assumes(launchd_mport_make_send(bsport) == KERN_SUCCESS); 
     
    591614        launchd_assumes(launchd_mport_deallocate(bsport) == KERN_SUCCESS); 
    592615 
     616        launchd_assumes(sigprocmask(SIG_BLOCK, &sigign_set, &oset) != -1); 
     617        for (i = 0; i < (sizeof(sigigns) / sizeof(int)); i++) { 
     618                launchd_assumes(signal(sigigns[i], SIG_DFL) != SIG_ERR); 
     619        } 
     620 
    593621        r = fork(); 
    594  
    595622        saved_errno = errno; 
    596623 
    597624        if (r != 0) { 
     625                for (i = 0; i < (sizeof(sigigns) / sizeof(int)); i++) { 
     626                        launchd_assumes(signal(sigigns[i], SIG_IGN) != SIG_ERR); 
     627                } 
     628                launchd_assumes(sigprocmask(SIG_SETMASK, &oset, NULL) != -1); 
    598629                launchd_assumes(launchd_set_bport(MACH_PORT_NULL) == KERN_SUCCESS); 
     630        } else { 
     631                launchd_assumes(sigprocmask(SIG_SETMASK, &emptyset, NULL) != -1); 
    599632        } 
    600633 
  • trunk/launchd/src/launchd_runtime.h

    r23297 r23356  
    5858 
    5959void launchd_runtime_init(void); 
     60void launchd_runtime_init2(void); 
    6061void launchd_runtime(void) __attribute__((noreturn)); 
    6162